dokuwiki: custom e-mail notification

Февраль 9, 2012 at 17:11 Оставьте комментарий

Я использую dokuwiki не для публикации статей, а больше как удобный каталог. То есть подопечные менеджеры могут создавать в нем разделы и размещать документы с описаниями. Просто текста там совсем немного. При этом все сотрудники должны быть оповещены об изменениях в каталоге. Почтовая рассылка и механизм подписывания/отписывания от нее есть. Но письма, которые приходят к пользователям обладают довольно техническим шаблоном. То есть он содержит тэги HTML, специальные пометки и т.д. Это хорошо для настоящих бойцов вики. Но тех, кто просто должен заглядывать в нее, как в справочник, такие письма пугают и они их просто не читают.
Судите сами, вы сидите-никого не трогаете. А тут бабах письмо такого содержания:

Здравствуйте!
Страница каталог:продажи в вики Справочник «Example» была изменена.
Ниже представлены изменения:
———————————————————
@@ -180,9 +180,9 @@

==Номера телефонов и почтовые адреса сотрудников==
— {{:справочник:продажи:телефонные_номера.xls|Телефонный справочник 07.06.11}}
— {{:справочник:продажи:телефон.номера_москва.doc|Телефон.номера Москва 22.12.2011}}
— — {{:справочник:авто:водители_мобил.телефоны_16.01.12.doc|Справочник авто,водители,мобил.телефоны 16.01.12}}
+ — {{:справочник:авто:справочник_авто_водители_мобил.телефоны_06.02.12.doc|Справочник авто,водители,мобил.телефоны 06.02.12}}
— {{:справочник:почта:e-mail.doc|Адреса электронной почты 07.04.11}} ❗

———————————————————
Чтобы отписаться от изменений этой страницы,
войдите под своим именем в Вики по адресу
http://192.168.11.65/dokuwiki/, перейдите на страницу
http://192.168.11.65/dokuwiki/doku.php?id=example и нажмите ‘Отписаться’.

Это сообщение было сгенерировано DokuWiki по адресу
http://192.168.11.65/dokuwiki/

По-моему, так не годится. Во-первых, я не хочу, чтобы люди отписывались от рассылки) А во-вторых, кого угодно будет удручать @@ -180,9 +180,9 @@.
Разработчики dokuwiki большие молодцы, но я немножко поработала напильником. Кстати, есть плагин для того, чтобы сообщения приходили в виде html, что убирает некоторые вещи, но я пошла по пути бритвы Оккама.
Цель — письмо, в котором четко написано, что удалено, а что добавлено, без тэгов. Главное — оповещение о том, что изменение произошло и что изменилось.
У меня ubuntu, поэтому все расположение файлов относительно нее.
Лезем в /usr/share/dokuwiki/inc. Там нам понадобятся файл DifferenceEngine.php и папка lang.
Чтобы было понятно: dokuwiki отсылает письма с помощью mail.php. mail.php использует common.php для формирования письма, который в свою очередь использует классы из DifferenceEngine.php для вычисления разницы между исходной страницей и отредактированной и соответственно составляет тело письма. В mail.php можно поменять например subject писем в строке номер 104. common.php я бы менять не стала вообще. А вот в DifferenceEngine.php вполне можно кое-что подредактировать.
common.php запрашивает класс UnifiedDiffFormatter. В нем во-первых, я сделала пустым следующий члне класса:

 function _block_header($xbeg, $xlen, $ybeg, $ylen) {
        return "\n";
    }

Именно он выводил @@ -180,9 +180,9 @@.
Затем я подправила следующий блок:

function _added($lines) {
        $this->_lines($lines, "Добавлено: "); 
    }
    function _deleted($lines) {
        $this->_lines($lines, "Удалено: ");
    }

Чтоб не плюс/минус, а по-русски так.
Чтобы не показывать в письме окружающий измененные строки контекст, надо изменить значения полей родительского класса DiffFormatter $leading_context_lines и $trailing_context_lines на 0.
Ну и последнее, что я сделала в этом файле, это изменила функцию в DiffFormatter, которая добавляет префикс Добавлено/Удалено к строкам, которые были изменены:

function _lines($lines, $prefix = ' ') {
    foreach ($lines as $line) {  //для каждой измененной строки
        $output_line = $line;  //запомнить строку
        $res_prefix = $prefix; //запомнить стандартный префикс
        $file_check = split("\|",$line); //если это ссылка на файл, то отделить описание от пути к файлу
        if (sizeof($file_check) > 1) { 
          $file_descr = str_replace("}}", "", $file_check[1]); 
          if (strlen(trim($file_descr)) > 0) $output_line = $file_descr; //описание будем вставлять в текст письма
          else {
          $filename_arr = split(":",str_replace("{{", "", $file_check[0])); //если описания нет, то будем писать имя файла
          $size_filename_arr = sizeof($filename_arr);
          $output_line = $filename_arr[$size_filename_arr-1];
          $res_prefix = (substr($prefix, 0, -4))." файл: "; //"Добавлено"(Удалено) меняем на "Добавлен(удален) файл"
          }
         } 
        if (strpos($line,"==") !== false) { //если это еще и раздел, то делаем Добавлен раздел и удаляем тэги
          $output_line = str_replace("=","",$line);
          $res_prefix = (substr($prefix, 0, -4))." раздел: ";
          }
      if (strlen(trim($res)) > 0) echo "$res_prefix $output_line\n";
    }
  }

Конечно, это говнокод. Уже хотя бы потому, что вычисление подстроки substr неадекватно. Кириллица занимает больше одного байта на символ. Тут надо быть аккуратным. У меня захардкожено 2 байта. У меня работает. Ключевое тут — «У меня».
Шаблон письма на русском языке лежит в папке lang/ru/subscribermail.txt. Изменить его по своему вкусу очень легко.
Теперь письмо стало выглядеть как-то так:

Здравствуйте!
Каталог «Example» был изменен.
Ниже представлены изменения:
———————————————————
Удален раздел: тестовый раздел
Удален файл: dostavka.pdf
Добавлено: тест
———————————————————
Это сообщение было сгенерировано автоматически для справочника Example

Реклама

Entry filed under: Linux. Tags: , , , , .

php: string contains substring SASL: Postfix + Dovecot

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

Trackback this post  |  Subscribe to the comments via RSS Feed



%d такие блоггеры, как: