Создание Express объектов программно
Заметка: Эта документация для concrete5 8.1.0 или выше.
До сих пор, когда мы работали с Express объектами мы фокусировались на их создании через панель администратора, и продолжали их использовать, когда они уже были созданы. Это очень популярный способ, поскольку самым большим преимуществом объектов Express, что их легко создавать без навыков программирования. Тем не менее, если вы создаете плагины для concrete5 и хотели бы добавить Express объект, как часть этого плагина, вам может понадобится создать объект программно. Вот как это делается.
Необходимые условия для плагина
Заметка: эта документация подразумевает, что вы будете добавлять Express объект в плагин через метод install()
. Если вы не знакомы с созданием плагинов для concrete5 почитайте сначала эту документацию.
Строитель Express Объектов
Сначала, вам нужно вызвать строителя объектов Express Object Builder. Это можно сделать импортируя фасад Express в контроллер плагина controller.php файл:
use Express;
Затем, вызывайте Express::buildObject()
с подходящими параметрами:
- Идентификатор объекта (Object Handle)
- Множественное число идентификатора объекта (Object Plural Handle)
- Название объекта
- Объект плагина.
Допустим, мы собираемся программно создать объект Гавань из предыдущего примера. Наш метод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();
Вот и всё!