Перейти к содержанию

Обработка сохранения

Для обработки сохранения с форм модуля используется файл ModAjax.php, он находится в корне модуля. Он должен наследоваться от класса ajaxFunc, который дает необходимую функциональность.

Файл содержит набор публичных методов, названия которых начинаются на ax. Такие методы вызываются если на странице с формы будет отправлен запрос на сохранение. У каждой формы есть название метода который должен выполниться для сохранения своего объекта.

Метод сохранения имеет входящий параметр $data в котором находятся сохраняемые и вспомогательные данные. Все сохраняемые данные должны находиться в ключе $data['control']. К вспомогательным, по умолчанию, относятся $data['class_id'], $data['class_refid'] в которых хранятся описание сохраняемого объекта. Могут быть и другие вспомогательные параметры.

Валидация

Для валидации сохраняемых данных в классе имеется метод ajaxValidate, он принимает переменную $data, список полей которые требуется валидировать и как именно их требуется валидировать.

if ($this->ajaxValidate($data, [
    'form_field1' => 'req',
    'form_field2' => 'req,int',
    'form_field3' => 'email',
]) {
    return $this->response;
}

Возможные виды валидации: 1. req - параметр является обязательным для заполнения 2. int - параметр имеет тип int
3. float - параметр имеет тип float 4. email - параметр содержит email

Очистка данных

Сохраняемые данные можно очистить от лишнего мусора. Например, от лишних пробелов в полях или от тегов в данных которые может отправить пользователь. Для этого можно использовать встроенную функцию $this->clearData() По умолчанию она именно это и делает, но можно передать список функций которые должны выполниться для каждого значения в данных $data['control']

Пример

$data['control'] = $this->clearData($data['control']);

Данные из сессий

При сохранении можно получать вспомогательные данные из сессии. Это дает возможность не хранить чувствительные или "секретные" данные на странице у пользователя. Пр необходимости, такие данные ложатся в сессию при формировании формы и получаются в методе сохранения через метод $this->getSessFormField().

Пример

// Получение id сохраняемого объекта
$refid = $this->getSessFormField($data['class_id'], 'refid');

// Получение каких-то своих данных 
$example_data = $this->getSessFormField($data['class_id'], 'example_data');

Сохранение данных

Перед сохранением данных в базе есть возможность их редактировать, для этого допускается изменение переменных в массиве $data['control']. Чтобы произошло сохранение все его ключи должны иметь такое же название полей как названия полей в таблице.

Пример

// если $refid пуст, то значит это создание новой записи, а не редактирование 
if (empty($refid)) {
    // заполнение полей данными по умолчанию
    $data['control']['date_created'] = date('Y-m-d H:i:s');
}

После того как данные будут готовы к сохранению, можно вызвать метод сохранения $this->saveDataModel(). Это метод принимает модель таблицы, в которую производится сохранение и данные для сохранения. В результате сохранения будет возвращен объект \Zend_Db_Table_Row_Abstract сохраненного объекта.

Пример

$order_row = $this->saveDataModel($this->modOrders->dataOrders, $order_data);

Ответ о результате сохранения

После сохранения данных или при возникновении ошибок метод сохранения обязан вернуть объект $this->response. В этом находится данные с результатом выполнения.

Для того чтобы вернуть ответ с успешным сохранением требуется предварительно выполнить метод $this->done(). Дополнительно, при необходимости, можно выполнить какой-то js скрипт на странице, выполнив метод $this->response->script()

Пример

$this->response->script("CoreUI.notice.create('Сохранено');");
$this->done($data);
return $this->response;

Для того чтобы вернуть ответ с ошибкой требуется предварительно заполнить список ошибок и выполнить метод $this->displayError()

Пример

$this->error[] = 'Текст ошибки которую увидит пользователь на странице формы';
$this->displayError($data);
return $this->response;

Пример файла целиком

require_once DOC_ROOT . "core2/inc/ajax.func.php";


/**
 * 
 */
class ModAjax extends ajaxFunc {

    /**
     * Сохранение заказа 
     * @param array $data
     * @return xajaxResponse
     * @throws Exception
     */
    public function axSaveOrder(array $data): xajaxResponse {

        if ($this->ajaxValidate($data, [
            'form_field1' => 'req',
            'form_field2' => 'req,int',
            'form_field3' => 'req,email',
        ]) {
            return $this->response;
        }

        $data['control'] = $this->clearData($data['control']);


        $refid = $this->getSessFormField($data['class_id'], 'refid');

        $this->db->beginTransaction();
        try {
            if (empty($refid)) {
                $data['control']['date_created'] = date('Y-m-d H:i:s');
            }

            $order_row = $this->saveDataModel($this->modOrders->dataOrders, $order_data);


            $this->response->script("CoreUI.notice.create('Сохранено');");
            $this->response->script("load('index.php?module=orders&action=index&edit={$order_row->id}');");

            $this->db->commit();

        } catch (Exception $e) {
            $this->db->rollBack();
            $this->error[] = $e->getMessage();
        }

        $this->done($data);
        return $this->response;
    }
}