Web
Analytics
Skip to content

Concrete5

на русском языке

Создание Express объектов программно

Заметка: Эта документация для concrete5 8.1.0 или выше.

До сих пор, когда мы работали с Express объектами мы фокусировались на их создании через панель администратора, и продолжали их использовать, когда они уже были созданы. Это очень популярный способ, поскольку самым большим преимуществом объектов Express, что их легко создавать без навыков программирования. Тем не менее, если вы создаете плагины для  concrete5 и хотели бы добавить Express объект, как часть этого плагина, вам может понадобится создать объект программно. Вот как это делается. 

Необходимые условия для плагина

Заметка: эта документация подразумевает, что вы будете добавлять  Express объект в плагин через метод  install(). Если вы не знакомы с созданием плагинов для concrete5  почитайте сначала эту документацию.

Строитель Express Объектов

Сначала, вам нужно вызвать строителя объектов Express Object Builder. Это можно сделать импортируя фасад  Express в контроллер плагина controller.php файл:

use Express;

Затем, вызывайте Express::buildObject() с подходящими параметрами:

  1. Идентификатор объекта (Object Handle)
  2. Множественное число идентификатора объекта (Object Plural Handle)
  3. Название объекта
  4. Объект плагина.

Допустим, мы собираемся программно создать объект Гавань из предыдущего примера. Наш методinstall() будет выглядеть так:

public function install()
{
    $pkg = parent::install();
    $object = Express::buildObject('marina', 'marinas', 'Marina', $pkg);
}

На этом этапе, $object это экземпляр объекта  Concrete\Core\Express\ObjectBuildeОн пока не сохранен. Перед сохранением, вам может понадобится добавить атрибуты и связи. 

Добавление атрибутов объекта

Давайте добавим название и адрес объекту Гавань:

$object->addAttribute('text', 'Название', 'marina_name');
$object->addAttribute('address', 'Адрес', 'marina_address');

В этом примере, мы добавим два пользовательских атрибута - название и адрес. Тип атрибута это первый параметр, название - это второй параметр, и идентификатор - третий. Дополнительный четвёртый параметр это настройки объекта в соответствии с классом  Concrete\Core\Entity\Attribute\Key\Settings\Settings объекта этого типа. Это позоволит настроить некоторые детали определённых типов атрибутов. Например, мы хотим, чтобы наш атрибут адресс поддерживал только "США" и "Великобританию" в качестве допустимых стран (потому что только там расположены наши гавани.) Вот как мы можем это сделать:

$settings = new \Concrete\Core\Entity\Attribute\Key\Settings\AddressSettings();
$settings->setCustomCountries(array("US","UK"));
$settings->setHasCustomCountries(true);
$settings->setDefaultCountry("UK");
$object->addAttribute('address', 'Адресс', 'marina_address', $settings);

Вот и всё! Теперь у нас есть пользовательский атрибут с пользовательскими настройками.

Сохранение объекта

Когда мы создали объект и добавили атрибуты, просто сохраните его.

$object = $object->save();

Сохранение результатов строителя объектов будет выражаться в возврате этого объекта Concrete\Core\Entity\Express\Entity. Также будут созданы все атрибуты. 

Добавление связей к объекту

Вы можете добавить связи похожим образом. Давайте свяжем объект Гавань с объектом Лодка. У объекта Гавань есть много лодок:

$marina = Express::buildObject('marina', 'marinas', 'Гавань', $pkg);
$boat = Express::buildObject('boat', 'boats', 'Лодка', $pkg);

$builder = $marina->buildAssociation();
$builder->addOneToMany($boat);
$boat = $builder->save();
$marina = $marina->getEntity();

Теперь у вас есть следующие объекты $boat и $marina, объект Гавань создаёт связь Один-ко-Многим по отношению к объекту Лодка, и объект Лодка создаёт связь Много-к-одному по отношению к Гавани. Так как мы создали пользовательское название переменной, то связь Один-ко-Многим называем  'boats' и Много-к-Одному 'marina'.

Вы можете создать более экзотичные связи. В этом примере мы создали express объекты Навык, Проект и Разработчик и связали их следующим способом:

$project = Express::buildObject('project', 'projects', 'Проект');
$skill = Express::buildObject('skill', 'skills', 'Навык');
$developer = Express::buildObject('developer', 'developers', 'Разработчик');

$project->buildAssociation()->addManyToMany($skill)->save();
$skill->buildAssociation()->addOneToOne($developer, 'best_developer')->save();

Проекты и навыки связаны Много-ко-Многим, с дополнительной связью Один-к-Одному от объекта Навык к объекту Разработчик.

Создание формы для Express объекта

Довольно легко программно создать Express формы для ваших объектов. Здесь мы создали один Express объект, несколько атрибутов, и создали форму и группы полей, связанных с этой формой:

$student = Express::buildObject('student', 'students', 'Студент', $pkg);
$student->addAttribute('text', 'Имя', 'first_name');
$student->addAttribute('text', 'Фамилия', 'last_name');
$student->addAttribute('textarea', 'Биография', 'bio');
$student->save();

$form = $student->buildForm('Form');
$form->addFieldset('Общие данные')
    ->addAttributeKeyControl('first_name')
    ->addAttributeKeyControl('last_name')
    ->addTextControl('', 'Здесь просто объясняющий текст.')
    ->addAttributeKeyControl('bio');
$form = $form->save();

Вот и всё!

Загрузка беседы
Новые статьи
  • 01 июля 2014
    Concrete5 это великолепная система управления контентом (CMS), позволяющая создавать сайты как на конструкторе сайтов, но с функциональностью,…
  • 20 сентября 2017
    Как вычленить из строки только кириллические буквы и пробелы или только латинские буквы, цифры и пробелы.
  • 20 сентября 2017
    При парсинге с помощью плагина SimpleHtmlDom, можно фильтровать по атрибутам, но как сделать фильтрацию по data-src и аналогичным?