Пользовательские поля в Joomla 3.7 для разработчиков
- Информация
- Концепция
- Перспектива конечного пользователя
- Перспектива разработчика
- Дальнейшие переспективы разработчика
- Как интегрировать
- Скрытые функции
- Группа плагинов Fields
Информация
com_fields базируется на DPFields https://joomla.digital-peak.com/products/dpfields
Репозиторий разработки Com_fields (ЗАКРЫТО) https://github.com/joomla-projects/custom-fields
Окончательная версия может быть найдена в PR 11833 в ветке 3.7
Концепция
- Это компонент и системный плагин
- Он интегрируется через события Joomla
- Он расширяет JForm
- Он использует JFormFields
- Он использует MVC схему
- Он работает как com_categories, это не автономный компонент
- Он использует JLayouts
Он заполняет пробел между декларацией XML в administrator/components/com_content/models/forms/article.xml и JForm
<fleld name="title" type="text" label="JGLOBAL_TITLE" description="JFIELD_TITLE_DESC" class="input-xxlarge input-large-text" size="40" required="true" /> <field name="alias" type="text" label="JFIELD_ALIAS_LABEL" description="JFIELD_ALIAS_DESC" hint="JFIELD_ALIAS_PLACEHOLDER" size="40" />
Перспектива конечного пользователя
Пункт бокового меню
Создание поля
Редактировать статью (элемент вашего компонента)
Вид спереди
Перспектива разработчика
Пункт бокового меню
Записи боковой панели добавляются в ваш класс хелпер через JHtmlSidebar
JHtmlSidebar::addEntry( JText::_('JGLOBAL_FIELDS'), 'index.php?option=com_fields&context=com_content.article', $vName == 'fields.article' ); JHtmlSidebar::addEntry( JText::_('JGLOBAL_FIE LD_CATEGORIES'), 'index.php?option=com_categories&extension=com_content.article.fields', $vName == 'categories.article' );
administrator/components/com_content/helpers/content.php
Создание поля
Редактирование поля выполняется в com_fields, как и любой другой обычный компонент J3
administrator/components/com_fields
Редактировать статью (элемент вашего компонента)
Когда элемент загружается, через событие onContentPrepareForm поля добавляются в форму
$node = $parent->appendChild(new DOMElement('field')); $node->setAttribute('name', $field->alias); $node->setAttribute('type', $field->type); $node->setAttribute('default', $field->default_value); $node->setAttribute('label', $field->label); $node->setAttribute('description', $field->description); $node->setAttribute('class', $field->class); $node->setAttribute('required', $field->required ? 'true' : 'false'); $node->setAttribute('readonly', $field->params->get('readonly', 0) ? 'true': 'false');
// Загрузка строки полей xml в форму $form->load($xml->saveXML());
plugins/system/fields/fields.php
Редактировать статью (элемент вашего компонента) 2
Когда элемент сохраняется, через событие onContentAfterSave сохранятся поля
// Установка значения для поля и элемента $model->setFieldValue($field->id, $context, $id, $fields[$field->alias]);
plugins/system/fields/fields.php
Вид спереди
Когда элемент отображается, через события Plugin/Events/Content поля отображаются на передней панели
public function onContentAfterTitle($context, $item, $params, $limitstart = 0) { return $this->display($context, $item, $params, 1); } public function onContentBeforeDisplay($context, $item, $params, $limitstart = 0) { return $this->display($context, $item, $params, 2); } public function onContentAfterDisplay($context, $item, $params, $limitstart = 0) { return $this->display($context, $item, $params, 3); }
plugins/system/fields/fields.php
Дальнейшие переспективы разработчика
- События плагина для интеграции в другие компоненты
- Компонент Com_fields для управления полями
- Макеты для подготовки значения и отображения поля
Как интегрировать
- Это все о контексте
- Имя формы - это контекст.
- Событие сохранения контекста
- Событие рендеринга контекста
- Загрузка параметров поля, все о них
- Поля добавляются к элементу как массив полей
- Для базового поиска необходимо включить content плагин plg_search_content.Умный поиск автоматически поддерживается.
Как интегрировать: Мои собственные поля
- Поле должно реализовать JFormDomfieldinterface и расширить JFormField
- Параметры поля (например, ширина эскиза) как форма в ../parameters/foo.xml
<?xml version="2.0" encoding="utf-8"?> <form> <fields name="fieldparams" label="JLIB_FORM_FIELD_PARAM_BASIC_LABEL"> <fieldset name="fieldparams"> <field name="multiple" type="radio" class="btn-group btn-group-yesno" default="0" label="JLIB_FORMFIELD_PARAM_LIST_MULTIPLE_LABEL" description="JLIB_FORM_FIELD_PARAM_LIST_MULTIPLE_DESC" > <option value="2">JYES</option> <option value="0">JNO</option> </field> </fieldset> </fields> </form>
- Если вывод поля на морде требует некоторой специальной функциональности, создайте макет в components/com_foo/layouts/field/prepare/foo.php
Скрытые функции
Рендеринг: Подготовка значения
Значение поля готовится с помощью следующих шагов
Рендеринг: Подготовка вывода
Вывод для событий отображения готовится за пару шагов
Несколько контекстов
Если ваш компонент имеет несколько контекстов, например, Контакты имеют контакты и поля формы электронной почты, добавьте файл формы фильтра в administrator/com_foo/models/forms/filter_fields.xml
<?xml version="I.0" encoding="utf-8"?> <form> <fields name="custom"> <fieldset name="custom"> <field name="section" type="section" default="com_contact"> <option value="com contact.contact">COM_CONTACT</option> <option value="com contact.mail">C0M_CONTACT.MAIL</option> </field> </fieldset> </fields> </form>
Классы общедоступных помощников и API
Класс FieldsHelper имеет некоторые общедоступные функции API для работы с полями.
JLoader::register("FieldsHelper", JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php'); $fields = FieldsHelper::getFields(‘com_foo.bar’, $item, true);
Сама модель поля позволяет получать и сохранять значение поля.
JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_fields/models', 'FieldsModel'); $fieldModel = JModelLegacy::getInstance('Field', 'FieldsModel', array('ignore_request' => true)); $fieldModel->setValue($fieldId, ‘com_foo.bar’, $item->id, ‘demo value’);
Поддержка ACL
Каждое поле имеет уровень доступа.
Каждое поле имеет новое разрешение. Edit.value
JFactory :: getUser () -> authorize ('edit.value', 'com_foo.bar.field.'. (Int) $ field-> id);
Группа плагинов Fields
- Новый плагин группы fields
- Каждый плагин должен иметь папку fields с JFormFields
- Шаблоны должны быть помещены в папку field/prepare
- На самом деле нет событий плагина, конфигурация выполняется по соглашению