SalesPlatform Vtiger CRM Developers Руководство Проверка полей перед сохранением
Система SalesPlatform Vtiger CRM контролирует корректность ввода пользовательских данных карточек при помощи задания формата поля (текст, число, E-mail и пр.), а также с помощью признака обязательного поля. Однако, часто возникает необходимость выполнения более сложной проверки вводимых данных. Для того, чтобы осуществить гибкую проверку на корректность введенных данных, можно использовать механизм, осуществляющий проверку перед сохранением сущности. Механизм “check-before-save” позволяет организовать ajax-проверку данных сохраняемой сущности и вернуть результат трех типов:
- Уведомление (OK) - разрешает сохранить карточку и выводит сообщение;
- Ошибка (ALERT) - выводит сообщение об ошибке;
- Подтверждение (CONFIRM) - выводит диалоговое окно с кнопками Ok, Cancel и сообщением. При нажатии на OK происходит сохранение карточки.
Если не вернуть никакого результата, то поведение карточки при сохранении никак не изменится.
Для реализации механизма “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” => “Создан новый Модуль”
Важно
- В версии SalesPlatform Vtiger CRM 7 в запросе уже используется ассоциативный массив, в связи с этим не требуется преобразовывать строку, представленную в JSON-формате в массив. В результате строка получения массива будет выглядеть следующим образом:
$dataArr = $request->get('checkBeforeSaveData');
Существуют две переменные: EditViewAjaxMode (режим редактирования), DetailViewAjaxMode (редактирование в детальном режиме просмотра записи) и QuickCreateMode (режим быстрого создания) для определения режима работы с сущностью.
Важно
- В версии SalesPlatform Vtiger CRM 7 все параметры начинаются со строчной буквы: editViewAjaxMode, detailViewAjaxMode, quickCreateMode.
Для примера выполним проверку только для режима “EditViewAjaxMode”.
if($request->get('EditViewAjaxMode')) {
if($request->get('editViewAjaxMode')) {
Для режима “EditViewAjaxMode” введена переменная “CreateMode” , которая может принимать 2 значения:
- create - режим создания в EditView.
- edit - режим редактирования в EditView
Получаем значение переменной “CreateMode” с помощью метода “get” и сохраняем в переменную “$mode”:
$mode = $request->get('CreateMode');
$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.
- если в поле “Date” выбрана дата больше текущей даты, то вывести сообщение-ошибку “Выбранная Дата больше текущей. Измените Дату.”, где текущему пользователю дается возможность внести изменения (см.рис.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; } } ?>