Обработка ресурсов в MODX срдествами API

Ресурс в modx это объект со стандартным набором полей, который может быть расширен за счёт TV-параметров. Отличительной особенностью ресурса является наличие уникального URL адреса по которому к нему можно обратиться.
- Получение полей по ID ресурса
- Как изменить значение поля
- Перебор и обработка ресурсов
- Получение обработанного содержимого
- Нахождение связанных объектов
- Создание нового ресурса на API
Так как modx является фреймворком в оболочке движка, с ресурсами можно работать как через панель администрирования, так и посредством API (xPDO). API код может выполняться в сниппетах, плагинах и даже из PHP файлов. Я же рекомендую начать изучение с выполнения команд через дополнение «Console». Этот компонент позволяет быстро выполнять код без создания сниппетов. После его установки во вкладке «Приложения» появляется ссылка на редактор кода.
Получение полей по ID ресурса
Для получения доступа к полям ресурса, необходимо его выбрать по уникальному идентификатору.
$id = 1; $res = $modx->getObject('modResource', $id); echo $res->get('pagetitle');
Если код запускается в сниппете при обращении к ресурсу, то можно использовать другой вариант:
$modx->resource->get('pagetitle'); $modx->resource->get('content'); //или $modx->resource->getContent();
Получение TV-переменных:
//текущего ресурса по id $modx->resource->getTVValue(3); //по названию TV-параметра $modx->resource->getTVValue('img-news'); //получение значения конкретного ресурса $res = $modx->getObject('modResource',1); echo $res->getTVValue('img-news');
Сформировать URL по ID:
$url = $modx->makeUrl($id);
Как изменить значение поля
Для изменения стандартных полей используется метод — «set», а для дополнительных — «setTVValue».
$res = $modx->getObject('modResource',5); $res->set('content', 'Изменили содрежимое'); $res->setTVValue('img-news','test.png'); $res->save();
Если меняются только TV-поля, то для сохранения изменений достаточно «setTVValue».
Перебор и обработка ресурсов
API MODX позволяет выбрать ресурсы по определенным критериям и последовательно их обработать. Для примера выберем зададим следующие значения для фильтра:
- родительский ресурс c ID 26;
- обязательно опубликован;
- не удалён;
- доступен для поиска.
Заменим в их тексте все одинарные кавычки на двойные.
if(!$docs = $modx->getCollection('modResource', array( 'parent' => 26, 'published' => 1, 'deleted' => 0, 'searchable' => 1 ))){return;} foreach($docs as $doc){ $content = $doc->get('content'); $content = str_replace('\'','"',$content); $doc->set('content',$content); $doc->save(); }
Чтобы указать несколько родителей, используйте конструкцию: 'parent:IN' => array(26,27)
Весь перечень доступных полей можно посмотреть выполнив через консоль следующий код:
$res = $modx->getObject('modResource',1); print('<pre>'); print_r($res->toArray()); print('</pre>'); return;
Получение обработанного содержимого
Если внутри ресурса содержимое формируется из чанков и сниппетов, а требуется получить сформированный html код, то воспользуйтесь этим решением:
$content = $resource->get('content'); $modx->resource = & $resource; if (!empty($content)) { // get the max iterations tags are processed before processing is terminated $maxIterations= (integer) $modx->getOption('parser_max_iterations', null, 10); // parse all cacheable tags first $modx->getParser()->processElementTags('', $content, false, false, '', array(), $maxIterations); // parse all non-cacheable and remove unprocessed tags $modx->getParser()->processElementTags('', $content, true, true, '', array(), $maxIterations); }
В переменной «$content» будет готовая html разметка.
Нахождение связанных объектов
В modx все построено на объектах. Ими являются ресурсы, пользователи, чанки, TV-параметры. И всё это между собой связано. Получая в качестве объекта ресурс, мы можем найти связанный с ним чанк или родителя и работать уже с ним опять как с объектом. Есть два способа получения связанных объектов:
- getOne() — получение единичного связанного объекта;
- getMany() — получение массива связанных объектов одного типа;
Разница в том, что у объекта могут быть связи с другими объектами множественные и одинарные. Например, у ресурса может быть несколько TV-параметров, чтобы получить их все (в массив) необходимо использовать метод getMany(), а вот родитель может быть только один, поэтому для его получения используется getOne().
//получение родителя как объекта $parent = $resource->getOne('parent'); //если нужен только id $id = $resource->get('parent');
Создание нового ресурса на API
API modx позволяет программно создавать новые ресурсы. Для этого достаточно запустить стандартный процессор (функцию). В качестве параметров передаём любые значения полей создаваемого ресурса.
$response = $modx->runProcessor('resource/create', array( 'pagetitle' => 'Тестовая страница', 'longtitle' => '', 'description' => '', 'introtext' => '', 'content' => 'Содержимое тестовой страницы', 'alias' => 'new-page', 'template' => 1, 'published' => 1, 'parent' => 0 )); if ($response->isError()) { return $modx->error->failure($response->getMessage()); } //получаем в качестве объекта вновь созданную страницу $newResource = $response->response['object'];
Если требуется заполнить TV-поля, то процессору дополнительно передаются параметры вида tv1 = 'значение', где 1 — это идентификатор TV-поля.
Часто заглядываю на эту страничку, написано просто и понятно
В результате получаешь JSON массив со всеми ресурсами, отвечающими выборке.
Добавляли товары на сайт, и там в поле контент добавили не правильные таблицы. В них содержится лишняя конструкция вида
Хочу ее удалить из всех нужных подкатегорий, выполняю код
Но ничего не меняется, подскажите, что делаю не правильно?
Ну и помним о предварительном создании резервной копии базы данных
PS
adblock отключил, рекламой интересуюсь ;)
Подскажите код для вставки в сниппет.
Нужно выполнить код, если ID ресурса равно 10
Подскажите пожалуйста как на примере данного кода сделать генератор страниц с 2-3 переменными?
Спасибо.
Нужна генерация страниц
заголовок q1 a1, q1 a2, q1 a3…
описание…
содержимое «Нам нравится q1, поэтому a1....» и т.п.
Но а как будет осуществляться ротация переменных? Или тоже вручную все делать? А если переменных 10-20-100?