Благодарю за ссылки буду разбираться.

  1. Пишите ответом, чтобы я оперативно получал уведомления о комментах.
  2. Тот топик очень старый, писался еще до появления новой версии процессоров. И вообще раньше много чего. В результате, лучше изучите это: community.modx-cms.ru/blog/modx-xpdo/11035.html Там как раз пример с использованием более современных технологий, а главное — пакета CMPGenerator, который позволит вам быстро сгенерировать модель пакета из готовой таблицы, а не пользоваться «модификацией моей модификации возможно чьей-то модификации» скрипта для генерации модели. И вообще изучите все статьи Ильи в разделе xPDO, так как вам сейчас явно не хватает понимания работы процессоров и xPDO в целом. Потратьте основательно на это день, и завтра уже будете понимать, как все просто. P.S. Ошибка возникает именно в классе процессора, поэтому и надо изучить процессоры. А в указанной статье Ильи так же написано как подключать пакеты через $modx->addExtensionPackage() или через настройки, чтобы он всегда был виден MODX-у.

В последнее время все чаще и чаще в MODX используются источники файлов (Media Source). Хочу на заметку продемонстрировать пару примеров, чтобы показать, насколько это удобный инструмент. Следует отметить, что с медиасурсами можно работать не только в связке с TV-параметрами и статическими элементами, а как с самостоятельными объектами для формирования УРЛ и прочих путей до файлов. Итак, примеры. Инициализируем медиасурс. $id = 2; // ID медиасурса // Получаем объект $source = $modx->getObject('sources.modMediaSource', $id); // Инициализируем $source->initialize(); Сила xPDO в том, что вам не приходится заморачиваться какой именно тип медиасурса используется, будь то файловая система, облака AmazonS3 или какие-либо свои кастомные, расширяющие modMediaSource. Данные всех медиасурсов хранятся в одной таблице, и xPDO сам определит, какой именно тип объекта будет возвращен в $modx->getObject('sources.modMediaSource', $id); Подробней о том, как это происходит, написано здесь: http://modxclub.ru/blog/166.html Здесь стоит более внимательно изучить $source->initialize(); Дело в том, что modFileMediaSource — это производный класс от modMediaSource, и есть отличия в инициализации этих объектов. Вот метод modMediaSource::initialize public function initialize() { $this->setProperties($this->getProperties(true)); $this->getPermissions(); return true; } А вот метод modFileMediaSource::initialize public function initialize() { parent::initialize(); $options = array(); if (!$this->ctx) { $this->ctx =& $this->xpdo->context; } $options['context'] = $this->ctx->get('key'); $this->fileHandler = $this->xpdo->getService('fileHandler','modFileHandler', '',$options); return true; } То есть если у нас файловый медиасурс, и мы до инициализации не присвоили ему определенный контекст, то будет присвоен текущий контекст. Это важно учитывать, так как медиасурс получает многие настройки из указанного контекста, а в различных контекстах эти настройки могут отличаться. Так же могут проверяться различные уровни доступов к контекстам. Инииализация амазоновского медиасурса так же отличается. public function initialize() { parent::initialize(); $properties = $this->getPropertyList(); if (!defined('AWS_KEY')) { define('AWS_KEY',$this->xpdo->getOption('key',$properties,'')); define('AWS_SECRET_KEY',$this->xpdo->getOption('secret_key',$properties,'')); /* (Not needed at this time) define('AWS_ACCOUNT_ID',$modx->getOption('aws.account_id',$config,'')); define('AWS_CANONICAL_ID',$modx->getOption('aws.canonical_id',$config,'')); define('AWS_CANONICAL_NAME',$modx->getOption('aws.canonical_name',$config,'')); define('AWS_MFA_SERIAL',$modx->getOption('aws.mfa_serial',$config,'')); define('AWS_CLOUDFRONT_KEYPAIR_ID',$modx->getOption('aws.cloudfront_keypair_id',$config,'')); define('AWS_CLOUDFRONT_PRIVATE_KEY_PEM',$modx->getOption('aws.cloudfront_private_key_pem',$config,'')); define('AWS_ENABLE_EXTENSIONS', 'false');*/ } include_once $this->xpdo->getOption('core_path',null,MODX_CORE_PATH).'model/aws/sdk.class.php';

