Персональный блог

Хотя такую задачу как вывести другой заголовок в title можно решить и создав пункт меню, это не всегда удобно, особенно когда у вас количество материалов переваливает за 50 то по просто это слишком трудозатратно. Поэтому я решил написать плагин для этого дела. А заодно и написать статью о том, как же добавлять поля в компоненты Joomla, не лазая при этом в ядро.
Описывать и разжевывать весь процесс создания плагинов для Joomla я не буду. Поэтому сейчас будет много кода и мало разъяснений. Итак, нам для того чтобы добавлять свои поля в компоненты Jooma нам подойдёт область system или content
Файл манифеста, тут хранятся все данные и настройки плагина.
<?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>
Основной исполняемый файл плагина. О нем будет немного подробнее
<?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 В самой же функции нам надо прописать условия, когда именно подключить выполнять действие. В нашем случае условия следящие
Когда все эти три условия выполнены мы сначала подключаем папку где лежит наше поле
Form::addFormPath(__DIR__);.
А затем используем метод $form->loadFile('content_article', false);
Третий и последний из основных файлов нашего плагина. Файл содержит в себе само добавляемое поле.
<?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);