JohnCMS
9.4
9.4
  • Введение
  • Начало работы
    • Установка и системные требования
    • Настройка
    • Структура файлов/папок
  • Общие сведения
    • Проблемы и их решение
    • Конфигурационные файлы (configs)
    • Шаблоны электронных сообщений (email)
    • Отправка электронной почты (email)
    • Работа с уведомлениями
    • Работа с запросом (Request)
    • Валидация
      • NotEmpty - Не пустое значение
      • StringLength - длина строки
      • LessThan - Менее чем
      • EmailAddress - Проверка email адреса
      • ModelExists - Проверка существования записи в БД
      • ModelNotExists - Проверка отсутствия записи в БД
      • Csrf - Проверка токена
      • Flood - проверка на флуд
      • Ban - Проверка банов
      • Captcha - Проверка защитного кода
  • Шаблоны
    • Структура стандартного шаблона
    • Изменение стилей шаблона
    • Создание собственного шаблона
  • Модули
    • Структура модуля
    • Создание модуля
    • Маршрутизация (роутинг)
  • Мультиязычность
    • Перевод JohnCMS на другие языки
    • Исправление ошибок в переводе
  • База данных
    • Настройки подключения к базе данных
    • Выполнение запросов к базе данных
    • Вставка записей (insert)
    • Обновление записей (update)
    • Удаление записей (delete)
  • Eloquent ORM
    • Общие сведения и начало работы
  • Пользователи
    • Поля (свойства) пользователей
    • Работа с пользователями в примерах
    • Работа с текущим авторизованным пользователем
Powered by GitBook
On this page
  • Регистрация модуля
  • Создание контроллера
  • Полный код файла контроллера
  • Создание шаблона
  • Добавление маршрута

Was this helpful?

Export as PDF
  1. Модули

Создание модуля

PreviousСтруктура модуляNextМаршрутизация (роутинг)

Last updated 4 years ago

Was this helpful?

Давайте создадим свой первый простой модуль. Это будет обычная простая страница контактов для связи с администрацией сайта.

Как нам уже известно, модули располагаются в папке modules

Сначала давайте создадим папку с модулем и назовем её contacts путь к папке получится такой: modules/contacts

Пока создадим простой модуль без мультиязычности.

Внутри папки modules/contacts создадим подпапку templates для шаблона нашей страницы. Так же создадим папку Controllers для контроллеров. После выполнения этих действий у вас должна получиться такая структура:

Дополнительные папки нам больше не понадобятся.

Начиная с JohnCMS 9.4 появилась возможность использовать контроллеры. Контроллеры позволяют избавиться от большого количества базового кода, который необходимо написать для начала работы, а так же позволяют упростить настройку маршрутов и не писать самостоятельно логику по определению страницы, которую необходимо показать пользователю.

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

  1. Для работы автозагрузки классов модуль должен быть зарегистрирован в системе. Как это сделать рассмотрим ниже.

Регистрация модуля

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

Создайте в папке config/autoload файл с именем modules.local.php и следующим содержимым

/config/autoload/modules.local.php
<?php

return [
    'modules' => [
        'installed_modules' => [
            'contacts', // Название папки с модулем
        ],
    ],
];

В данном случае contacts это название папки с модулем. При добавлении дополнительных модулей просто добавьте их названия по аналогии с этим именем. После выполнения этих действий классы вашего модуля будут загружаться автоматически если их пространство имен это название папки с вашим модулем с заглавной буквы.

В нашем случае пространством имен будет Contacts

Создание контроллера

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

Контроллеры модуля должны наследовать Johncms\Controller\BaseController

Давайте наконец создадим наш контроллер. Создадим файл ContactsController.php со следующим содержимым:

modules/contacts/Controllers/ContactsController.php
<?php

namespace Contacts\Controllers;

use Johncms\Controller\BaseController;

class ContactsController extends BaseController
{
    public function index()
    {
    }
}

Это минимальный набор кода, который понадобится для работы.

Далее давайте пошагово дополним наш контроллер и разберемся с тем кодом, который добавляем.

Для автоматической базовой настройки шаблонизатора и загрузки файлов локализации нам понадобится добавить свойство $module_name с названием папки модуля (в нашем случае contacts).

protected $module_name = 'contacts';

Теперь нам нужно дополнить метод index.

Далее давайте установим заголовок страницы в тегах title и h1. Для этого в шаблонизатор нужно добавить 2 переменные с именем title и page_title. Делается это следующим образом:

// Устанавливаем заголовок страницы в теге title и h1
$this->render->addData(
    [
        'title'      => 'Контакты',
        'page_title' => 'Наши контакты',
    ]
);

Далее нам нужно добавить нашу страницу в цепочку навигации.

$this->nav_chain->add('Контакты', '/contacts/');

Теперь нам нужно подготовить данные для шаблона. Давайте просто наполним один массив нашими контактами и передадим его в шаблон

