Сохранение

Если передана переменная $_POST["action"] = 'save'; и не задан модуль в переменной $_POST["module"], то подключается функция save() из файла adm/includes/save.php. Функция сохраняет данные из формы на основе массива $variables, определенного в классе модуля.

Любую публичную функцию из файла adm/includes/save.php можно переопределить в файле модуля.

Пример:

При сохранении скидки нам нужно пересчитать все цены. Мы определили, что самая последняя операция при сохранении – редирект. Он выполняется функцией save_redirect() из файла adm/includes/save.php. Скопируем эту функцию в файл модуля modules/shop/admin/shop.admin.discount.php и добавим пересчет цен в самом начале перед редиректом. Чтобы не дублировать код, заменим его вызовом этой же функции из файла adm/includes/save.php.

// modules/shop/admin/shop.admin.discount.php
public function save_redirect()
{
    
// пересчет цен
    
$this->diafan->_shop->price_calc(0, $this->diafan->id);
    
// вызов функции save_redirect из файла adm/includes/save.php    
    
parent::__call('save_redirect', array());
}

Также можно дополнить сохранение полей, описанных в $variables своей обработкой. Для этого в классе модуля определяется пользовательская функция save_variable_переменная(). Для файла настроек функция будет называться save_config_variable_переменная().

Пользовательская функция может определять в какое поле в редактируемой таблице базы данных записать данные и как эти данные профильтровать (указываем маску). Это передаем в функцию set_query():

  • $this->diafan->set_query("название_поля='%f'");

Для определения маски обратитесь к разделу «Базы данных».

Далее с помощью функции set_value() задаем сами данные:

  • $this->diafan->set_value("значение_поля");

Если данные записываются не в редактируемую таблицу, а в другую таблицу или поле вообще не принимает данные, а, например, принимает файл, то set_query() и set_value() не нужно использовать. Опишите ту логику, которая нужна.

Предыдущее значение поля (записанное в базу данных) доступно через функцию $this->diafan->values('название поля').

Пример:

В модуле «Рассылки» нам нужно изменить дату рассылки только в том случае, если мы отправляем рассылку. Для того, чтобы описать это условие, мы создадим пользовательскую функцию для поля created (дата отправки) в файле modules/subscription/admin/subscription.admin.php.

public function save_variable_created()
{
    
// значение поля оставим неизменным
    // то есть определим как уже заданное значение
    
$created = $this->diafan->values("created");

    
// условие: если дата не задана, то есть ранее не отправлялась рассылка
    // и в текущий момент рассылка отправляется
    
if (! $created || ! empty($_POST["text"]) && ! empty($_POST["send"]))
    {
        
// значение изменяем на текущее время
        
$created = time();
    }

    
// указываем поле, куда будут записаны данные - created
    // и маску для фильтрации - %d - числовые данные
    
$this->diafan->set_query("created=%d");

    
// указываем значение поля
    
$this->diafan->set_value($created);
}

Некоторые пользовательские функции редактирования полей определены в файле adm/includes/save_functions.php. Например, время редактирования, сортировка, ЧПУ и пр. Их также можно переопределить в классе модуля.

Пример:

Сохранение псевдоссылки идет в отдельную таблицу базы данных {rewrite}. Логика работы с этой таблицей не соответствует ни одному из описанных типов данных (text, numtext, checkbox и т. д.). Поэтому нам нужно определить функцию для сохранение этого поля. Но в CMS уже есть такая функция в файле adm/includes/save_functions.php. Мы ее можем использовать. Поэтому если у нас поле называется rewrite, то подключиться функция save_variable_rewrite() из общих пользовательских функций. И нам не нужно ее описывать в файле модуля.

Пользовательская функция вызывается всегда, если она определена, независимо от типа переменной. Исключение составляет тип module. Теперь рассмотрим его.

Некоторые модули агрегируют информацию об элементах других модулей. При их сохранении нужно чтобы связанная информация также сохранялась.

Для этого в модулях-подключениях нужно создать файл modules/модуль/admin/модуль.admin.inc.php. В файле должен быть определен класс Модуль_admin_inc с функцией save() или save_config() для файла настроек.

Затем в основном модуле в таблице $variables нужно указать переменную, названную так же, как модуль-подключение, и задать ей тип module.

public $variables = array(
    
'main' => array(
        
'подключаемый_модуль' => 'module',
        

    
),
    

);

Пример:

При сохранении новости нужно сохранять информацию о ссылках в меню на новость. Создаем файл modules/menu/admin/menu.admin.inc.php следующего содержания:

class Menu_admin_inc extends Diafan
{

    public function
save()
    {
        
// сохраняем ссылки на новость в меню в таблицу {menu}
    
}
    
// ...
}

В модуле новости modules/news/admin/news.admin.php указываем тип module для поля menu. Тогда при сохранении новости подключиться вышеописанная функция save().

public $variables = array(
    
'main' => array(
        
'menu' => 'module',
        

    
),
    

);

База знаний

Ваши комментарии и дополнения
25 июня 2019 г. , редакция: 25 июня 2019 г.
Код
public $variables = array(
'main' => array(
'menu' => 'module',

),

);


А в этой конструкции разве не наоборот должно быть?

Код
public $variables = array(
'main' => array(
'module' => 'menu',

),

);

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