Наверх

Основные действия

Логика основных действий для редактирования данных заложена в ядре системы. Это несколько файлов в папке adm/includes, которые описаны ниже. Они отвечают за базовые действия по управлению данными в административной части сайта. Это означает, что если создать модуль с простым содержимым, DIAFAN.CMS автоматически подгрузит эти файлы, и данными можно будет управлять, используя основные действия.

В DIAFAN.CMS предусмотрены следующие действия:

  • вывод данных в виде списка – файл adm/includes/show.php;
  • редактирование, добавление данных – файл adm/includes/edit.php;
  • валидация данных – файл adm/includes/validate.php;
  • сохранение – файл adm/includes/save.php;
  • удаление, удаление в корзину – файл adm/includes/del.php;
  • публикация или скрытие данных – файл adm/includes/act.php;
  • перемещение строки (сортировка и переопределение родителя) – файл adm/includes/move.php;
  • обработка POST запросов – файл adm/includes/action.php.
Внимание!

Этих действий обычно достаточно, чтобы управлять большинством наборов данных. Например, нужно создать модуль по управлению персоналом. Это будет таблица сотрудников с фамилиями. Создавая модуль, достаточно сделать таблицу сотрудников в БД, и базовый функционал сразу автоматически позволит: выводить список сотрудников, добавлять новых, редактировать имеющихся, удалять, сортировать, скрывать выборочных.

В файле модуля можно использовать как стандартный функционал действий, так и расширить его, и даже полностью переопределить на свои действия.

Рассмотрим, как это можно сделать.

Вывод данных в виде списка

При открытии модуля вызывается функция show(), определенная в каждом классе администрирования модуля. В этой функции можно заложить свое представление страницы администрирования модуля, можно вызвать стандартную функцию list_row(), формирующую список элементов таблицы модуля.

Пример:

public function show()
{
    
$this->diafan->list_row();
}

По умолчанию в качестве ссылки на редактирование используется значение поля name. Это можно изменить с помощью свойства $text_for_base_link.

Если для формирования списка нужно ввести дополнительное условие в SQL-запросе к базе данных, то воспользуйтесь свойством $where.

Настройки вывода списка закладываются в переменную $config, определенную в файле модуля.

В список можно добавить свои колонки. Для этого определяется массив $variables_list.

Ссылку «Добавить новый элемент» выводит функция show_add(). Обычно эта функция выглядит так:

Пример:

public function show_add()
{
    
$this->diafan->addnew_init('Добавить новость');
}

По каким полям данные будут фильтроваться определено в массиве $variables_filter.

Редактирование, добавление

Если в URL страницы передана переменная edit или addnew, то подключается функция edit() из файла adm/includes/edit.php. Функция генерирует форму редактирования на основе массива $variables, определенного в классе модуля.

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

Также можно дополнить редактирование полей своим представлением вывода. Для этого в классе модуля определяется функция edit_variable_переменная(), или edit_config_variable_переменная() для файла настроек.

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

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

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

Например, при редактировании новости нужно редактировать прикрепленные изображения и теги.

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

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

Пример:

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

    
),
    

);

Валидация

Перед сохранением данные проверяются, и в случае ошибки выводится сообщение. За валидацию отвечает файл adm/includes/validate.php. DIAFAN.CMS проверяет данные на основе массива $variables, определенного в классе модуля.

Можно добавить свою валидацию полей. Для этого в классе модуля определяется функция validate_variable_переменная() или validate_config_variable_переменная() для файла настроек.

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

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

Сохранение

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

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

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

Функция определяет:

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

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

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

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

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

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

Например, при сохранении новости нужно сохранять информацию о ссылках в меню на новость.

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

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

Пример:

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

    
),
    

);

Удаление, удаление в корзину

При удалении элемента или нескольких элементов модуля подключается функция del() из файла adm/includes/del.php.

Эту функцию можно переопределить в классе модуля.

Кроме того, если в классе модуля определена функция delete($del_id, $trash_id), то помимо заложенных в ядре действий она выполняется для каждого удаляемого элемента.

Надо учитывать, что если элементы удаляются в корзину, то сопутствующие им элементы тоже должны быть удалены в корзину. Поэтому вместо прямого SQL запроса на удаление лучше использовать функцию del_or_trash_where, определенную в файле adm/includes/del.php.

Пример:

/* При удалении товара нужно удалять его цены. Для этого в классе Shop_admin файла modules/shop/admin/shop.admin.php определяем функцию: */
public function delete($del_id, $trash_id)
{
    
$this->del_or_trash_where("shop_price", "good_id=".$del_id, $trash_id);
}

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

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

string delete (integer $element_id, string $module_name, string $element_type, [integer $trash_id = 0]) – удаляет элементы модуля, связанные с другими элементами.

  • integer $element_id: номер удаляемого элемента
  • string $module_name: название модуля, элемент которого удаляется
  • string $element_type: тип данных
  • integer $trash_id: номер записи в корзине, с которой связано удаление

Блокирование, разблокирование

При блокировании/разблокировании элемента или нескольких элементов модуля подключается функция act() из файла adm/includes/act.php.

Эту функцию можно переопределить в классе модуля.

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

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

string act (string $table, array $element_ids, integer $act) – блокирует / разблокирует элементы модуля, связанные с другими элементами.

  • string $table: таблица
  • array $element_ids: номера блокируемого / разблокируемого элементов
  • integer $act: блокировать/разблокировать

Пример:

/* modules/tags/admin/tags.admin.inc.php
Переопределение блокировки/разблокировки для модуля «Теги»
*/
public function act($table, $element_ids, $act)
{
    if (!
$this->diafan->configmodules("tags"))
    {
        return;
    }
    if (
$this->diafan->config('category'))
    {
        
$table = str_replace('_category', '', $table);
        
$element_ids = DB::query_fetch_value("SELECT id FROM {".$table."} WHERE cat_id IN (%h)", implode(',', $element_ids), "id");
        if(
$element_ids)
        {
            
DB::query("UPDATE {tags} SET [act]='%d' WHERE module_name='%h' AND element_id IN (%h)", $act, $table, implode(',', $element_ids));
        }
    }
    else
    {
        
DB::query("UPDATE {tags} SET [act]='%d' WHERE module_name='%h' AND element_id IN (%h)", $act, $table, implode(',', $element_ids));
    }
}

Обработка POST-запросов

Некоторые запросы требуют специальной обработки. Например, подгрузка списка дерева сайта при редактировании родителя страницы. Эта обработка происходит в файле adm/includes/action.php.

Функции для обработки общих запросов описаны в файле adm/includes/action_functions.php.

Если нужно производить обработку POST-запросов в модуле, то создается файл modules/модуль/admin/модуль.admin.action.php. В файле описывается класс Модуль_admin_action. Обработка данных производится в функции action(). Для того чтобы система подключила файл, нужно отправить переменную $_POST["module"] = 'модуль';

Ваши комментарии и дополнения

Внимание! Определённая в классе модуля функция delete($del_id, $trash_id) не будет выполнятся если имя таблицы элементов модуля без префикса не будет соответствовать названию модуля.

Код
public $table = '[название модуля]';


Называть таблицу любым именем можно только в том случае, если не планируется обработка данных стандартными методами Diafan.CMS или модуль не будет иметь интерфейса администрирования как например: капча, корзина, геомап.
Зарегистрируйтесь или авторизируйтесь для того, чтобы оставить комментарий.