Николай Ланец
8 сент. 2014 г., 22:45

Два "разных" метода fireBeforeSaveEvent в create- и update- процессорах

Все-таки, иногда в MODX-е встречаются вещи, которые меня заставляют негодовать, мягко говоря. К примеру вот эти два метода:
modObjectCreateProcessor::fireBeforeSaveEvent() public function fireBeforeSaveEvent() { $preventSave = false; if (!empty($this->beforeSaveEvent)) { /** @var boolean|array $OnBeforeFormSave */ $OnBeforeFormSave = $this->modx->invokeEvent($this->beforeSaveEvent,array( 'mode' => modSystemEvent::MODE_NEW, 'data' => $this->object->toArray(), $this->primaryKeyField => 0, $this->objectType => &$this->object, 'object' => &$this->object, // for backwards compatibility, do not use this key )); if (is_array($OnBeforeFormSave)) { $preventSave = false; foreach ($OnBeforeFormSave as $msg) { if (!empty($msg)) { $preventSave .= $msg."\n"; } } } else { $preventSave = $OnBeforeFormSave; } } return $preventSave; }

И modObjectUpdateProcessor::fireBeforeSaveEvent()
public function fireBeforeSaveEvent() { $preventSave = false; if (!empty($this->beforeSaveEvent)) { /** @var boolean|array $OnBeforeFormSave */ $OnBeforeFormSave = $this->modx->invokeEvent($this->beforeSaveEvent,array( 'mode' => modSystemEvent::MODE_UPD, 'data' => $this->object->toArray(), $this->primaryKeyField => $this->object->get($this->primaryKeyField), $this->objectType => &$this->object, )); if (is_array($OnBeforeFormSave)) { $preventSave = false; foreach ($OnBeforeFormSave as $msg) { if (!empty($msg)) { $preventSave .= $msg."\n"; } } } else { $preventSave = $OnBeforeFormSave; } } return $preventSave; }


Заметили как много "отличий" у этих методов? То есть как минимум можно было один метод на оба процессора сделать общим. Но главная соль вот в этой строчке:
'object' => &$this->object, // for backwards compatibility, do not use this key
В create- процессоре она есть, а в update- процессоре ее нет. Уточню, что это ключ массива данных, передаваемых в массив $scriptProperties, доступный в навешиваемых плагинах. При этом они еще и советуют этот ключ не использовать, и используйте типа ключ $this->objectType. Вот у меня вопрос? Зачем так усложнять? Почему было не оставить тупо элемент object? Дело в том, что в случае когда у нас object, тогда мы не паримся и не задумываемся будет этот объект или нет. Это всегда объект, с которым будет выполняться сохранение. А вот в случае с $this->objectType нам совершенно нет гарантий какое именно название будет у этого объекта. Спросите зачем его вообще кому-то может понадобиться менять? А вот иногда надо. Простой пример - лексиконы. Может понадобиться изменить тип объекта, чтобы изменить выводимые системные сообщения, ведь там все на лексиконах, к примеру:
public function logManagerAction() { $this->modx->logManagerAction( $this->objectType.'_update', $this->classKey, $this->object->get($this->primaryKeyField)); }

И вот пишу я тут "универсальный" плагин на апдейт, и не знаю, будет там ключ resource, или будет какой-то другой. И главное - нельзя обратиться к процессору и "поинтересоваться", а кокой это тип объекта и как к нему обратиться...
Вот такая фигня... Есть только вариант обратиться к элементу data, который содержит данные этого объекта, но это все-таки не объект.

Добавить комментарий