Batyabest 19 июня 2015 0 4
Здравствуйте.
Есть таблица в БД, все что нужно для работы с ней создавал через CMP Generator.
В таблице помимо прочих есть поля phone и status. Status может содержать 4 разных значения (принят, направлен в работу, в работе, готов).
Данные в базе редактируются через простую форму на Formit.
Как подвязать отправку смс уведомления пользователю только тогда, когда я при редактировании ставлю в поле статус — готов? А при других значениях не уведомлять.
4 комментария
B
Batyabest 22 июня 2015г в 08:37 #
У меня такой сниппет обрабатывает форму добавления, редактирования и удаления данных

<?php
if (!$_POST['sheet']) {
    $processor = 'sheet/create';
} else {
    $_POST['id'] = $_POST['sheet'];
    $modx->setPlaceholder('id', $_POST['id']);
    if ($_POST['remove']) {
        $processor = 'sheet/remove';
    } else {
        $processor = 'sheet/update';
    }
}
$processorProps = array('processors_path' => $modx->getOption('core_path')
                . 'components/exam/processors/');
$response = $modx->runProcessor($processor, $_POST, $processorProps);
if ($response->isError()) {
    $hook->addError('process_error', $response->getMessage());
    return false;
}
return true;


Файл процессор для редактирования:

<?php
class ExamSheetUpdateProcessor extends modObjectUpdateProcessor {

    public $classKey = 'ExamSheet';
    public $objectType = 'object';
    
    public function beforeSet() {
        if (!$this->modx->user->id) return 'Вам нужно авторизоваться';
        if ($this->object->get('created_by') != $this->modx->user->id)
            return 'Вы не можете редактировать чужие записи';
        return true;
    }

}

return 'ExamSheetUpdateProcessor';


Подскажите, где нужно добавить проверку, что если в поле статус ставится готов, то отправлять sms? Простым кодом давно бы написал, а в xpdo не силен, но хочется делать как правильнее.
Fi1osof1
Fi1osof 22 июня 2015г в 12:10 #
На сохранение нового статуса лучше всего использовать расширяющий modObjectUpdateProcessor. Там в методе beforeSave() — самое удачное место для проверки изменения поля status. Но у вас реализация может и отличаться. В любом случае, вам надо перед сохранением не просто проверять поле status == 'готов', но и то, что значение было изменено, так как вы могли апдейтнуть строку и по другой причине, и если каждый раз надеяться только на значение статуса, то можно повторно отправить смс. В xPDOObject есть специальный метод — isDirty(), проверяющий, было ли изменено значение. Вот его и используйте.
if($object->isDirty('status') AND $object->status == 'готов'){
    $neadSendSMS = true;
    if($object->save()){
        // send sms
    }
}

Если у вас update-процессор, то в beforeSave() проверяете поле, а в afterSave() (что свидетельствует о том, что объект был сохранен) отправляете смс.
B
Batyabest 22 июня 2015г в 13:21 #
Спасибо! Буду пробовать!
Fi1osof1
Fi1osof 22 июня 2015г в 13:29 #
Пожалуйста.
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.