Добавляем произвольные поля в компоненты ядра с помощью плагина

From Joomla! Documentation

This page is a translated version of the page Adding custom fields to core components using a plugin and the translation is 95% complete.

Outdated translations are marked like this.
Other languages:
বাংলা • ‎català • ‎Deutsch • ‎English • ‎español • ‎فارسی • ‎français • ‎हिन्दी • ‎Nederlands • ‎português do Brasil • ‎русский

Вы когда-нибудь желали, чтобы в компоненте com_content ядра [системы Joomla] присутствовало дополнительное поле для [ввода] номера телефона или Вам когда-нибудь было нужно дополнительное поле для материалов компонента com_content? Joomla предоставляет простой и удобный путь для интегрирования таких новых полей в компоненты ядра. Простой плагин содержимого и переопределение макета Вашего шаблона - это все что требуется для достижения [такого интегрирования].

Эта статья показывает как добавить дополнительное поле в компоненте ядра на примере добавления дополнительного адреса электронной почты в контакты внутри компонента com_contact. Если Вам нужно добавить произвольные поля в материалы [компонента] com_content, просто измените в ниже следующем коде все упоминания "contact" на "content". Также учтите, что компонент com_content использует свойство "attribs", а не "params" для значений полей, так же, как и для переопределения.

Создание произвольного поля

Для ознакомления с тем, как создать и установить какой-либо не рассмотренный здесь плагин, рекомендуется сначала прочитать Создание плагина для Joomla.

Для того, чтобы добавить какое-либо поле в какой-либо системный компонент, Вам нужно создать плагин содержимого, который подхватывает событие onContentPrepareForm и вставляет свои собственные поля в нужный [класс] JForm. Нижеследующий код предназначен только для Joomla 3.1 и следующих за ней версий.

<?php
// no direct access
defined ('_JEXEC') or die;
class plgContentExample extends JPlugin
{
	/**
	 * Load the language file on instantiation.
	 * Note this is only available in Joomla 3.1 and higher.
	 * If you want to support 3.0 series you must override the constructor
	 *
	 * @var boolean
	 * @since <your version>
	 */
	protected $autoloadLanguage = true;

	/**
	 * Prepare form and add my field.
	 *
	 * @param   JForm  $form  The form to be altered.
	 * @param   mixed  $data  The associated data for the form.
	 *
	 * @return  boolean
	 *
	 * @since   <your version>
	 */
	function onContentPrepareForm($form, $data)
	{
		$app    = JFactory::getApplication();
		$option = $app->input->get('option');

		switch($option)
		{
			case 'com_contact' :
				if ($app->isClient('administrator'))
				{
					JForm::addFormPath(__DIR__ . '/forms');
					$form->loadFile('contact', false);
				}

				return true;
		}

		return true;
	}
}
?>

Включение редактирования произвольных полей с лицевой части [веб-сайта]

Включить редактирование Ваших новых произвольных полей довольно легко. Для того, чтобы добавить данное поле в конкретную форму редактирования содержимого с лицевой части [веб-сайта], просто добавьте следующий фрагмент кода:

case 'com_contact':
	if ($app->isClient('site'))
	{
		JForm::addFormPath(__DIR__ . '/forms');
		$form->loadFile('contact', false);
	}
	return true;

Добавьте его непосредственно снизу от уже существующего.

Как только Вы это выполнили, создайте в файле edit.php переопределение шаблона для веб-формы содержимого. Если Вы создаете набор произвольных полей для [компонента] com_contact, то Вам необходимо скопировать components/com_contact/views/form/tmpl/edit.php в /templates/your-template-name/html/com_contact/form/edit.php.

Внутри Вашего переопределения макета добавьте в вер-форму новые поля [туда], где по-Вашему они должны быть показаны (например, под заголовком [или] под описанием), удостоверяясь в том, что названия полей соответствуют XML файлу Вашего плагина (следующим Вы создадите его).

<?php // Checking if this is an existing item or not ?>
<?php if ($this->item->id) : ?>
  <?php // If it is an existing item, get the attribs part of the existing record ?>
  <?php $attribs = json_decode($this->item->attribs); ?>
  <?php // Set the value of the custom field to what is already saved. ?>
  <?php // Duplicate for the number of fields you need, changing the field_name as needed. ?>
  <?php echo $this->form->setValue('field_name', 'attribs', $attribs->field_name); ?>
