virdignus 25 марта 2015 0 9
Добрый день. Бьюсь уже который день, и никак не пойму причин. Делаю компонент, который расширяет базовый класс modResource. Сам компанент находится в корне папки сайта, путь к компоненту указан в настройках сайта, всё работает, при добавлении из админки тоже все работает. Необходимо реализоать возможность создания документа из фронтэнда. Для этого создал файл action.php, в нём прописал вызов метода из класса, В методе вызывается runProcessor создание документа. Так вот, проблема в том. Что при вызове у меня фатал ерор Cannot redeclare class. Ничего не понимаю, что я делаю не так, вызов процессора в консоле возвращает туже ошибку. Может я не правильно что-то делаю?
9 комментариев
Fi1osof1
Fi1osof 25 марта 2015г в 02:55 #
Полностью ошибку процитируйте. Какой именно класс не может быть повторно объявлен, в каком файле и на какой строчке.
v
virdignus 25 марта 2015г в 16:57 #
Ошибка:
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 строка это закрывающаяся фигурная скобка.
Fi1osof1
Fi1osof 25 марта 2015г в 20:09 #
Как вариант: может у вас класс не по фэншую называется. Попробуйте закомментировать return 'StartupCreateProcessor';
и выполнить $modx->runProcessor() на него. Если название не соответствует принципу именований классов-процессоров MODX-а, то вы должны получить ошибку его вызова, потому как MODX не будет знать какой класс он вызывает.

2.
Для этого создал файл action.php, в нём прописал вызов метода из класса, В методе вызывается runProcessor создание документа.
Вот этот свой action.php еще покажите. И у вас точно нигде нет подгрузок методом require/include вместо require_once/include_once?
v
virdignus 26 марта 2015г в 17:38 #
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);


что-то я упустил, вот что.
Всё никак не поборю эти процессоры…
Fi1osof1
Fi1osof 26 марта 2015г в 18:55 #
Что-то я совсем не въеду, а зачем все так усложнять? Почему вы не через коннекторы вызываете конечный процессор? И я так понимаю, вы сам процессор в итоге вызываете в своем классе в методе saveProjekt()? А зачем? И дайте еще листинг вашего этого класса. Подозреваю, что именно там проблема.
v
virdignus 26 марта 2015г в 23:53 #
если честно, я не знаю как правильно, информация разрозненная, одни говорят одно, другие пишут другое. Смотрел в разные компоненты, в общем вот мой ****код класса,
susepaste.org/7159512
не судите строго.
Fi1osof1
Fi1osof 27 марта 2015г в 00:15 #
Еще раз перечитайте, что я писал:
Как вариант: может у вас класс не по фэншую называется. Попробуйте закомментировать 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 и получается фигня.
v
virdignus 28 марта 2015г в 22:43 #
Вся проблема в том, что я не знаю как это правильно делать. Вроде и документация есть, и написано там понятно, но при попытках что-нибудь сделать, а это что-нибудь выходит далеко за рамки того, что в примерах документации. Да, вы правы. Я делаю CRC и оно даже работает, не смотря на весь печальный код, из админки, всё создаётся, добавляются связанные записи в таблицу. Но это из админки. А мне надо что бы пользователь добавлял, с сайта, а тут надо делать все через процессоры, ведь это правильно. Но я не понимаю некоторых принципов. Что ж буду грызть гранит науки, в глубине души тая надежду, что кто-нибудь «засветит» правильный путь, логику и принцип работы. А ещё надеюсь, что когда я разберусь, не стану молчать, а напишу, что бы помочь другим. Спасибо, Николай, ваш последний комментарий натолкнул меня на кое-какие мысли. Буду искать такой же, но с перламутровыми пуговицами.
Fi1osof1
Fi1osof 28 марта 2015г в 22:51 #
Установите чистый модуль shopModx. Вместе с ним устанавливаются CRC типа ShopmodxResourceProduct (тип документа товар). При создании/редактировании товаров выполняется кастомный процессор, расширяющий modResource[Create/Update]Processor. Посмотрите что и как там работает, проследите весь путь запроса от отправки запроса на сохранение документа и до получения ответа. Там не все по фэншую, так как делалось более двух лет назад, но в целом боле менее соответствует внутреннему принципу MODX.
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.