Joomla - добавление своих полей в формы

Joomla - добавление своих полей в формы

Наверное, каждый из разработчиков сайтов на joomla худобы раз сталкивался с задачей добавить свое поле в стандартный компонент. Ну, например, в последние время меня не раз просили добавить возможность добавить альтернативный в статьи. Так что в этой статье убьем двух зайцев одним выстрелом

Лирика

Хотя такую задачу как вывести другой заголовок в title можно решить и создав пункт меню, это не всегда удобно, особенно когда у вас количество материалов переваливает за 50 то по просто это слишком трудозатратно. Поэтому я решил написать плагин для этого дела. А заодно и написать статью о том, как же добавлять поля в компоненты Joomla, не лазая при этом в ядро.

Создание плагина

Описывать и разжевывать весь процесс создания плагинов для Joomla я не буду. Поэтому сейчас будет много кода и мало разъяснений. Итак, нам для того чтобы добавлять свои поля в компоненты Jooma нам подойдёт область system или content

Подготовка файлов

Так как плагин у нас простой много файлов не понадобиться. Создаем 4 файла.
  1. metatitle.xml
  2. metatitle.php
  3. content_article.xml (этот файл понадобиться чтобы добавить поле)
  4. index.html (файл заглушка)

metatitle.xml

Файл манифеста, тут хранятся все данные и настройки плагина.

<?xml version="1.0" encoding="utf-8"?>
<extension version="3.5" type="plugin" group="content" method="upgrade">
	<name>Content - Meta Title</name>
	<version>1.1</version>
	<creationDate>July 2017</creationDate>
	<author>Igor Berdichevskiy</author>
	<copyright>Copyright (c) 2013 - 2017 Igor Berdicheskiy. All rights reserved.</copyright>
	<authorEmail>septdir@gmail.com</authorEmail>
	<authorUrl>https://septdir.ru</authorUrl>
	<license>http://www.gnu.org/copyleft/gpl.html GNU/GPL</license>
	<description>Alternative meta title Plugin</description>
	<files>
		<filename plugin="metatitle">metatitle.php</filename>
		<filename>index.html</filename>
		<filename>content_article.xml</filename>
	</files>
	<config>
		<fields name="params">
			<fieldset name="basic">

			</fieldset>
		</fields>
	</config>
</extension>

metatitle.php

Основной исполняемый файл плагина. О нем будет немного подробнее

<?php
/**
 * @package    Content - Meta Title
 * @version    1.1.0
 * @author     Igor Berdicheskiy - septdir.ru
 * @copyright  Copyright (c) 2013 - 2017 Igor Berdicheskiy. All rights reserved.
 * @license    GNU/GPL license: http://www.gnu.org/copyleft/gpl.html
 * @link       https://septdir.ru
 */
defined('_JEXEC') or die('Restricted access');


class plgContentMetaTitle extends JPlugin
{
	/**
	 * Constructor
	 *
	 * @param  object &$subject The object to observe
	 * @param  array  $config   An optional associative array of configuration settings.
	 *
	 *
	 * @since   1.5
	 */
	public function __construct(&$subject, $config = array())
	{

		parent::__construct($subject, $config = array());
	}

	/**
	 * Adds addition metafield
	 *
	 * @param  JForm $form The form to be altered.
	 * @param  mixed $data The associated data for the form.
	 *
	 * @return  boolean
	 *
	 * @since   1.0
	 */
	function onContentPrepareForm($form, $data)
	{
		$app       = JFactory::getApplication();
		$component = $app->input->get('option');
		if ($app->isAdmin() && $component == 'com_content' && $app->input->get('layout') == 'edit')
		{
		JForm::addFormPath(__DIR__);
		$form->loadFile('content_article', false);

		}

	return true;
	}
}

Чтобы исполнить задуманное? а именно добавить поле мы воспользуемся событием onContentPrepareForm В самой же функции нам надо прописать условия, когда именно подключить выполнять действие. В нашем случае условия следящие

  • Это должна быть панель администратора
    JFactory::getApplication()->isAdmin()
  • Компонент com_content
    JFactory::getApplication()->input->get('option') == 'com_content'
  • И макет edit
    JFactory::getApplication()->input->get('layout') == 'edit'

Когда все эти три условия выполнены мы сначала подключаем папку где лежит наше поле JForm::addFormPath(__DIR__);.
А затем запускаем функцию $form->loadFile('content_article', false);

content_article.xml

Третий и последний из основных файлов нашего плагина. Файл содержит в себе само добавляемое поле.

<?xml version="1.0" encoding="UTF-8"?>
<form>
	<fields name="metadata">
		<fieldset name="jmetadata">
			<field name="title" type="text"
				   label="Alternative Title"/>
		</fieldset>
	</fields>
</form>

Установка плагина

Запаковываем архив. Устанавливаем и не забываем опубликовать.
В итоге результат должен быть следующим

Скачать пример

Из-за особенностей движка, а именно порядка подключения и исполнения файлов, самым разумным, чтобы не делать лишний запрос будет просто вставить следящий код в начало переопределенного макета com_content / article.

$metaTitle = $this->item->metadata->get('title', '');
if (!empty($metaTitle)) {
	JFactory::getDocument()->setTitle($metaTitle);
}