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

Если в URL страницы передана переменная edit (https://site.ru/admin/news/edit5/) или addnew (https://site.ru/admin/shop/addnew1/), то подключается функция edit() из файла adm/includes/edit.php. Функция генерирует форму редактирования на основе массива $variables, определенного в классе модуля. Остальные функции в файле adm/includes/edit.php детализируют отрисовку формы редактирования.

Другой случай подключения файла adm/includes/edit.php – если в файле указано, что это интерфейс редактирования настроек модуля:

public $config = array (
    
'config', // файл настроек модуля
);

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

Пример:

Нам понадобилось выводить в подсказке к полю данные из настроек модуля: типы файлов, которые можно загрузить в модуль «Файловый архив». Мы нашли в файле adm/includes/edit.php функцию help(), которая выводит подсказку к полю.

Мы можем просто ее скопировать в файл modules/files/admin/files.admin.php и внести изменения. Можем, чтобы не дублировать код, заменить повтор кода на обращение к родительской функции (из файла adm/includes/edit.php).

// переопределяем функцию help() в файле modules/files/admin/files.admin.php    
public function help($key = '')
{
    
// чтобы не дублировать код,
    // обращаемся к этой же функции из файла adm/includes/edit.php
    
$text = parent::__call('help', array());
    
// добавляем к подсказке типы данных из настроек
    
$text = str_replace('%attachment_extensions', $this->diafan->configmodules('attachment_extensions'), $text);
    return
$text;
}

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

Пример:

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

Так как логика не соответствует ни одному из типов данных (text, numtext, editor и т. д.), определим пользовательскую функцию для вывода номера.

Сначала зададим новое поле в массиве $variables.

public $variables = array(
    
'main' => array(
        
'number' => array(
            
'type' => 'function',
            
'name' => 'Заказ №',
            
'help' => 'Номер заказа.',
            
'no_save' => true,
        ),
        

    
),
    

);

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

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

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

// modules/shop/admin/shop.admin.order.php
public function edit_variable_number()
{
    
// стандартный блок вывода поля в форме
    
echo '<div class="unit" id="number">';
    
// название поля number, которое мы задаем в массиве $variables
    
echo '<b>'.$this->diafan->variable_name().'</b> ';

    
// если запись не новая, просто выводим номер
    
if(! $this->diafan->is_new)
    {
        echo
$this->diafan->id;
    }
    else
    {
        
// иначе выводим предполагаемый номер
        
echo DB::query_result("SELECT MAX(id) FROM {shop_order}") + 1;
    }

    
// подсказка для поля number из массива $variables
    
echo $this->diafan->help();
    echo
'</div>';
}

Хорошим тоном будет задать блоку, в котором выводим поле, идентификатор по названию поля. Это дает возможность им манипулировать. Например, скрывать/показывать если задано какое-то другое поле.

В примере мы вывели идентификатор для текущей записи (номер заказа) через переменную $this->diafan->id. Еще можно было бы сделать это через переменную $this->diafan->value. Это значение текущего поля (number) из базы данных. Именно в данном случае оно нам не подходит, так как в качестве номера мы используем идентификатор, а не поле number. А если мы хотим использовать любую другую информацию о редактируемом заказе, то получим ее через функцию $this->diafan->values('название поля'). То есть можно было бы и так написать: $this->diafan->values('id').

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

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

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

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

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

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

    
),
    

);

Пример:

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

Создаем файл modules/images/admin/images.admin.inc.php следующего содержания:

class Images_admin_inc extends Diafan
{

    public function
edit()
    {
        
// форма добавления изображений для новости
    
}
    
// ...
}

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

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

    
),
    

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

Ваш комментарий будет первым.

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