Добавление в компонент Joomla 4 представления во фронтенд

Хотя наш компонент для Joomla 4 разделен на части "бэкенд" (для админки) и "фронтенд" (для сайта), процесс добавления представления очень похож в обоих случаях. Как и в базовом представлении, которое мы сделали в предыдущей статье, нам потребуется контроллер, представление и шаблон.

Для начала давайте сначала создадим новые файлы для страницы сайта. Как и прежде, исходный код каждого файла можно найти в разделе «Содержимое файлов компонента для Joomla 4.x» ниже.

  1. Новый файл: site/src/Controller/DisplayController.php
    • Контроллер MVC по умолчанию для фронтенда (сайта)
  2. Новый файл: site/src/View/Hello/HtmlView.php
    • Объект представления MVC для новой страницы "Hello"
  3. Новый файл: site/tmpl/hello/default.php
    • Шаблон для новой страницы "Hello"
  4. Обновление в файле: helloworld.xml
    • Необходимо добавить новые файлы в манифест компонента Joomla 4

Содержимое файлов компонента для Joomla 4.x

site/src/Controller/DisplayController.php

Контроллер MVC по умолчанию для фронтенда (сайта). У нас есть некоторый базовый код для извлечения и визуализации представления, но, как и прежде, мы в основном делегируем родительский класс Joomla 4. Поскольку это класс PHP, он создаётся под вашим корнем пространства имен PHP для фронтенда site в папке src/, в пространстве имен Controller.

<?php

namespace JohnSmith\Component\HelloWorld\Site\Controller;

defined('_JEXEC') or die;

use Joomla\CMS\MVC\Controller\BaseController;
use Joomla\CMS\Factory;

/**
 * @package     Joomla.Site
 * @subpackage  com_helloworld
 *
 * @copyright   Copyright (C) 2021 John Smith. All rights reserved.
 * @license     GNU General Public License version 3; see LICENSE
 */

/**
 * Контроллер компонента HelloWorld
 * @since  0.0.2
 */
class DisplayController extends BaseController {
    
    public function display($cachable = false, $urlparams = array()) {        
        $document = Factory::getDocument();
        $viewName = $this->input->getCmd('view', 'login');
        $viewFormat = $document->getType();
        
        $view = $this->getView($viewName, $viewFormat);
        
        $view->document = $document;
        $view->display();
    }
    
}

site/src/View/Hello/HtmlView.php

Представление MVC для страницы "Hello World". Как и прежде, это представление просто наследует родительский объект, чтобы начать работу. Поскольку это класс PHP, он хранится в подпапке src/ папки site, в пространстве имен View/Hello, которое соответствует имени представления.

<?php

namespace JohnSmith\Component\HelloWorld\Site\View\Hello;

defined('_JEXEC') or die;

use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView;

/**
 * @package     Joomla.Site
 * @subpackage  com_helloworld
 *
 * @copyright   Copyright (C) 2021 John Smith. All rights reserved.
 * @license     GNU General Public License version 3; see LICENSE
 */

/**
 * Просмотр формы проверки подлинности пользователя
 */
class HtmlView extends BaseHtmlView {
    

    /**
     * Display the view
     *
     * @param   string  $template  Имя файла макета для шаблона.
     * @return  void
     */
    public function display($template = null) {
        // Вызов родительского отображения для отображения файла макета
        parent::display($template);
    }

}

site/tmpl/hello/default.php

Шаблон страницы для нашей новой страницы "Hello World" для фронтенда (сайта). Это идентично шаблону, который мы использовали в административной части, чтобы начать работу. Как шаблон, он находится в подпапке tmpl в папке site, соответствующей имени представления.

<?php

/**
 * @package     Joomla.Administrator
 * @subpackage  com_helloworld
 *
 * @copyright   Copyright (C) 2021 John Smith. All rights reserved.
 * @license     GNU General Public License version 3; see LICENSE
 */

 // Не дать прямого доступа к выполнению PHP-кода в файле
defined('_JEXEC') or die('Но пасаран! =)');
?>
<h2>Hello world!</h2>

helloworld.xml

