Контроллер

Контроллер модуля – класс Модуль в файле modules/модуль/модуль.php.

В классе описаны:

  • массив $rewrite_variable_names – пременные, передаваемые в URL;
  • функция init() – инициализация модуля;
  • функция action() – обработка данных в модуле;
  • шаблонные функции.

Переменные, передаваемых в URL определяются для каждого модуля (cписок доступных переменных).

Пример:

public $rewrite_variable_names = array('page', 'show', 'year', 'month', 'day', 'param', 'edit', 'sort');

Функция инициализации модуля вызывается, если модуль подключен к текущей странице. В ней происходит выбор функции модели модуля в зависимости от переданных параметров. Модель модуля подключается автоматически при первом вызове ее из контроллера через переменную $this->module.

Пример:

// если в URL передана переменная show, вызываем функцию id в модели – показываем страницу товара
if($this->diafan->_route->show)
{
    
$this->model->id();
}
// иначе вызываем функцию list_ в модели – выводим список товаров
else
{
    
$this->model->list_();
}

Функция обработки данных вызывается, если передана переменная $_POST["module"] = 'название_модуля'. Обработка действий модуля подключается автоматически при первом вызове ее из контроллера через переменную $this->action.

В этой функции можно

  • проверить авторизован ли пользователь:

Пример:

$this->action->check_user();

if (
$this->action->result())
    return;
  • проверить идентификационный хэш авторизованного пользователя:

Пример:

$this->action->check_user_hash();

if (
$this->action->result())
    return;
  • убедиться, что запрос был сделан со страницы модуля

Пример:

if($this->diafan->_site->module != 'forum')
    return;
  • выбрать функцию из файла modules/модуль/модуль.action.php, которая будет обрабатывать запрос:

Пример:

if(! empty($_POST["action"]))
{
    switch(
$_POST["action"])
    {
        case
'add':
            return
$this->action->add();

        case
'edit':
            return
$this->action->edit();
    }
}

Шаблонные функции модуля – определяются условия, при которых функция не отображается, фильтруются полученные атрибуты, подключается соответствующие функции в модели и представлении модуля. Подробнее смотрите в разделе «Как добавить шаблонный тег».

Класс Controller

Контроллер модуля наследует класс Controller – это каркас для всех страниц.

Свойства

var rewrite_variable_names = array() – переменные, передаваемые в URL страницы.

Пример:

// в модуле будет использована пагинация, деление на категории и показана страница элемента
public $rewrite_variable_names = array('page', 'cat', 'show');

var result – сгенерированные в моделе данные, передаваемые в шаблон.

Методы

void init () – Инициализация модуля.

Функция определяется в контроллере модуля.

Пример:

// в модуле "Файловый архив" modules/files/files.php
public function init()
{
    if(
$this->diafan->configmodules("cat"))
    {
        
$this->rewrite_variable_names[] = 'cat';
    }

    if (
$this->diafan->_route->show)
    {
        
$this->model->id();
    }
    elseif (!
$this->diafan->configmodules("cat"))
    {
        
$this->model->list_();
    }
    elseif (!
$this->diafan->_route->cat)
    {
        
$this->model->first_page();
    }
    else
    {
        
$this->model->list_category();
    }
}

void action () – Обрабатывает полученные данные из формы.

Функция определяется в контроллере модуля.

Пример:

// в модуле "Корзина товаров" modules/cart/cart.php
public function action()
{
    if(
$this->diafan->configmodules('security_user', 'shop'))
    {
        
$this->action->check_user();

        if (
$this->action->result())
            return;
    }
    if(! empty(
$_POST["action"]))
    {
        switch(
$_POST["action"])
        {
            case
'recalc':
                return
$this->action->recalc();

            case
'order':
                return
$this->action->order();

            case
'one_click':
                return
$this->action->one_click();

            case
'upload_image':
                return
$this->action->upload_image();

            case
'delete_image':
                return
$this->action->delete_image();
        }
    }
}

void api () – Обрабатывает полученные данные из формы.

void exec () – Обрабатывает полученные данные из формы.

void show_module () – Выводит шаблон модуля.

Шаблон модуля подключается автоматически. Названием шаблона задается в моделе переменной $this->result["view"].

void get_global_variables () – Определяет свойства страницы, если они заданы в модуле.

Функция вызывается автоматически.

array get_attributes (array &$attributes) – Задает неопределенным атрибутам шаблонного тега значение по умолчанию.

  • array $attributes: массив определенных атрибутов

Пример:

// шаблонный тег show_block module="clauses" предусматривает несколько атрибутов
// все они перед использованием должны быть переданы как аргументы
// для функции get_attributes в начале функции show_block()
$this->get_attributes($attributes, 'count', 'site_id', 'cat_id', 'sort', 'images', 'images_variation', 'only_module', 'template');

boolean method_exists (string $module, string $name, [string $method_name = false]) – Проверяет, существует ли класс или метод в классе.

  • string $module: имя модуля
  • string $name: тип класса
  • string $method_name: имя метода

Ваши комментарии и дополнения
02 января 2017 г.
Хоть бы показали пример объявления всего класса контроллера целиком. А то только разрозненные куски.

Не раскрыты правила именования класса. Например, можно ли его назвать «FooBar» или обязательно писать «Foobar»?

Также наблюдаются проблемы с русским языком. Слова «В классе описаны» подразумевают, что что-то уже кем-то описано, хотя ясно, что это не так. Приходится гадать, что имелось ввиду: «в классе ДОЛЖНЫ быть описаны» или «в классе МОГУТ быть описаны». Опять же «Переменные, передаваемых (тут вероятно «-ые» должно быть) в URL определяются для каждого модуля» — это значит, что переменные определяются системой или что разработчик должен их определить? Потому что рядом написано «Функция инициализации модуля вызывается» и становится совсем непонятно, это «вызывается системой» или всё же разработчик должен сам вызвать метод?
13 марта 2021 г.
Поправьте пожалуйста ошибку.
$this->module написано, должно быть $this->model

206 строка кода этой страницы.

Зарегистрируйтесь или авторизируйтесь для того, чтобы оставить комментарий.