<?php endif; ?>
<?php // This line needs added to the file right where you want to display it. So, if you want it to show right after the description field, find the description field and place this right after it. Duplicate for the number of fields you need, changing the field_name as needed. ?>
<?php // Now we display the field. If we are editing an existing item, the previously saved data will be populated already ?>
<?php echo $this->form->renderField('field_name', 'attribs'); ?>

Как только это выполнено, Ваши [новые] поля теперь появятся и будут сохранены через лицевую [веб-страницу] редактирования [содержимого].

Дополнительные поля загружаются из файла /forms/contact.xml, [находящегося] в директории плагина. Важно чтобы эти поля находились в элементе поля с названием свойства, установленным на "params". Если Вы не установите это название свойства, то [Ваши новые ] поля появятся в административной [панели] сайта, но их значения не будут сохраняться.

В этом случае мы добавляем поле для ярлыка для описания на публичном веб-сайте поля адреса электронной почты и второе поле - для значения [самого] адреса электронной почты,

<?xml version="1.0" encoding="UTF-8"?>
<form>
	<fields name="params">
		<fieldset name="params" label="PLG_CONTENT_EXAMPLE_FIELDSET_LABEL">
			<field
				name="contact_emaillabel2"
				type="text"
				label="PLG_CONTENT_EXAMPLE_CONTACT_EMAILLABEL2"
			/>
			<field
				name="contact_email2"
				type="text"
				label="PLG_CONTENT_EXAMPLE_CONTACT_EMAIL2"
				filter="email"
			/>
		</fieldset>
	</fields>
</form>

В заключении, нам необходим языковый файл, чтобы эти параметры были представлены в административной панели эстетично и чтобы их можно было переводить на другие языки. Это файл должен иметь название по образцу en-GB.plg_content_example.ini.

PLG_CONTENT_EXAMPLE_FIELDSET_LABEL="Additional Information"
PLG_CONTENT_EXAMPLE_CONTACT_EMAIL2="Additional email address"
PLG_CONTENT_EXAMPLE_CONTACT_EMAILLABEL2="Additional email label"

Вот и все, [что необходимо выполнить] для создания [дополнительного] поля в [компоненте] com_content. Если Вы установите этот плагин, то в веб-форме редактирования контакта Вы получите дополнительную вкладку с названием Additional Information, включающую эти дополнительные поля. Если Вы введете данные в эти новые поля описания и адреса электронной почты контакта, то Вы увидите, что [компонент] com_contact будет сохранять и извлекать эти данные.

Этот же самый плагин может быть использован для добавления полей в другие компоненты: просто добавьте соответствующий код в функцию onContentPrepareForm и создайте соответствующие XML файлы веб-формы.

Показ произвольного поля

Для показа произвольного поля Вам необходимо создать в Вашем шаблоне переопределение макета для соответствующего компонента. Для более подробного ознакомления с созданием шаблонов смотрите вики Создание начального шаблона для Joomla!. Для более подробного ознакомления с переопределением макетов смотрите Понимание переопределения вывода данных.

Скопируйте файл <Joomla>/components/com_contact/views/contact/tmpl/default.php в <template>/html/com_contact/contact/default.php, при необходимости создав эту папку. Мы собираемся изменить этот файл для включения дополнительной информации. Компонент com_contact автоматически загрузит эти дополнительные поля для нас и загрузит их в переменную под названием $this->params. Все, что нам нажно сделать, так это проверить, установленны ли эти данные и, если это так, то показать их.

Для показа этого поля, найдите в [файле]<template>/html/com_contact/contact/default.php место, которое соответствует [месту] в котором Вы желаете показать эти дополнительные поля, и добавьте следующий код:

<?php if ($this->params->get('contact_emaillabel2', false)) : ?>
	<div>
		<span class="contact-additionalemail"><?php echo $this->params->get('contact_emaillabel2'); ?>:&emsp;<a href="mailto:<?php echo $this->params->get('contact_email2'); ?>"><?php echo $this->params->get('contact_email2'); ?></a><br/></span>
	</div>
<?php endif; ?>

Если Вы добавите этот код и установите свой шаблон, то теперь на лицевой части Вашего веб-сайте у Вас будут показаны эти дополнительные поля.