На сохранение нового статуса лучше всего использовать расширяющий modObjectUpdateProcessor. Там в методе beforeSave() — самое удачное место для проверки изменения поля status. Но у вас реализация может и отличаться. В любом случае, вам надо перед сохранением не просто проверять поле status == 'готов', но и то, что значение было изменено, так как вы могли апдейтнуть строку и по другой причине, и если каждый раз надеяться только на значение статуса, то можно повторно отправить смс. В xPDOObject есть специальный метод — isDirty(), проверяющий, было ли изменено значение. Вот его и используйте. if($object->isDirty('status') AND $object->status == 'готов'){ $neadSendSMS = true; if($object->save()){ // send sms } } Если у вас update-процессор, то в beforeSave() проверяете поле, а в afterSave() (что свидетельствует о том, что объект был сохранен) отправляете смс.
У меня такой сниппет обрабатывает форму добавления, редактирования и удаления данных <?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 не силен, но хочется делать как правильнее.
Поисковики продолжают радовать своим лояльным отношением к сайту. Только сегодня написал пару статей, яндекс по запросу «Временная почта» выдает на 60+ позиции. joxi.ru/823OeZKCY7dw2O Да, это не ТОП, но все равно не плохо для ресурса, который существует пару дней. Гугл так же оперативно следит за сайтмэпом, и 20% уже в индекс выкинул joxi.ru/KAxeRO7cDOg6r8 Если все ОК пойдет, то можно будет эксперимент озаглавить тезисом «Сайты могут быстро индексироваться».
Спасибо! Да, на это и рассчитываем. Более того, там можно будет получить действительный совет от профессионалов своего дела. У нас есть знакомые и клиенты весьма высокого полета, чей совет — очень дорогого стоит. При этом большой упор хотим сделать на антианонимность. Конечно много кто за анонимность в сетях, но цель не в том, чтобы раскрыть какие-то личные данные, а чтобы просто было видно как давно зареган, какие комментарии писал, какое отношение участников сообщества и т.п. А то на других ресурсах читаешь комментарии-советы, а к то их давал? — не ясно. Стоит доверять или нет?
Мое глубочайшее ИМХО — ориентироваться на рынок защищенного софта в наше время — путь в никуда. Зарабатывать надо на услуге, а не на софте. Просто больше сил уйдет на защиту всего этого. Плюс это сильно снижает покупательскую привлекательность. Но если уж очень хочется идти по этому пути, то я бы лучше смотрел в сторону шифрования части php-скриптов. На сколько слышал, одна из сильнейших систем для этого — IonCube. Мало кто может дешифровать его. Шифруете все для работы только с индивидуальным ключом клиента, и пусть он хоть пару раз в сутки шлет пинг на ваш сервер с этим ключом. Заметили ключ клиента на другом ip — повод к разбирательству.
замечание в точку. но это более второстепенно. мы не мошенники предупреждаем что для работы нужен интернет… а раздавать он может как угодно.
Если клиент купил софт, то зачем ему привязки к вашему серверу? Может он локально поднял сервак без выхода в интернет и по локалке раздает сайт…
ну в общем то понятно… самый вменяемый способ это API. хотя при API меня смущает «железная» составляющая. Здесь уже «api сторона» отвечает за целостность данных клиентов. а если рассмотреть вариант коробочного приложения? с минимальным коннектом к серверу
как вариант — разворачивать бд под каждый новый инстанс и соединяться с базой в зависимости от клиента. Если же нужно просто логирование, без возможности контролировать процесс, то на каждую операцию слать уведомления на сервер логов