Игорь «Septdir» Бердичевский
Игорь «Septdir» Бердичевский
Персональный блог

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.9" type="plugin" group="system" method="upgrade">
	<name>Content - Meta Title</name>
	<author>Septdir Workshop</author>
	<creationDate>February 2021</creationDate>
	<copyright>Copyright (c) 2018 - 2020 Septdir Workshop. All rights reserved.</copyright>
	<license>https://www.gnu.org/copyleft/gpl.html GNU/GPL</license>
	<authorEmail>development@septdir.com</authorEmail>
	<authorUrl>https://www.septdir.com/</authorUrl>
	<version>0.0.1-dev</version>
	<description>Alternative meta title Plugin</description>
	<files>
		<filename plugin="metatitle">metatitle.php</filename>
		<filename>content_article.xml</filename>
	</files>
</extension>

metatitle.php

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

<?php
defined('_JEXEC') or die;

use Joomla\CMS\Application\CMSApplication;
use Joomla\CMS\Form\Form;
use Joomla\CMS\Plugin\CMSPlugin;

class plgContentMetaTitle extends CMSPlugin
{
	/**
	 * Loads the application object.
	 *
	 * @var  CMSApplication
	 *
	 * @since  __DEPLOY_VERSION__
	 */
	protected $app = null;

	/**
	 * Affects constructor behavior.
	 *
	 * @var  boolean
	 *
	 * @since  __DEPLOY_VERSION__
	 */
	protected $autoloadLanguage = true;

	/**
	 * Adds addition meta field.
	 *
	 * @param   Form   $form  The form to be altered.
	 * @param   mixed  $data  The associated data for the form.
	 *
	 * @throws  Exception
	 *
	 * @since   __DEPLOY_VERSION__
	 */
	function onContentPrepareForm($form, $data)
	{
		if ($this->app->isClient('administrator') && $form->getName() === 'com_content.article')
		{
			Form::addFormPath(__DIR__);
			$form->loadFile('content_article', false);
		}
	}
}

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

  • Это должна быть панель администратора
    $this->app->isClient('administrator')
  • Форма com_content.article
    $form->getName() === 'com_content.article'

Когда все эти три условия выполнены мы сначала подключаем папку где лежит наше поле Form::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.

if ($metaTitle = $this->item->metadata->get('title', false)) $this->document->setTitle($metaTitle);
Дата публикции: 07.07.2017
Дата обновления: 12.02.2021

Copyright © Игорь «Septdir» Бердичевский 2013-2021
Development by Septdir Workshop