$this->getDriver();
$this->setBucket($this->xpdo->getOption('bucket',$properties,''));
return true;

} То есть здесь инициализируются ключи взаимодействия с облаком. Итак, медиасурс мы проинициализировали. Что теперь мы можем с ним сделать? А теперь мы его используем по назначению. К примеру получим путь до корневого раздела. $source->getBasePath(); Посмотрим на этот метод в modMediaSource public function getBasePath($object = '') { return ''; } То есть сам по себе этот объект нам ничего не вернет. Посмотрим в modFileMediaSource public function getBasePath($object = '') { $bases = $this->getBases($object); return $bases['pathAbsolute']; } Вот он уже нам вернет абсолютный путь до корневой папки. А вот облачный медиасурс нам тоже ничего не сообщит о корневом разделе, так как не имеет своего метода getBasePath, а наследует «пустой» метод от modMediaSource. А вот УРЛ до файла нам вернет файловый, и облачный медиасурс. $url = $source->getObjectUrl('images/image.png'); Так же можно узнать базовый УРЛ до корневого раздела. $url = $source->getBaseUrl(); В общем поковыряйте на досуге эти объекты. Они могут очень даже пригодиться.

Наверняка многие слышали о «классных» процессорах, но не каждый знает о том, какие фишки в них есть. Вот небольшой пример того, как в процессоре можно «переключиться» на другой процессор, а точнее вернуть инстанс другого выполняемого процессора. // Запросы из браузера идут на один и тот же коннектор (и потом на процессор), чтобы получить список компаний или сотрудников компаний

// Процессор-свитч в файле процессора class CompaniesUsersGetListProcessor extends modProcessor{ // Статический метод процессора, который может подменить выполняемый процессор public static function getInstance(modX &$modx,$className,$properties = array()) { switch($properties['type']){ // Если тип - company, то подгружаем другой класс, который сформирует список пользователей case 'company': $className = require_once dirname(FILE).'/users/getlist.class.php'; break; default: // Если запрашиваемый раздел - корень - выполняем процессор списка компаний if($properties['id'] == 'root'){ $className = 'CompaniesGetListProcessor'; } } // Возвращаем инстанс актуального процессора // Если $className не перегрузили, то возвращается инстанс текущего класса и в результате выполнится его метод process(), который вернет ошибку return new $className($modx, $properties); }

public function process() {
    return $this->failure('Неверные данные');
}

}

Выкладываю первый свой урок с озвучкой. Озвучка конечно же далеко не на отлично (я же не диктор), но зато урок довольно большой получился, и надеюсь, будет полезен многим.

Недавно вышла новость о выходе MODX Evolution 1.0.8, и Макс предупреждал: Крайне рекомендуется всем обновиться. Повторюсь: лучше обновиться. В последних двух версиях боролись с критическими уязвимостями в плагине «Forgot Manager Login». MODx Evolution 1.0.8 (Jan 08, 2013)

— Security: — * [#9391] Prevent hash array exploit in Forgot Manager Login plugin

MODx Evolution 1.0.7 (Nov 26, 2012)

— Security: — * Prevent users from unblocking themselves in Forgot Manager Login plugin

  • [#9175] Escape $hash in Forgot Manager Login plugin Результат уязвимости здесь: community.modx-cms.ru/blog/security/9526.html Судя по всему, речь идет о роботе, который бродит по Инету и тупо ломает Evo-сайты. То есть вероятность того, что и ваш сайт зацепит, довольно большая. Я бы на вашем месте вообще отключил этот плагин.

Вот и вышла новая версия консоли с поддержкой Ace-а, да что proxyfabio отдельное спасибо (все доработки пакета полностью выполнил Сергей). ? В общем новая версия консоли замечательно дружит с Ace (за сам компонент и подсказку спасибо danik ). Просто ставите Ace, ставите console, и все замечательно работает. Заметка 1: Если не ставите Ace, консоль работает, но нет подсветки кода, табуляции и т.п., но Ctrl+Enter работает. Заметка 2: CodeMirror пока не поддерживается. Заметка 2: если кто устанавливал модифицированный Ace из моего репозитория для поддержки старой версии консоли, удаляйте его и ставьте официальный. UPD: Пакет Console доступен для загрузки в официальном репозитории modx.com Проект на GitHub: github.com/Fi1osof/modx-console UPD 2: Для работы с консолью требуются права console. Если у вас SUDO-пользователь, то ничего не требуется. Для не SUDO-пользователей в политику надо дописать права console.

Версия: 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 я не силен, но базовие понятия ООП я имею.

Да, сообщение видел, но еще детально не изучал, занят пока. Но это не ошибка, это как бы недоработка. То есть с вашей стороны не стояло задачи пересчета при различных вариантах доставки. Но более предметно скажу позже, когда отработаю тикет.

Спасибо большое за разъяснение! Сегодня буду пробовать. Думаю, что будут ещё вопросы по галерее. Обнаружилась ошибка в корзине — написала в Планфикс.