Внедрение полей в компонент

В этой статье описывается, как применить базовую реализацию функции настраиваемых полей к настраиваемому компоненту.
  Всегда хотели показать дополнительные атрибуты в ваших товарах? Через настраиваемые поля у вас есть бесшовно интегрированный способ показать их в бэкэнд и интерфейс вашего сайта.
Расширение настраиваемых полей помещается в ядро и может использоваться аналогично расширению категорий. В основном есть всего 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);

Больше информации