savks 21 августа 2013 0 11
Здравствуйте мне нужно сделать пункт в меню для обратной связи с добавлением данных в базу данных. Моя проблема заключается в том что мне нужно вызвать с контекстно меню свой скрипт но мне видает ошибку:

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('');

?>


Прошу помочь кто знает.
11 комментариев
Fi1osof1
Fi1osof 21 августа 2013г в 18:55 #
1. Какая версия MODX-а? Полностью.
2. Вам php четко выдает ошибку: Catchable fatal error: Argument 1 passed to Doodles::__construct() must be an instance of modX, null given, called in. Не был передан параметр $modx в процессор.
s
savks 22 августа 2013г в 14:03 #
Версия: 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 я не силен, но базовие понятия ООП я имею.
Fi1osof1
Fi1osof 22 августа 2013г в 16:28 #
1. Пишите ответом, чтобы я оперативно получал уведомления о комментах.
2. Тот топик очень старый, писался еще до появления новой версии процессоров. И вообще раньше много чего. В результате, лучше изучите это: community.modx-cms.ru/blog/modx-xpdo/11035.html
Там как раз пример с использованием более современных технологий, а главное — пакета CMPGenerator, который позволит вам быстро сгенерировать модель пакета из готовой таблицы, а не пользоваться «модификацией моей модификации возможно чьей-то модификации» скрипта для генерации модели.
И вообще изучите все статьи Ильи в разделе xPDO, так как вам сейчас явно не хватает понимания работы процессоров и xPDO в целом. Потратьте основательно на это день, и завтра уже будете понимать, как все просто.

P.S. Ошибка возникает именно в классе процессора, поэтому и надо изучить процессоры. А в указанной статье Ильи так же написано как подключать пакеты через $modx->addExtensionPackage() или через настройки, чтобы он всегда был виден MODX-у.
s
savks 22 августа 2013г в 16:38 #
Благодарю за ссылки буду разбираться.
Fi1osof1
Fi1osof 22 августа 2013г в 16:40 #
На здоровье.
s
savks 23 августа 2013г в 11:51 #
Я перечитал предоставленный вами материал, информация полезная так что добавил в избранное, но я так и не понял как мне вернуть:


$modx->error->success('');


, в пользовательских скриптах.
И ещё один вопрос я для того чтобы использовать такие методы как getObgect() и newObject() использую вот такой код:

define('MODX_API_MODE', true);
require_once '/путь_к_фалу/index.php';


Это правильно или нужно по-другому как то это делать?
Fi1osof1
Fi1osof 23 августа 2013г в 12:23 #
но я так и не понял как мне вернуть:
$modx->error->success('');
А что вернуть? Эту функцию вообще не принято самостоятельно вызывать. Она используется самим объектом $modx->error. И она не отдает какие-либо переменные собственного объекта, а возвращает обработанные параметры. К примеру можно вот так вызывать:
<?php
print '<pre>';
print_r($modx->error->success('', $modx->getObject('modResource', 1)));

То есть здесь будет получен объект первого документа, но на выходе мы получим не сам объект, а массив данных этого объекта (в общем массиве ответа).

Мне кажется, вы в принципе не в том направлении роете. Изучайте стандартную конструкцию и все: gist.github.com/Fi1osof/328469331b5258ff009a

И ещё один вопрос я для того чтобы использовать такие методы как getObgect() и newObject() использую вот такой код:
Можно и так. Но в большинстве случаев правильно использовать коннекторы (которые в свою очередь уже вызывают процессоры). То, как показано у вас — это простой подход, но он не стандартизированный. Там нет стандартизированных проверок прав, форматов ответов и т.п.
s
savks 23 августа 2013г в 13:29 #
Простите, если надоел своими вопросами. У меня такой вопрос, я посмотрел пример который вы привели и в целом по ему всё более менее понятно. Вот только класс ShopmodxWebGetlistProcessor расширяет встроенный класс modObjectGetListProcessor и переопределяет его методы. То бишь использует его алгоритм работы. Но мне нужно не используя стандартных процессоров исполнить действие. Может я не совсем правильно объяснил ситуацию по этому опишу что мне нужно сделать, так будет проще меня понять.
У меня есть меню в админке (сделано на основании Doodles), в нем открывается список в виде таблицы, при вызове контекстного меню на элементе этой таблицы появляется пункт меню «Ответить» который отправляет письмо по адресу пункта выбранного элемента. Я проверял пост запрос который отправляется там есть все что мне нужно, но для того чтобы все работало нормально мне нужно возвратить событие success чтобы все работало нормально. Думаю итак понятно но я уточню, используется Ajax запрос.
Fi1osof1
Fi1osof 23 августа 2013г в 13:37 #
Так а никто и не заставляет использовать мои процессоры. Используйте свои процессоры. Вот потому я выше и сказал, что правильней использовать запросы на коннекторы, потому что коннекторы вызывают процессоры, а процессоры возвращают стандартизированные ответы.
Простейший процессор, которые вернет успешный ответ:
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
s
savks 23 августа 2013г в 17:50 #
Большое спасибо. Это то что я искал.
Fi1osof1
Fi1osof 23 августа 2013г в 18:52 #
Пожалуйста.
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.