JohnCMS
Search…
Создание модуля
Давайте создадим свой первый простой модуль. Это будет обычная простая страница контактов для связи с администрацией сайта.
Как нам уже известно, модули располагаются в папке modules
Сначала давайте создадим папку с модулем и назовем её contacts путь к папке получится такой: modules/contacts
Пока создадим простой модуль без мультиязычности.
Внутри папки modules/contacts создадим подпапку templates для шаблона нашей страницы. Так же создадим папку Controllers для контроллеров. После выполнения этих действий у вас должна получиться такая структура:
Структура папок модуля для JohnCMS
Дополнительные папки нам больше не понадобятся.
Начиная с JohnCMS 9.4 появилась возможность использовать контроллеры. Контроллеры позволяют избавиться от большого количества базового кода, который необходимо написать для начала работы, а так же позволяют упростить настройку маршрутов и не писать самостоятельно логику по определению страницы, которую необходимо показать пользователю.
Контроллеры являются обычными php классами которые наследуют системный класс контроллера. В JohnCMS используется автозагрузка классов модулей. Чтобы она работала, нужно придерживаться некоторых правил:
  1. 1.
    Классы модуля должны располагаться в папке с модулем, а пространство имен должно быть именем папки модуля с заглавной буквы. Разрешено использовать любые директории в папке с модулем для логического разделения классов.
  2. 2.
    Для работы автозагрузки классов модуль должен быть зарегистрирован в системе. Как это сделать рассмотрим ниже.

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

Для работы автозагрузки классов модули необходимо регистрировать в системе. Делается это с помощью конфигурационного файла.
Создайте в папке config/autoload файл с именем modules.local.php и следующим содержимым
/config/autoload/modules.local.php
1
<?php
2
3
return [
4
'modules' => [
5
'installed_modules' => [
6
'contacts', // Название папки с модулем
7
],
8
],
9
];
10
Copied!
В данном случае contacts это название папки с модулем. При добавлении дополнительных модулей просто добавьте их названия по аналогии с этим именем. После выполнения этих действий классы вашего модуля будут загружаться автоматически если их пространство имен это название папки с вашим модулем с заглавной буквы.
В нашем случае пространством имен будет Contacts

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

Создадим наш первый контроллер, который будет отвечать за отображение страницы контактов.
Исходя из типовой структуры модуля классы контроллеров должны располагаться в папке Controllers Эта папка будет пространством имен для контроллеров. С учетом того, что модуль имеет пространство имен Contacts а папка Controllers расположена в модуле, то пространство имен для нашего контроллера будет такое: Contacts\Controllers
Контроллеры модуля должны наследовать Johncms\Controller\BaseController
Давайте наконец создадим наш контроллер. Создадим файл ContactsController.php со следующим содержимым:
modules/contacts/Controllers/ContactsController.php
1
<?php
2
3
namespace Contacts\Controllers;
4
5
use Johncms\Controller\BaseController;
6
7
class ContactsController extends BaseController
8
{
9
public function index()
10
{
11
}
12
}
Copied!
Это минимальный набор кода, который понадобится для работы.
Далее давайте пошагово дополним наш контроллер и разберемся с тем кодом, который добавляем.
Для автоматической базовой настройки шаблонизатора и загрузки файлов локализации нам понадобится добавить свойство $module_name с названием папки модуля (в нашем случае contacts).
1
protected $module_name = 'contacts';
Copied!
Теперь нам нужно дополнить метод index.
Далее давайте установим заголовок страницы в тегах title и h1. Для этого в шаблонизатор нужно добавить 2 переменные с именем title и page_title. Делается это следующим образом:
1
// Устанавливаем заголовок страницы в теге title и h1
2
$this->render->addData(
3
[
4
'title' => 'Контакты',
5
'page_title' => 'Наши контакты',
6
]
7
);
Copied!
Далее нам нужно добавить нашу страницу в цепочку навигации.
1
$this->nav_chain->add('Контакты', '/contacts/');
Copied!
Теперь нам нужно подготовить данные для шаблона. Давайте просто наполним один массив нашими контактами и передадим его в шаблон
1
// Собираем массив данных, который будет передан в шаблон
2
$data = [
3
'contacts' => [
4
[
5
'name' => 'E-mail', // Название контакта
6
'value' => '[email protected]', // Значение, которое будет отображаться
7
],
8
[
9
'name' => 'Номер телефона',
10
'value' => '+7 (999) 121-12-21',
11
],
12
[
13
'name' => 'Telegram',
14
'value' => '@johncms_official',
15
],
16
],
17
];
18
19
return $this->render->render('contacts::index', ['data' => $data]);
Copied!
Обратите внимание на последнюю строку. Шаблонизатор так же имеет свое пространство имен для шаблонов. Оно автоматически регистрируется в базовом контроллере и является названием папки с модулем. В нашем случае contacts это название нашего модуля, а index это название файла шаблона из папки templates. Вторым параметром ['data' => $data] передается массив данных, которые будут доступны в шаблоне. Ключи этого массива будут использоваться как названия переменных, а значения в качестве значений. В данном примере в шаблоне у нас будет доступна переменная data и она будет содержать массив с контактными данными.

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

