Добавление пользовательских полей в основные компоненты Joomla с помощью плагина

  1. Добавление пользовательских полей в основные компоненты Joomla с помощью плагина
  2. Добавление пользовательского поля Joomla
    1. Включение редактирования пользовательских полей в интерфейсе пользователя Joomla
  3. Отображение пользовательского поля Joomla


Добавление пользовательских полей в основные компоненты Joomla с помощью плагина.

Вы когда-нибудь хотели, чтобы в com_contact было дополнительное поле номера телефона или вам требовалось дополнительное поле для статей в com_content в CMS Joomla?

И это предусмотрено! Joomla предоставляет простой способ интеграции новых полей с основными компонентами, такими как указанные выше и им подобными. Все, что требуется для достижения этой цели, - это простой плагин контента и переопределение макета в вашем шаблоне.

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

Добавление пользовательского поля Joomla.

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

Чтобы добавить поле в системный компонент, вам необходимо создать плагин контента, который подхватывает событие onContentPrepareForm и вставляет свои собственные поля в данную JForm. Следующий код предназначен для Joomla 3.1 и более поздних версий.

<?php
// нет прямого доступа
defined ('_JEXEC') or die;
class plgContentExample extends JPlugin
{
	/**
	 * Загрузите языковой файл при создании экземпляра.
	 * Обратите внимание, что это доступно только в Joomla 3.1 и выше.
	 * Если нужна поддержка версии 3.0, нужно переопределить конструктор
	 *
	 * @var boolean
	 * @since <ваша версия>
	 */
	protected $autoloadLanguage = true;

	/**
	 * Подготовьте форму и добавьте своё поле.
	 *
	 * @param   JForm  $form  Форма, подлежащая изменению.
	 * @param   mixed  $data  Связанные данные для формы.
	 *
	 * @return  boolean
	 *
	 * @since   <ваша версия>
	 */
	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;
	}
}
?>

Включение редактирования пользовательских полей в интерфейсе пользователя Joomla.

Включить редактирование в интерфейсе фронтенда сайта для ваших новых настраиваемых полей довольно просто. Чтобы добавить поля в форму редактирования содержимого интерфейса, просто добавьте этот блок кода:

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 // Проверка, является ли это существующим item или нет ?>
<?php if ($this->item->id) : ?>
  <?php // Если это существующий item, получите часть атрибутов существующей записи ?>
  <?php $attribs = json_decode($this->item->attribs); ?>
  <?php // Установка значения пользовательского поля с сохранёнными данными. ?>
  <?php // Дублируйте необходимое количество полей, изменяя имя поля по мере необходимости. ?>
  <?php echo $this->form->setValue('field_name', 'attribs', $attribs->field_name); ?>
<?php endif; ?>
<?php // Эту строку необходимо добавить в файл прямо там, где вы хотите ее отобразить. Итак, если вы хотите, чтобы оно отображалось сразу после поля описания, найдите поле описания и поместите его сразу после него. Дублируйте необходимое количество полей, изменяя имя поля по мере необходимости. ?>
<?php // Теперь мы отобразим поле. Если мы редактируем существующий item, ранее сохраненные данные уже будут заполнены ?>
<?php echo $this->form->renderField('field_name', 'attribs'); ?>

После этого ваши поля теперь появятся и будут сохранены с помощью редактирования интерфейса фронтенда.

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

Примечание: В com_content ваше поле должно быть названо "<fields name="attribs">", в противном случае поля появятся на сайте администратора, но значения не будут сохранены.

В этом случае мы добавляем поле для имени адресата contact_emaillabel2, описывающей поле электронной почты для отображения на сайте, и второе поле для значения адреса электронной почты contact_email2.

<?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>

Наконец, нам нужен языковой файл, чтобы параметры были красиво представлены в админке Joomla и могли быть переведены на разные языки. Этот файл должен называться как-то вроде 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_contact. Если вы установите этот плагин, у вас появится дополнительная вкладка в форме редактирования контактов под названием "Дополнительная информация" (Additional Information) с включенными новыми полями. Если вы заполните поля "Новая метка" (Additional email label) и "Адрес электронной почты" (Additional email address) для контакта, вы увидите, что com_contact сохранит и извлечет информацию для вас.

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

Отображение пользовательского поля Joomla.

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

Если вы добавите этот код и установите свой шаблон, теперь на вашем сайте будут отображаться пользовательские поля.

Перевод с английского официальной документации Joomla:
https://docs.joomla.org/Adding_custom_fields_to_core_components_using_a_plugin

Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)

Старт! Горячий старт на просторы интернета
Старт! Горячий старт на просторы интернета
Старт! Меню