Добавление настраиваемых полей / Внедрение в ваш компонент
Внедрение полей в компонент
В этой статье описывается, как применить базовую реализацию функции настраиваемых полей к настраиваемому компоненту.
Всегда хотели показать дополнительные атрибуты в ваших товарах? Через настраиваемые поля у вас есть бесшовно интегрированный способ показать их в бэкэнд и интерфейс вашего сайта.
Расширение настраиваемых полей помещается в ядро и может использоваться аналогично расширению категорий. В основном есть всего 2 файла, которые вам нужно расширить, с помощью следующего кода для базовой бэкэнд-части.
Заметка! В примере кода мы будем использовать для вашего компонента имя com_example
.
Бэкэнд-часть
Как добавить поля в бэкэнд-списки
Подобно com_categories есть всего несколько строк, необходимых для добавления полей в бэкэнд-представление. Просто добавьте следующие строки в метод addSubmenu
в helper класс компонента.
Используемый контекст должен соответствовать контексту, в котором вы хотите реализовать поля. Пример контекста может быть com_content.article
или com_weblinks.weblink
. Мы используем com_example.item
здесь в качестве примера. Все, кроме параметра контекста, необходимо изменить.
if (JComponentHelper::isEnabled('com_fields')) { JHtmlSidebar::addEntry( JText::_('JGLOBAL_FIELDS'), 'index.php?option=com_fields&context=com_example.item', $vName == 'fields.fields' ); JHtmlSidebar::addEntry( JText::_('JGLOBAL_FIELD_GROUPS'), 'index.php?option=com_fields&view=groups&context=com_example.item', $vName == 'fields.groups' ); }
Внедрение ACL
Теперь необходимо выполнить часть ACL. Вы должны добавить следующие строки в ваш файл access xml непосредственно перед закрытием </access>
в этом файле. Здесь они определены и позволят вашим пользователям выбирать параметры ACL в вашей реализации com_fields.
<section name="fieldgroup"> <action name="core.create" title="JACTION_CREATE" description="COM_FIELDS_GROUP_PERMISSION_CREATE_DESC" /> <action name="core.delete" title="JACTION_DELETE" description="COM_FIELDS_GROUP_PERMISSION_DELETE_DESC" /> <action name="core.edit" title="JACTION_EDIT" description="COM_FIELDS_GROUP_PERMISSION_EDIT_DESC" /> <action name="core.edit.state" title="JACTION_EDITSTATE" description="COM_FIELDS_GROUP_PERMISSION_EDITSTATE_DESC" /> <action name="core.edit.own" title="JACTION_EDITOWN" description="COM_FIELDS_GROUP_PERMISSION_EDITOWN_DESC" /> <action name="core.edit.value" title="JACTION_EDITVALUE" description="COM_FIELDS_GROUP_PERMISSION_EDITVALUE_DESC" /> </section> <section name="field"> <action name="core.delete" title="JACTION_DELETE" description="COM_FIELDS_FIELD_PERMISSION_DELETE_DESC" /> <action name="core.edit" title="JACTION_EDIT" description="COM_FIELDS_FIELD_PERMISSION_EDIT_DESC" /> <action name="core.edit.state" title="JACTION_EDITSTATE" description="COM_FIELDS_FIELD_PERMISSION_EDITSTATE_DESC" /> <action name="core.edit.value" title="JACTION_EDITVALUE" description="COM_FIELDS_FIELD_PERMISSION_EDITVALUE_DESC" /> </section>
В этом файле есть еще одна настройка:
<action name="core.edit.value" title="JACTION_EDITVALUE" description="JACTION_EDITVALUE_COMPONENT_DESC" />
Эта запись должна быть сделана в соответствии с обычными настройками вашего компонента (а также в файле access xml), поскольку он позволяет пользователям в группе изменять любое значение настраиваемых полей, представленных в вашем компоненте.
Результат
Если вы выполнили эти шаги, будет выполнена ваша базовая часть для реализации полей. Теперь пользователи могут создавать поля и назначать их элементу.
Фронтальная часть
Теперь перейдем к интерфейсной части. Это легко, поскольку поля отображаются, через события Plugin/Events/Content фронтальной части. Чтобы отображать поля на фронтальной части, вам необходимо реализовать события плагина контента в своем компоненте.
Важно здесь, где вы передаете тот же контекст, который вы использовали в бэкэнд для событий.
См:
После того как событие onContentPrepare
запущено с контекстом, вы можете найти прикрепленные поля в свойстве $item-> jcfields
, если хотите визуализировать поля, используемые в ваших макетах/представлениях.
Советы, хитрости и скрытые функции
Здесь вы можете найти несколько советов и подсказок о том, что может быть не так с вашей реализацией, а также некоторые скрытые функции com_fields.
Вкладка полей не отображается в окне редактирования моего компонента
В некоторых компонентах представления редактирования в бэкэнд и/или в фронтальной части жестко запрограммированы и не могут быть изменены/расширены с использованием плагинов. Но поскольку поля используют плагин для добавления полей к вашему компоненту, вам необходимо поддерживать это, чтобы поддерживать поля. Вы можете убедиться, что поля отображаются, например. Реализовав следующий макет в представлении редактирования компонента:
<?php $this->ignore_fieldsets = array('general', 'info', 'detail', 'jmetadata', 'item_associations'); ?> <?php echo JLayoutHelper::render('joomla.edit.params', $this); ?>
Первая строка гарантирует, что мы игнорируем (в конечном счете, жестко закодированные поля), а затем визуализируем вкладку динамических полей, используя макет joomla.edit.params
.
Классы общедоступных помощников и API
Класс FieldsHelper имеет некоторые общедоступные функции API для работы с полями.
JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php'); $fields = FieldsHelper::getFields('com_example.item', $item, true);
Сама модель поля позволяет получать и сохранять значение поля.
JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_fields/models', 'FieldsModel'); $fieldModel = JModelLegacy::getInstance('Field', 'FieldsModel', array('ignore_request' => true)); $fieldModel->setValue($fieldId, 'com_example.item', $item->id, ‘demo value’);
Поддержка ACL
- Каждое поле имеет уровень доступа
- Каждое поле имеет новое разрешение. edit.value
JFactory::getUser()->authorise('edit.value', ‘com_example.item.field.' . (int) $field->id);
Больше информации
- https://www.youtube.com/watch?v=7ikOaOKyo6s | JAB16 - Пользовательские поля в Joomla для разработчиков - English
- https://www.youtube.com/watch?v=F_Ni15icn1U | JD16AT - Пользовательские поля с Joomla 3.7 - English
- https://joomla.digital-peak.com/images/blog/JDD16%20Custom%20fields%20in%20Joomla%20for%20developers.pdf