Странное поведение процессора
Очень странная ситуация с процессором modUserUpdateProcessor — в расширяющем процессоре он подключается стандартным образом, привожу начало процессора:
Если определение класса заменить на
Вопрос получается простой: как сделать расширяющий для modUserUpdateProcessor, чтобы он работал корректно, и в нем можно было переопределять свойства/функции?
Надеюсь, что все понятно объяснил.
РЕШЕНИЕ:
В своем процессоре, который расширяет стандартный modUserUpdateProcessor, необходимо переопределить метод getInstance():
После этого все становится на свои места и корректно работает.
За решение спасибо Николаю.
ПРИЧИНА:
Просмотрев код функции modUserUpdateProcessor::getInstance(), стала понятна причина: новый процессор назывался chwUserUpdateProcessor, однако, стандартный код искал класс с названием chWorkerUpdateProcessor, которого, естественно, не обнаруживал.
Косяк с моей стороны, но не слишком очевидным он оказался.
МОРАЛЬ:
Названия классов нужно использовать максимально стандартизированные, иначе легко появляются ошибки.
<?php
require_once MODX_CORE_PATH . 'model/modx/processors/security/user/update.class.php';
class chwUserUpdateProcessor extends modUserUpdateProcessor {
public $classKey = 'chWorker';
public $permission = 'chworker_save';
/**
* {@inheritDoc}
* @return boolean|string
*/
public function initialize() {
exit ('PERM::::: '.$this->permission. ' ::::::RESULT::::: '.$this->modx->hasPermission($this->permission));
return parent::initialize();
}Вызывается этот процессор тоже вполне обычно:$response = $this->modx->runProcessor('web/user/update',$userData, array('processors_path' => $this->config['processorsPath']));Но! chwUserUpdateProcessor как файл вызывается, а отрабатывает modUserUpdateProcessor. Видно это простейшим образом: вместо обрыва выполнения на операторе exit() происходит проверка прав с отрицательным результатом и возвратом json. Если определение класса заменить на
class chwUserUpdateProcessor extends modObjectUpdateProcessor {, но оставить подключение файла, все равно отработает modUserUpdateProcessor. И только если убрать подключение файла и оставить class chwUserUpdateProcessor extends modObjectUpdateProcessor {, тогда все отработает и сохранится (или оборвется на exit(), если не убрать). Вопрос получается простой: как сделать расширяющий для modUserUpdateProcessor, чтобы он работал корректно, и в нем можно было переопределять свойства/функции?
Надеюсь, что все понятно объяснил.
РЕШЕНИЕ:
В своем процессоре, который расширяет стандартный modUserUpdateProcessor, необходимо переопределить метод getInstance():
public static function getInstance(modX &$modx,$className,$properties = array()) {
$className = __CLASS__;
$processor = new $className($modx,$properties);
return $processor;
}После этого все становится на свои места и корректно работает.
За решение спасибо Николаю.
ПРИЧИНА:
Просмотрев код функции modUserUpdateProcessor::getInstance(), стала понятна причина: новый процессор назывался chwUserUpdateProcessor, однако, стандартный код искал класс с названием chWorkerUpdateProcessor, которого, естественно, не обнаруживал.
Косяк с моей стороны, но не слишком очевидным он оказался.
МОРАЛЬ:
Названия классов нужно использовать максимально стандартизированные, иначе легко появляются ошибки.
Комментарии: 10
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Сделал отдельный процессор
Работа всего MODX прекращается на строке exit('bla');, как и положено. Но если ее убрать, то получаю сообщение permission_denied, что явно говорит о выполнении процессора modUserUpdateProcessor и игнорировании chwUserUpdatetmpProcessor.
Что я делаю не так, почему именно обновление пользователя так криво работает?
Fi1osofДо такой глубины вряд ли хватило бы времени и терпения дойти.
Николай, спасибо!
Fi1osofFi1osofПодгрузка процессоров изменения — очень интересный прием. Возможно, возьму на вооружение. Спасибо за подсказку.
Fi1osofНо в функции $this->modx->runProcessor подумает что это разные процессор и попробует еще раз создать экземпляр, что приведет к ошибке:
Конечно это все к windows относится)
Но может кому полезно будет
Хотя я всегда против веб-разработки на винде :)
Тоже часа два голову ломал что ему не нравится в это классе пока не залезе в runProcessor