Наконец, давайте обновим манифест компонента helloworld.xml, чтобы включить в него новые файлы. Нам нужно сообщить Joomla 4, что новые файлы существуют, чтобы он скопировал их на место. Мы также обновим номер версии расширения в манифесте - прямо сейчас это не имеет реального эффекта, но в будущем изменение номера версии будет иметь большее значение, поэтому это хорошая привычка.

<?xml version="1.0" encoding="utf-8"?>
<extension type="component" method="upgrade">
<!-- атрибут 'version' для тега расширения больше не используется -->
 
    <name>Hello World</name>
    <!-- Следующие элементы являются необязательными и не содержат ограничений на форматирование -->
    <creationDate>May 2021</creationDate>
    <!-- Фиктивный автор, не стесняйтесь заменять его в любом месте, где вы его видите -->
    <author>John Smith</author>
    <authorUrl>https://mb4.ru</authorUrl>
    <copyright>Пётр Васечкин</copyright>
    <license>GPL v3</license>
    <!-- Строка 'version' записывается в таблицу компонентов -->
    <version>0.0.2</version>
    <!-- Описание является необязательным и по умолчанию используется имя сомпонента -->
    <description>
        A hello world component!
    </description>
 
    <!-- Это пространство имен PHP, в котором организован
    код расширения. Он должен следовать этому формату:
    
    Vendor\Component\ComponentName
 
    "Vendor" может быть названией компании или вашим собственным именем
    
    Раздел "ComponentName" ДОЛЖЕН соответствовать имени, используемому 
    везде для вашего компонента. Каким бы ни было имя этого XML-файла, 
    пространство имен должно совпадать (заглавные/прописные буквы не учитываются). 
    -->
    <namespace path="src/">JohnSmith\Component\HelloWorld</namespace>

    <files folder="site/">
        <folder>src</folder>
        <folder>tmpl</folder>
    </files>
            
    <administration>
        <!-- Ссылка, которая появится в меню админки Joomla "Components" -->
        <menu link="index.php?option=com_helloworld">Hello World</menu>
        <!-- Список файлов и папок для копирования.
             Обратите внимание на атрибут "folder".
             Это имя папки в пакете компонентов для копирования в CMS Joomla 4. -->
        <files folder="admin/">
            <folder>services</folder>
            <folder>src</folder>
            <folder>tmpl</folder>
        </files>
    </administration>
 
</extension>

Обратите внимания на строки:

  • стр.14 — обновление версии компонента Joomla 4
  • стр.33..36 — новые папки с новыми файлами компонента Joomla 4

Обновление расширения Joomla 4

Чтобы проверить изменения в вашем расширении, сначала вам нужно будет заархивировать папку com_helloworld и установить ее так же, как вы делали это раньше. Мы пройдем этот процесс шаг за шагом еще раз:

  1. Используя свой веб-браузер, перейдите в панель администратора Joomla 4 вашего сайта. Адрес будет <домен>/administrator/. Например: https://mb4.ru/administrator/
  2. В левом меню админки Joomla 4 нажмите на ссылку "System" (Система).
  3. Там в поле "Install" (Установка) кликните по ссылке "Extensions" (Расширения).
  4. На вкладке "Upload Package File" (Загрузить файл пакета) найдите и выберите только что созданный новый zip-файл с вашего компьютера.

Как только ваша новая версия компонента будет установлена, снова нажмите ссылку "System" (Система) в главном меню, а затем выберите "Extensions" (Расширения) в поле "Manage" (Управление) на этот раз. Должен появиться список установленных расширений Joomla 4. Введите hello в строку поиска в правом верхнем углу и нажмите кнопку поиска. Вы должны увидеть свое расширение "Hello World", которое теперь указано как версия 0.0.2:

Обновление расширения Joomla 4

Тестирование новой страницы

На новой странице еще нет ссылки в меню (мы добавим её в следующей статье), поэтому для ее тестирования нам нужно будет использовать прямой URL-адрес. Перейдите по адресу: <joomla>/index.php?option=com_helloworld&view=hello (не внутри пути /administrator), и вы увидите, как появится ваша новая страница сайта "Hello World":

Тестирование новой страницы компонента Joomla 4

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