// Собираем массив данных, который будет передан в шаблон
$data = [
    'contacts' => [
        [
            'name'  => 'E-mail', // Название контакта
            'value' => 'admin@example.com', // Значение, которое будет отображаться
        ],
        [
            'name'  => 'Номер телефона',
            'value' => '+7 (999) 121-12-21',
        ],
        [
            'name'  => 'Telegram',
            'value' => '@johncms_official',
        ],
    ],
];

return $this->render->render('contacts::index', ['data' => $data]);

Обратите внимание на последнюю строку. Шаблонизатор так же имеет свое пространство имен для шаблонов. Оно автоматически регистрируется в базовом контроллере и является названием папки с модулем. В нашем случае contacts это название нашего модуля, а index это название файла шаблона из папки templates. Вторым параметром ['data' => $data] передается массив данных, которые будут доступны в шаблоне. Ключи этого массива будут использоваться как названия переменных, а значения в качестве значений. В данном примере в шаблоне у нас будет доступна переменная data и она будет содержать массив с контактными данными.

Полный код файла контроллера

modules/contacts/Controllers/ContactsController.php
<?php

namespace Contacts\Controllers;

use Johncms\Controller\BaseController;

class ContactsController extends BaseController
{
    protected $module_name = 'contacts';

    public function index()
    {
        // Устанавливаем заголовок страницы в теге title и h1
        $this->render->addData(
            [
                'title'      => 'Контакты',
                'page_title' => 'Наши контакты',
            ]
        );

        // Добавляем страницу в цепочку навигации
        $this->nav_chain->add('Контакты', '/contacts/');

        // Собираем массив данных, который будет передан в шаблон
        $data = [
            'contacts' => [
                [
                    'name'  => 'E-mail', // Название контакта
                    'value' => 'admin@example.com', // Значение, которое будет отображаться
                ],
                [
                    'name'  => 'Номер телефона',
                    'value' => '+7 (999) 121-12-21',
                ],
                [
                    'name'  => 'Telegram',
                    'value' => '@johncms_official',
                ],
            ],
        ];

        return $this->render->render('contacts::index', ['data' => $data]);
    }
}

Создание шаблона

Далее давайте создадим наш шаблон. Шаблон будет располагаться в папке templates и т.к. это основная страница контактов, назовем шаблон index.phtml

modules/contacts/templates/index.phtml
<?php
// Подключаем основной шаблон сайта
$this->layout('system::layout/default');
?>

<div>
    Вы можете связаться с нами по любому из нижеперечисленных контактов:
</div>

<ul>
    <!-- Тут мы перебираем наш массив контактов и выводим название контакта и значение, разделяя их двоеточием -->
    <?php foreach ($data['contacts'] as $contact): ?>
        <li><?= $contact['name'] ?>: <b><?= $contact['value'] ?></b></li>
    <?php endforeach; ?>
</ul>

Добавление маршрута

Наш модуль готов, но пока ещё не доступен в браузере. Давайте это исправим. Чтобы модуль стал доступен, нужно сообщить системе, что у нас есть такой модуль и мы хотим чтобы он был доступен по определенному адресу. Для этого давайте перейдем в папку config и в ней создадим файл routes.local.php если его ещё нет. Если есть, то откроем его и добавим маршрут для нашего модуля.

<?php

/**
 * /contacts/ - Это адрес страницы по которому будет доступен наш модуль
 *
 * [\Contacts\Controllers\ContactsController::class, 'index']
 * Первое значение это класс контроллера, а второй название метода контроллера
 */
$map->addRoute(['GET', 'POST'], '/contacts[/]', [\Contacts\Controllers\ContactsController::class, 'index']);

Теперь наш модуль доступен по адресу ваш.сайт/contacts/

Теперь давайте сообщим модулю online, что у нас появился модуль контактов и нужно в списке пользователей онлайн отображать тех, кто смотрит контакты. Для этого давайте перейдем в папку config и в ней создадим файл places.local.php если его ещё нет.

<?php

return [
    '/contacts' => '<a href="/contacts/">Смотрит контакты</a>',
];

Отлично, наш модуль теперь полностью работоспособен, вам останется только добавить на него ссылку в основном шаблоне или на любой другой странице на ваше усмотрение.

Классы модуля должны располагаться в папке с модулем, а должно быть именем папки модуля с заглавной буквы. Разрешено использовать любые директории в папке с модулем для логического разделения классов.

Исходя из типовой классы контроллеров должны располагаться в папке Controllers Эта папка будет пространством имен для контроллеров. С учетом того, что модуль имеет пространство имен Contacts а папка Controllers расположена в модуле, то пространство имен для нашего контроллера будет такое: Contacts\Controllers

пространство имен
структуры модуля
Структура папок модуля для JohnCMS
Внешний вид итоговой страницы модуля контактов