Добрый день. Бьюсь уже который день, и никак не пойму причин. Делаю компонент, который расширяет базовый класс modResource. Сам компанент находится в корне папки сайта, путь к компоненту указан в настройках сайта, всё работает, при добавлении из админки тоже все работает. Необходимо реализоать возможность создания документа из фронтэнда. Для этого создал файл action.php, в нём прописал вызов метода из класса, В методе вызывается runProcessor создание документа. Так вот, проблема в том. Что при вызове у меня фатал ерор Cannot redeclare class. Ничего не понимаю, что я делаю не так, вызов процессора в консоле возвращает туже ошибку. Может я не правильно что-то делаю?
Полностью ошибку процитируйте. Какой именно класс не может быть повторно объявлен, в каком файле и на какой строчке.
Ошибка:
Fatal error: Cannot redeclare class StartupCreateProcessor in /home/offnotee/demoofby/core/components/startup/processors/mgr/create.class.php on line 47
вот сам класс
class StartupCreateProcessor extends modObjectCreateProcessor { public $objectType = 'Startup'; public $classKey = 'Startup'; public $languageTopics = array('startup'); public $description='012345|987642'; //public $permission = 'create'; /** * @return bool */ public function beforeSet() { $name = trim($this->getProperty('name')); if (empty($name)) { $this->modx->error->addField('name', $this->modx->lexicon('startup_item_err_name')); } elseif ($this->modx->getCount($this->classKey, array('name' => $name))) { $this->modx->error->addField('name', $this->modx->lexicon('startup_item_err_ae')); } return parent::beforeSet(); } /** * @return bool*/ public function beforeSave() { return parent::beforeSave(); } } return 'StartupCreateProcessor';
47 строка это закрывающаяся фигурная скобка.
Как вариант: может у вас класс не по фэншую называется. Попробуйте закомментировать return 'StartupCreateProcessor';
и выполнить $modx->runProcessor() на него. Если название не соответствует принципу именований классов-процессоров MODX-а, то вы должны получить ошибку его вызова, потому как MODX не будет знать какой класс он вызывает.
2.
Для этого создал файл action.php, в нём прописал вызов метода из класса, В методе вызывается runProcessor создание документа.
Вот этот свой action.php еще покажите. И у вас точно нигде нет подгрузок методом require/include вместо require_once/include_once?
return закоментил, без результатно.
поиском проверил, во всех файлах require_once.
мой action.php
if (empty($_REQUEST['action'])) { die('Access denied'); } else { $action = $_REQUEST['action']; } define('MODX_API_MODE', true); require_once dirname(dirname(dirname(dirname(dirname(__FILE__))))) . '/index.php'; $modx->getService('error', 'error.modError'); $modx->getRequest(); $modx->setLogLevel(modX::LOG_LEVEL_ERROR); $modx->setLogTarget('FILE'); $modx->error->message = null; // Get properties $properties = array(); /* @var Startup $Startup */ define('MODX_ACTION_MODE', true); $Startup = $modx->getService('startup', 'Startup', $modx->getOption('startup_core_path', null, $modx->getOption('core_path') . 'components/startup/') . 'model/startup/', $properties); if ($modx->error->hasError() || !($Startup instanceof Startup)) { die('Error'); } switch ($action) { case 'projekt/save': $response= $Startup->saveProjekt($_POST); break; default: $message = $_REQUEST['action'] != $action ? 'startup_err_register_globals' : 'startup_err_unknown'; $response = $modx->toJSON(array('success' => false, 'message' => $modx->lexicon($message))); } if (is_array($response)) { $response = $modx->toJSON($response); } //@session_write_close(); exit($response);
что-то я упустил, вот что.
Всё никак не поборю эти процессоры…
Что-то я совсем не въеду, а зачем все так усложнять? Почему вы не через коннекторы вызываете конечный процессор? И я так понимаю, вы сам процессор в итоге вызываете в своем классе в методе saveProjekt()? А зачем? И дайте еще листинг вашего этого класса. Подозреваю, что именно там проблема.
если честно, я не знаю как правильно, информация разрозненная, одни говорят одно, другие пишут другое. Смотрел в разные компоненты, в общем вот мой ****код класса,
susepaste.org/7159512
не судите строго.
Еще раз перечитайте, что я писал:
Как вариант: может у вас класс не по фэншую называется. Попробуйте закомментировать return 'StartupCreateProcessor'; и выполнить $modx->runProcessor() на него. Если название не соответствует принципу именований классов-процессоров MODX-а, то вы должны получить ошибку его вызова, потому как MODX не будет знать какой класс он вызывает.
У вас:
require_once MODX_CORE_PATH . 'components/startup/processors/mgr/create.class.php'; require_once MODX_CORE_PATH . 'components/startup/processors/mgr/update.class.php';
И далее вы делаете:
public function saveProjekt($data = array()){ print_r($data); $response = $this->xpdo->runProcessor('mgr/create', $data,array('processors_path' => $this->xpdo->getOption('startup_core_path', null, $this->xpdo->getOption('core_path') . 'components/startup/') .'processors/'),$data);
И в итоге что получаем?
вы сам процессор в итоге вызываете в своем классе в методе saveProjekt()? А зачем? И дайте еще листинг вашего этого класса. Подозреваю, что именно там проблема.
Проблема ваша в том, что вы намешали в кучу в один файл сразу несколько, по сути разрозненных, технологий. Вы расширяете класс modResource, но это следует делать только в тех случаях, когда вы пытаетесь получить свой CRC, то есть Custom Resource Class — расширенный класс ресурса. И судя по части методов в вашем классе это вы и пытались сделать. Но, если вы хотите использовать свои процессоры для обновления ваших документов, то документы ваши должны быть с вашим class_key. Тогда при вызове системного процессора resource/update будет вызываться ваш процессор на обновление документа, при условии что имя процессора соответствует маске.
Вы же плюс ко всему пытаетесь еще вызвать принудительно процессор на обновление через $modx->runProcessor(). Класс процессора у вас уже подгружен, MODX не может опять его подгрузить ибо require_once и получается фигня.
Вся проблема в том, что я не знаю как это правильно делать. Вроде и документация есть, и написано там понятно, но при попытках что-нибудь сделать, а это что-нибудь выходит далеко за рамки того, что в примерах документации. Да, вы правы. Я делаю CRC и оно даже работает, не смотря на весь печальный код, из админки, всё создаётся, добавляются связанные записи в таблицу. Но это из админки. А мне надо что бы пользователь добавлял, с сайта, а тут надо делать все через процессоры, ведь это правильно. Но я не понимаю некоторых принципов. Что ж буду грызть гранит науки, в глубине души тая надежду, что кто-нибудь «засветит» правильный путь, логику и принцип работы. А ещё надеюсь, что когда я разберусь, не стану молчать, а напишу, что бы помочь другим. Спасибо, Николай, ваш последний комментарий натолкнул меня на кое-какие мысли. Буду искать такой же, но с перламутровыми пуговицами.
Установите чистый модуль shopModx. Вместе с ним устанавливаются CRC типа ShopmodxResourceProduct (тип документа товар). При создании/редактировании товаров выполняется кастомный процессор, расширяющий modResource[Create/Update]Processor. Посмотрите что и как там работает, проследите весь путь запроса от отправки запроса на сохранение документа и до получения ответа. Там не все по фэншую, так как делалось более двух лет назад, но в целом боле менее соответствует внутреннему принципу MODX.