Расширение логики модулей или Logic Hooks. Часть 3

Добрый день всем читателям блога.

После долго перерыва в работе блога, я снова возвращаюсь к написанию статей, и надеюсь, теперь уже буду радовать вас новой информацией намного чаще. Хоть я это обещаю уже не в первый раз :smile: .
И так сегодня мы поговорим опять о logic hooks (логических хуках) в SugarCRM. Если вы еще случайно не знакомы с тем, что это такое, для начала рекомендую ознакомиться с этой статьей: Расширение логики модулей или Logic Hooks

Как я понял из практики, многие достаточно быстро понимают, что это такое, и как им пользоваться. Но все время путаются в таких вопросах как: где надо создавать файл, как этот файл называть, где его и как подключать? Вот и новый наш стажер столкнулся с такими же трудностями. Чтобы помочь ему, а заодно и вам, я взял старенький модуль editLogicHooks от Marnus van Niekerk, модифицировал его для работы с SugarCRM 6, немного переписал код для корректной работы c php 5.3 (всякие eregi сейчас зло), добавил ссылку на описание хуков, ну и конечно русифицировал. При этом все авторство остается за Маркусом, мне чужого добра не надо )).

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

После инсталляции модуля через админку. В административном меню вы увидите новый пункт: Logic Hooks.Создание и редактирование Logic Hooks.

В этом модуле нам доступно создание новых хуков и редактирование ранее созданных хуков.
Для создания нового хука выбираем NEW, далее тип хука (для тех кто не знает или забыл, рядом ссылка в помощь с описанием). Так же выбираем модуль для которого будет работать данный хук и вводим имя (обязательно на английском языке, так как это имя будет участвовать при сохранении файла, и все русские символы будут заменены на _, и вы потом не разберетесь где какой хук).

Создание logic hooks

Отрывается новая страница, и вы можете редактировать код данного хука.
Код пишется между комментариями // Здесь начинается твой код для хука и // Здесь заканчивается твой код для хука.

Редактор Logic Hook

Для выбора ранее созданного хуку выбираем данный хук и нажимаем далее.
Разберем как всегда жизненный пример: необходимо в случае удаления контакта оповещать ответственное лицо за этот контакт, о произошедшем удалении и сообщать о том, кто такой нехороший его удалил.
Переходим в наш модуль редактирования хуков, выбираем тип before_delete, модуль контакты, и имя, например, BeforeDelete.
Наш код, который мы добавляем:

global $current_user;

 if ($event != 'before_delete') return;
 // Insert your custom logic between these comments
 $user = new User();
 $user->retrieve($bean->assigned_user_id);
 if (!empty($user->email1))
 {
 $this->sendSugarPHPMail(array($user->full_name => $user->email1),
 'Удален контакт',
 'Был удален контакт. Полное имя контакта: ' . $bean->full_name . '<br>' .
 'Контакт был удален: ' . $current_user->full_name );
 }
 // Insert your custom logic between these comments

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

<?php
class BeforeDelete_class
{
        function BeforeDelete_method(&$bean, $event, $arguments=null)
        {
                global $current_user;

                if ($event != 'before_delete') return;
                // Insert your custom logic between these comments
        $user = new User();
        $user->retrieve($bean->assigned_user_id);

        if (!empty($user->email1))
        {
                $this->sendSugarPHPMail(array($user->full_name => $user->email1),
                                                                'Удален контакт',
                                                                'Был удален контакт. Полное имя контакта: ' . $bean->full_name . '<br>' .
                                                                'Контакт был удален: ' . $current_user->full_name );
        }
        // Insert your custom logic between these comments
        }

        function sendSugarPHPMail($tos, $subject, $body)
        {

          require_once('include/SugarPHPMailer.php');
          require_once('modules/Administration/Administration.php');

          $mail = new SugarPHPMailer();
          $admin = new Administration();
          $admin->retrieveSettings();

          if ($admin->settings['mail_sendtype'] == "SMTP") {
                  $mail->Host = $admin->settings['mail_smtpserver'];
                  $mail->Port = $admin->settings['mail_smtpport'];

                  if ($admin->settings['mail_smtpauth_req']) {
                          $mail->SMTPAuth = TRUE;
                          $mail->Username = $admin->settings['mail_smtpuser'];
                          $mail->Password = $admin->settings['mail_smtppass'];
                  }

                  $mail->Mailer   = "smtp";
                  $mail->SMTPKeepAlive = true;

          }else{
                  $mail->mailer = 'sendmail';
          }

          $mail->IsSMTP(); // send via SMTP
          if ($admin->settings['mail_smtpssl'] == '2') $mail->SMTPSecure = "tls";
          elseif ($admin->settings['mail_smtpssl'] == '1') $mail->SMTPSecure = "ssl";
          $mail->CharSet='UTF-8';

          $mail->From     = $admin->settings['notify_fromaddress'];
          $mail->FromName = $admin->settings['notify_fromname'];
          $mail->ContentType = "text/html"; //"text/plain"
          $mail->IsHTML(true);

          $mail->Subject = $subject;
          $mail->Body = $body;

          foreach ($tos as $name => $address){
                  $mail->AddAddress("{$address}", "{$name}");
          }

          if (!$mail->send()) {
                  $GLOBALS['log']->info("sendSugarPHPMail - Mailer error: " . $mail->ErrorInfo);
                  return false;
          }else{
                  return true;
          }
        }
}
?>

Один из минусов модуля заключается в том, что нельзя удалить созданный хук, через администрирование. Удалять необходимо вручную из папки custom/modules /папка_модуля/название_вашего_хука.php и плюс удалить его подключение из файла logic_hooks.php в этой же папке.
Если вас заинтересовал данный модуль для SugarCRM, скачать его можно по данной ссылке: editLogicHooks-1.0.6.zip (202) или же со страницы загрузок.

P.S. Если вдруг данный модуль будет вас интересовать, могу прикрутить визуальный php редактор (а то в обычной textarea редактировать код неудобно) + сделать удаление хуков из админки. Вашу заинтересованность я узнаю из количества скачек модуля и комментариев к данной теме :mrgreen:

P.P.S Добавил редактор с подсветкой php кода editarea. Модуль по ссылке обновлен. Теперь редактор выглядит следующим образом:

SugarCRM редактор

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

Вы можете пропустить до конца и оставить ответ. Pinging в настоящее время не доступны.

Есть 28 коммент. к “Расширение логики модулей или Logic Hooks. Часть 3”

  1. Chif:

    Модуль не совместим с 6.2.0 версией Шуги.

Написать комментарий

Вы должны войти чтобы комментировать.