SalesPlatform Vtiger CRM Developers Руководство Проверка полей перед сохранением

Материал из SalesPlatform Wiki
Перейти к: навигация, поиск

Главная страница руководства


Система SalesPlatform Vtiger CRM контролирует корректность ввода пользовательских данных карточек при помощи задания формата поля (текст, число, E-mail и пр.), а также с помощью признака обязательного поля. Однако, часто возникает необходимость выполнения более сложной проверки вводимых данных. Для того, чтобы осуществить гибкую проверку на корректность введенных данных, можно использовать механизм, осуществляющий проверку перед сохранением сущности. Механизм “check-before-save” позволяет организовать ajax-проверку данных сохраняемой сущности и вернуть результат трех типов:

Если не вернуть никакого результата, то поведение карточки при сохранении никак не изменится.


Для реализации механизма “check-before-save” необходимо создать файл “CheckBeforeSave.php” в директории “actions” Модуля. Пример файла:

 <?php
 class ModuleName_CheckBeforeSave_Action extends Vtiger_Action_Controller {
     function checkPermission(Vtiger_Request $request) {return;}
     public function process(Vtiger_Request $request) {return;}
 }
 ?>

Вместо “ModuleName” указывается имя модуля. В классе присутствуют две функции: “checkPermission” и “process”, с параметром $request, в который передаются данные формы для их сохранения. Функция “checkPermission” проверяет имеются ли у текущего пользователя права на выполнение указанных действий. Если прав нет, то выбрасывает исключение AppException. Функция “process” выполняет действия, предусмотренные перед сохранением сущности.


Реализация функции “process”
Для начала преобразуем строку, представленную в JSON-формате в массив. В нашем случае в результате получаем ассоциативный массив “$dataArr”, где ключом является название поля, а значением является значение поля. А именно: “fieldName” => “Значение поля”.

 $dataArr = (array) json_decode(urldecode($request->get('checkBeforeSaveData')));

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

 “name” => “Иван”
 “is_active_status” => “Активно”
 “salesorderid” => “2”
 “date” => “23-02-2016”
 “responsible” => “Петров”
 “description” => “Создан новый Модуль”
Vt important.png Важно
В версии SalesPlatform Vtiger CRM 7 в запросе уже используется ассоциативный массив, в связи с этим не требуется преобразовывать строку, представленную в JSON-формате в массив. В результате строка получения массива будет выглядеть следующим образом:
 $dataArr = $request->get('checkBeforeSaveData');

Существуют две переменные: EditViewAjaxMode (режим редактирования), DetailViewAjaxMode (редактирование в детальном режиме просмотра записи) и QuickCreateMode (режим быстрого создания) для определения режима работы с сущностью.

Vt important.png Важно
В версии SalesPlatform Vtiger CRM 7 все параметры начинаются со строчной буквы: editViewAjaxMode, detailViewAjaxMode, quickCreateMode.


Для примера выполним проверку только для режима “EditViewAjaxMode”.

 if($request->get('EditViewAjaxMode')) {
Vt note.png Примечание
В версии SalesPlatform Vtiger CRM 7 строка будет выглядеть следующим образом:
 if($request->get('editViewAjaxMode')) {


Для режима “EditViewAjaxMode” введена переменная “CreateMode” , которая может принимать 2 значения:

Получаем значение переменной “CreateMode” с помощью метода “get” и сохраняем в переменную “$mode”:

 $mode = $request->get('CreateMode');
Vt note.png Примечание
В версии SalesPlatform Vtiger CRM 7 строка будет выглядеть следующим образом:
 $mode = $request->get('createMode');


Далее получаем значение выбранной даты и значение текущей даты. Из массива “$dataArr” считываем значение, хранящееся под ключом с названием поля “date”. В переменной “$selected_date” хранится значение выбранной даты, а в переменной “$current_date” - значение текущей даты. Это действия необходимы для дальнейшей проверки:

 $selected_date = new DateTime($dataArr['date']);
 $сurrent_date = new DateTime(date("d-m-Y"));

Предпримем следующие действия в режиме создания и редактирования:

Рис. 1: Сообщение-предупреждение


Предусмотрен вывод сообщения-предупреждения (CONFIRM).

 if($dataArr['is_active_status']== 'Активно' && $dataArr['description'] == ) {
     $response = "CONFIRM";
     $message = "Вы действительно хотите сохранить запись без Описания?";
 }

Переменная “response” может принимать одно из трех значений: OK, ALERT, CONFIRM (подробнее см. выше). Значение переменной “message” содержит текст сообщения для OK, CONFIRM и ALERT.

Рис. 2: Сообщение-ошибка


Предусмотрен вывод сообщения-ошибки (ALERT).

 if($selected_date > $сurrent_date) {
     $response ="ALERT";
     $message = "Выбранная Дата больше текущей. Измените Дату.";                    
 }  

После то как установили значение переменных “response” и “message”, в зависимости от выполненных условий, можно с помощью метода “json_encode” закодировать значение данных переменных, помещенных в массив, в JSON-представление в виде строки и отправить клиенту.

 echo json_encode(array("response" => $response, "message" => $message));

Ниже представлен готовый скрипт:

 <?php
 
 class MyModule_CheckBeforeSave_Action extends Vtiger_Action_Controller {
 
     function checkPermission(Vtiger_Request $request) {
         return;
     }
   
     public function process(Vtiger_Request $request) {
         $dataArr = (array)json_decode(urldecode($request->get('checkBeforeSaveData')));
         $response = "OK";
         $message = "";
         $selected_date = new DateTime($dataArr['date']);
         $сurrent_date = new DateTime(date("d-m-Y"));
         
         if($request->get('EditViewAjaxMode')) { 
             $mode = $request->get('CreateMode');
             
             // On create or edit
             if (isset($mode) && (($mode == 'create') || ($mode == 'edit'))) {
                 if($dataArr['is_active_status']== 'Активно' && $dataArr['description'] == ) {
                     $response = "CONFIRM";
                     $message = "Вы действительно хотите сохранить запись без Описания?"; 
                 }
                 if($selected_date > $сurrent_date) {
                     $response ="ALERT";
                     $message = "Выбранная Дата больше текущей. Измените Дату.";                    
                 }                
             }
             echo json_encode(array("response" => $response, "message" => $message));
         }
         
         //Никакого окна подтверждения выведено не будет, карточка сохранится как обычно
         return;
     }
 }
 ?>

Главная страница руководства

Личные инструменты
Пространства имён
Варианты
Действия
Навигация
Документация
Разработчикам
Присоединяйтесь!
Инструменты