Наверх

Переопределение функционала в административной части модуля

Приведенный ниже пример покажет, как реализовать отправление уведомления на почтовый ящик администратора при сохранении новости.

Откроем файл modules/news/admin/news.admin.php и добавим в массив $variables новый элемент с типом "none".

Пример:

'main' => array (
    
'sendmail' => array(
        
'type' => 'none',
    ),
...

Тип "none" позволяет не выводить поле в административной части, но при этом выполнять необходимый код при сохранении и редактировании элемента, в нашем случае новости (подробнее о типах полей можно посмотреть здесь).

Далее в этот же файл добавим метод:

Пример:

public function save_variable_sendmail()
{
    
//...
}

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

Теперь перейдем к реализации требуемого функционала.

Для отправки почты в DIAFAN.CMS используется функция send_mail(). Для ее выполнения необходимо подключить файл includes/mail.php. Подробное описание функции можно найти в соответствующем разделе.

Файл includes/mail.php подключаем через функцию inc() в классе Custom, чтобы можно было использовать этот метод из кастомизированной темы. Подробнее в разделе «Кастомизация».

Пример:

Custom::inc("includes/mail.php");

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

Адресом получателя в нашем случае будут являться почтовые адреса администраторов сайта. Данные о пользователях хранятся в таблице {users}. Все администраторы сайта в поле role_id имеют значение 3 (если предустановленные данные о типах пользователях не были изменены). Также нужно добавить условие «активен на сайте» и «не удален в корзину». Зная это, мы можем выбрать нужные нам почтовые ящики.

Пример:

$mails = DB::query_fetch_value("SELECT DISTINCT(mail) FROM {users} WHERE role_id=3 AND act='1' AND trash='0'", "mail");

Тему письма можем указать произвольную, например так:

Пример:

$subject = 'Изменения на сайте '.TIT1;

TIT1 – это константа, содержащая имя сайта, указанное в разделе «Параметры сайта» административной части.

В тексте письма будем отправлять ссылку на сохраняемую новость.

Для формирования ссылок используется метод $this->diafan->_route->link(). Подробно метод описан в разделе Маршрутизатор.

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

ID страницы получаем методом get_site_id().

ID новости хранится в $this->diafan->id.

Модуль, в нашем случае, имеет название "news".

В итоге получим такой код:

Пример:

$site_id = $this->diafan->get_site_id();
$link = $this->diafan->_route->link($site_id, $this->diafan->id, "news");

Теперь остается циклом перебрать все почтовые ящики администраторов и отправить им уведомления. Результат будет выглядеть так:

Пример:

public function save_variable_sendmail()
{
    
Custom::inc("includes/mail.php");

    
//тема письма
    
$subject = 'Изменения на сайте '.TIT1;

    
//ссылка на текущую новость
    
$site_id = $this->diafan->get_site_id();
    
$link = BASE_PATH.$this->diafan->_route->link($site_id, $this->diafan->id, "news");

    
//текст сообщения
    
$message = '<a href="'.$link.'">'.(! empty($_POST['name']) ? $_POST['name'] : $this->diafan->id).'</a>';

    
//выбираем значения почтовых ящиков администраторов
    
$mails = DB::query_fetch_value("SELECT DISTINCT(mail) FROM {users} WHERE role_id=3 AND act='1' AND trash='0'", "mail");

    
//делаем рассылку
    
foreach($mails as $mail)
    {
        
send_mail($mail, $subject, $message);
    }
}

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

А для чего создавать поле с типом "none"?
Цитирую с документации:

http://cms.diafan.ru/dokument/full-manual/developers/admin/module/

Цитата
none – при редактировании не выводится, но значение сохраняется (можно использовать с пользовательской функцией);


Собственно для этого и используется. Чтобы при редактировании ничего не выводилось, но на сохранение вешалась функция.
Я просто не вижу каким образом на сохранение этого поля вешается функция
Функция save_variable_sendmail() подключиться при сохранении переменной "sendmail" любого типа кроме "module".
http://cms.diafan.ru/dokument/full-manual/developers/admin/actions/#Sokhranenie
Зарегистрируйтесь или авторизируйтесь для того, чтобы оставить комментарий.