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

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

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

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

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

Внутри папки **modules/contacts** создадим подпапку **templates** для шаблона нашей страницы.\
Дополнительные папки нам больше не понадобятся т.к. модуль у нас будет содержать всего лишь одну страницу.\
Создадим точку входа в модуль, которая будет открываться при запросе страницы контактов и в которой будет подключен наш шаблон. Для этого создадим файл **index.php**

В этом файле поместим следующий код:

```php
<?php

// Запрещаем прямой запрос к файлу модуля без подключенного ядра
defined('_IN_JOHNCMS') || die('Error: restricted access');

// Инициализируем шаблонизатор
$view = di(Johncms\System\View\Render::class);

// Инициализируем хлебные крошки (цепочка навигации вверху всех страниц)
$nav_chain = di(Johncms\NavChain::class);

// Указываем шаблонизатору папку, из которой нужно загружать шаблоны нашего модуля
$view->addFolder('contacts', __DIR__ . '/templates/');

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

// Собираем массив данных, который будет передан в шаблон
$data = [
    'title'      => 'Контакты',
    'page_title' => 'Наши контакты',
];

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

// Подключаем шаблон index.phtml и передаем в него собранные выше данные
echo $view->render('contacts::index', ['data' => $data]);
```

В комментариях к каждой строке кода даны пояснения для чего она.

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

```php
<?php

// Подключаем основной шаблон сайта
$this->layout(
    'system::layout/default',
    [
        'title'      => $data['title'], // Передаем заголовок страницы в тег title
        'page_title' => $data['page_title'], // Передаем заголовок страницы в тег h1
    ]
);
?>

<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
<?php

/**
 * /contacts/ - Это адрес страницы по которому будет доступен наш модуль
 * modules/contacts/index.php - Это путь к точке входа в наш модуль
 */
$map->addRoute(['GET', 'POST'], '/contacts/', 'modules/contacts/index.php');
```

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

```php
<?php

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

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.johncms.com/9.3/moduli/sozdanie-modulya.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
