21 авг. 2013 г., 14:44

Проблема в создании собственного дополнения на базе Doodles

Здравствуйте мне нужно сделать пункт в меню для обратной связи с добавлением данных в базу данных. Моя проблема заключается в том что мне нужно вызвать с контекстно меню свой скрипт но мне видает ошибку:
Catchable fatal error: Argument 1 passed to Doodles::__construct() must be an instance of modX, null given, called in /var/www/modx.my/core/components/doodles/processors/mgr/doodle/request.class.php on line 2 and defined in /var/www/modx.my/core/components/doodles/model/doodles/doodles.class.php on line 12
Код скрипта:
<?php $model = new Doodles($modx); $res = $model->sendMail(); return $modx->error->success(''); ?>
Прошу помочь кто знает.
1. Какая версия MODX-а? Полностью. 2. Вам php четко выдает ошибку: Catchable fatal error: Argument 1 passed to Doodles::__construct() must be an instance of modX, null given, called in. Не был передан параметр $modx в процессор.
Версия: MODX Revolution 2.2.8-pl (traditional); Я понимаю что вопрос кажется глупим но я думал что это и есть его передача:
$model = new Doodles($modx);
Я этот пример брал с поста community.modx-cms.ru/blog/addons/2222.html. Просто уже неделю не могу с этим разобраться. Сначала я пробовал исполнять свой скрипт и просто возвращать:
$modx->error->success('');
Но так не получалось была ошибка:
Fatal error: Call to a member function success() on a non-object in /var/www/modx.my/core/components/doodles/processors/mgr/doodle/request.class.php on line 4
Как я понял ошибка в том что я не создавал объект, или что то типа этого. Признаюсь сразу в объектном PHP я не силен, но базовие понятия ООП я имею.
1. Пишите ответом, чтобы я оперативно получал уведомления о комментах. 2. Тот топик очень старый, писался еще до появления новой версии процессоров. И вообще раньше много чего. В результате, лучше изучите это: community.modx-cms.ru/blog/modx-xpdo/11035.html Там как раз пример с использованием более современных технологий, а главное — пакета CMPGenerator, который позволит вам быстро сгенерировать модель пакета из готовой таблицы, а не пользоваться «модификацией моей модификации возможно чьей-то модификации» скрипта для генерации модели. И вообще изучите все статьи Ильи в разделе xPDO, так как вам сейчас явно не хватает понимания работы процессоров и xPDO в целом. Потратьте основательно на это день, и завтра уже будете понимать, как все просто.
P.S. Ошибка возникает именно в классе процессора, поэтому и надо изучить процессоры. А в указанной статье Ильи так же написано как подключать пакеты через $modx->addExtensionPackage() или через настройки, чтобы он всегда был виден MODX-у.
Благодарю за ссылки буду разбираться.
Я перечитал предоставленный вами материал, информация полезная так что добавил в избранное, но я так и не понял как мне вернуть:
$modx->error->success('');
, в пользовательских скриптах. И ещё один вопрос я для того чтобы использовать такие методы как getObgect() и newObject() использую вот такой код:
define('MODX_API_MODE', true); require_once '/путь_к_фалу/index.php';
Это правильно или нужно по-другому как то это делать?
но я так и не понял как мне вернуть: $modx->error->success('');
А что вернуть? Эту функцию вообще не принято самостоятельно вызывать. Она используется самим объектом $modx->error. И она не отдает какие-либо переменные собственного объекта, а возвращает обработанные параметры. К примеру можно вот так вызывать:
<?php print '<pre>'; print_r($modx->error->success('', $modx->getObject('modResource', 1)));
То есть здесь будет получен объект первого документа, но на выходе мы получим не сам объект, а массив данных этого объекта (в общем массиве ответа).
Мне кажется, вы в принципе не в том направлении роете. Изучайте стандартную конструкцию и все: gist.github.com/Fi1osof/328469331b5258ff009a
И ещё один вопрос я для того чтобы использовать такие методы как getObgect() и newObject() использую вот такой код:
Можно и так. Но в большинстве случаев правильно использовать коннекторы (которые в свою очередь уже вызывают процессоры). То, как показано у вас — это простой подход, но он не стандартизированный. Там нет стандартизированных проверок прав, форматов ответов и т.п.
Простите, если надоел своими вопросами. У меня такой вопрос, я посмотрел пример который вы привели и в целом по ему всё более менее понятно. Вот только класс ShopmodxWebGetlistProcessor расширяет встроенный класс modObjectGetListProcessor и переопределяет его методы. То бишь использует его алгоритм работы. Но мне нужно не используя стандартных процессоров исполнить действие. Может я не совсем правильно объяснил ситуацию по этому опишу что мне нужно сделать, так будет проще меня понять. У меня есть меню в админке (сделано на основании Doodles), в нем открывается список в виде таблицы, при вызове контекстного меню на элементе этой таблицы появляется пункт меню «Ответить» который отправляет письмо по адресу пункта выбранного элемента. Я проверял пост запрос который отправляется там есть все что мне нужно, но для того чтобы все работало нормально мне нужно возвратить событие success чтобы все работало нормально. Думаю итак понятно но я уточню, используется Ajax запрос.
Так а никто и не заставляет использовать мои процессоры. Используйте свои процессоры. Вот потому я выше и сказал, что правильней использовать запросы на коннекторы, потому что коннекторы вызывают процессоры, а процессоры возвращают стандартизированные ответы. Простейший процессор, которые вернет успешный ответ:
class myProcessor extends modProcessor{ // Эта функция автоматически выполняется MODX-ом и является основной public function process(){ $error = false; if($error){ return $this->error("Сообщение об ошибке"); } // else return $this->success("Успешно выполнено"); } } return "myProcessor";
Вызывайте этот процессор через коннектор, и будет вам счастье. MODX сам сформирует правильный JSON-ответ. Вот информация в помощь: modxclub.ru/blog/voprosy-spetsyalistov/136.html
Большое спасибо. Это то что я искал.

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