Информация

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
  • На самом деле нет событий плагина, конфигурация выполняется по соглашению

 

Никаких мыслей по поводу “Пользовательские поля в Joomla 3.7 для разработчиков”