modules/contacts/Controllers/ContactsController.php
1
<?php
2
3
namespace Contacts\Controllers;
4
5
use Johncms\Controller\BaseController;
6
7
class ContactsController extends BaseController
8
{
9
protected $module_name = 'contacts';
10
11
public function index()
12
{
13
// Устанавливаем заголовок страницы в теге title и h1
14
$this->render->addData(
15
[
16
'title' => 'Контакты',
17
'page_title' => 'Наши контакты',
18
]
19
);
20
21
// Добавляем страницу в цепочку навигации
22
$this->nav_chain->add('Контакты', '/contacts/');
23
24
// Собираем массив данных, который будет передан в шаблон
25
$data = [
26
'contacts' => [
27
[
28
'name' => 'E-mail', // Название контакта
29
'value' => '[email protected]', // Значение, которое будет отображаться
30
],
31
[
32
'name' => 'Номер телефона',
33
'value' => '+7 (999) 121-12-21',
34
],
35
[
36
'name' => 'Telegram',
37
'value' => '@johncms_official',
38
],
39
],
40
];
41
42
return $this->render->render('contacts::index', ['data' => $data]);
43
}
44
}
45
Copied!

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

Далее давайте создадим наш шаблон. Шаблон будет располагаться в папке templates и т.к. это основная страница контактов, назовем шаблон index.phtml
modules/contacts/templates/index.phtml
1
<?php
2
// Подключаем основной шаблон сайта
3
$this->layout('system::layout/default');
4
?>
5
6
<div>
7
Вы можете связаться с нами по любому из нижеперечисленных контактов:
8
</div>
9
10
<ul>
11
<!-- Тут мы перебираем наш массив контактов и выводим название контакта и значение, разделяя их двоеточием -->
12
<?php foreach ($data['contacts'] as $contact): ?>
13
<li><?= $contact['name'] ?>: <b><?= $contact['value'] ?></b></li>
14
<?php endforeach; ?>
15
</ul>
Copied!

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

Наш модуль готов, но пока ещё не доступен в браузере. Давайте это исправим. Чтобы модуль стал доступен, нужно сообщить системе, что у нас есть такой модуль и мы хотим чтобы он был доступен по определенному адресу. Для этого давайте перейдем в папку config и в ней создадим файл routes.local.php если его ещё нет. Если есть, то откроем его и добавим маршрут для нашего модуля.
1
<?php
2
3
/**
4
* /contacts/ - Это адрес страницы по которому будет доступен наш модуль
5
*
6
* [\Contacts\Controllers\ContactsController::class, 'index']
7
* Первое значение это класс контроллера, а второй название метода контроллера
8
*/
9
$map->addRoute(['GET', 'POST'], '/contacts[/]', [\Contacts\Controllers\ContactsController::class, 'index']);
Copied!
Теперь наш модуль доступен по адресу ваш.сайт/contacts/
Внешний вид итоговой страницы модуля контактов
Теперь давайте сообщим модулю online, что у нас появился модуль контактов и нужно в списке пользователей онлайн отображать тех, кто смотрит контакты. Для этого давайте перейдем в папку config и в ней создадим файл places.local.php если его ещё нет.
1
<?php
2
3
return [
4
'/contacts' => '<a href="/contacts/">Смотрит контакты</a>',
5
];
Copied!
Отлично, наш модуль теперь полностью работоспособен, вам останется только добавить на него ссылку в основном шаблоне или на любой другой странице на ваше усмотрение.
Last modified 8mo ago