RealAdmin.ru

Работа с ресурсами в modx revolution

MODX
Категория: Сайтострой
19 апр 2015 г. в 21:49

Ресурс в modx это объект, содержащий стандартный набор полей, который может быть расширен за счёт TV-параметров. Отличительной особенностью ресурса является наличие уникального URL адреса по которому к нему можно обратиться.

Так как modx является фреймворком в оболочке движка, с ресурсами можно работать как через панель администрирования, так и посредством API (xPDO). API код в modx может выполняться в сниппетах, плагинах и даже PHP файлах, если предварительно в них подключить modx класс. Я же рекомендую начать изучение с выполнения команд через «Console». Этот компонент позволяет выполнять код не создавая сниппетов и плагинов. После его установки во вкладке «Приложения» появляется ссылка на редактор кода.

ресурсы в modx

Получение значения полей конкретного ресурса

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

$res = $modx->getObject('modResource',1);
echo $res->get('pagetitle');
return;

Если код запускается не из консоли, а непосредственно при доступе к ресурсу, то можно узнать значения его полей не указывая идентификатор.

$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');
return;

Изменение значения полей в modx

С получением значений полей разобрались, теперь давайте разберемся как их изменить.

$res = $modx->getObject('modResource',5);
$res->set('content', 'Изменили содрежимое');
$res->setTVValue('img-news','test.png');
$res->save();

Особенностью является то, что сначала мы производим действия над полями и только затем сохраняем изменения.

Выборка и обработка множества ресурсов

Modx revolution настолько гибок, что позволяет обрабатывать целые коллекции ресурсов, выбранных по определенным критериям.

Для примера давайте выберем все ресурсы родителя с идентификатором 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();
}

Практически любые поля могут участвовать в выборке. Все их можно посмотреть выполнив следующий код через консоль.

$res = $modx->getObject('modResource',1);
print('<pre>');
print_r($res->toArray());
print('</pre>');
return;

Нахождение связанных объектов

В modx все построено на объектах. Ими являются ресурсы, пользователи, чанки, TV-параметры. И всё это между собой связано. Получая в качестве объекта ресурс, мы можем найти связанный с ним чанк или родителя и работать уже с ним опять как с объектом. Есть два способа получения связанных объектов:

  • getOne() — получение единичного связанного объекта;
  • getMany() — получение массива связанных объектов одного типа;

Разница в том, что у объекта могут быть связи с другими объектами множественные и одинарные. Например, у ресурса может быть несколько TV-параметров, чтобы получить их все (в массив) необходимо использовать метод getMany(), а вот родитель может быть только один, поэтому для его получения используется getOne().

//получение родителя как объекта
$parent = $resource->getOne('parent');
//если нужен только id
$id = $resource->get('parent');

Создание ресурса из сниппета

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-поля.

Большинство информации взято из статей Ильи Уткина.

Теги:
Посмотрите похожее — 6
Комментарии —
  1. avatar Александр 28 июня 2018, 14:49 #
    Доброго дня! А не подскажите?
    Добавляли товары на сайт, и там в поле контент добавили не правильные таблицы. В них содержится лишняя конструкция вида
    <td> </td>
    <td> </td>
    <td> </td>
    <td> </td>
    <td> </td>
    <td> </td>
    <td> </td>
    <td> </td>
    <td> </td>
    <td> </td>
    <td width="0">
    <p> </p>
    </td>
    Хочу ее удалить из всех нужных подкатегорий, выполняю код
    <?php
    if(!$docs = $modx->getCollection('msProduct', array(
        'parent' => 635
    ))){return;}
    
    foreach($docs as $doc){
        $content = $doc->get('content');
        $content = str_replace('<td> </td>
    <td> </td>
    <td> </td>
    <td> </td>
    <td> </td>
    <td> </td>
    <td> </td>
    <td> </td>
    <td> </td>
    <td> </td>
    <td width="0">
    <p> </p>
    </td>','',$content);
        $doc->set('content',$content);
        $doc->save();
    }
    Но ничего не меняется, подскажите, что делаю не правильно?
    1. avatar Simkin Andrew 28 июня 2018, 15:44 #
      Тут str_replace не отрабатывает, он не работает со строками, где есть перенос строк. Погугли по запросу — preg_replace многострочный
    2. avatar xaker777 22 ноября 2017, 22:23 #
      где найти хорошие видео уроки modx revo хочу сделать блог хороших уроков нету ????
      1. avatar Simkin Andrew 23 ноября 2017, 10:32 #
        Не сталкивался. По видеоурокам обычно такие вещи не изучают. Хотя бы из-за того что примеры кода из видео нельзя скопировать, а перепечатать можно с ошибками и потом будут вопросы — почему же не работает как там.
      2. avatar Сергей 28 октября 2017, 10:54 #
        Скажите, можно ли в выборке getCollection указать глубину выборки для родителя?
        1. avatar Simkin Andrew 28 октября 2017, 11:41(был изменён) #
          Нет, выборка идёт по условию xPDOCriteria и там нельзя задавать глубинку. Для этой задачи лучше использовать вызов сниппета pdoResources в коде:
          $result = $modx->runSnippet('pdoResources', array(
          'parents'=>'26',
          'level'=>'3',
          'return' => 'json'
          ));
          В результате получаешь JSON массив со всеми ресурсами, отвечающими выборке.
          1. avatar Сергей 28 октября 2017, 12:23 #
            Спасибо
        2. avatar Максим 19 января 2017, 17:27 #
          Подскажите пожалуйста, как после создание ресурса редиректить его на него?
          1. avatar Simkin Andrew 19 января 2017, 20:37(был изменён) #
            Создаём ссылку для перенаправления из идентификатора созданного ресурса и перенаправляем по ней. Вроде так:
            $id = $newResource->get('id');
            $url = $modx->makeUrl($id);
            $modx->sendRedirect($url,array(
                'responseCode' => 'HTTP/1.1 301 Moved Permanently'
            ));
          2. avatar Сергей 09 января 2017, 17:28 #
            Не подскажете как заполнять TV поля при использовании resource/create?
            1. avatar Сергей 09 января 2017, 18:43 #
              извиняюсь, уже нашел в вашем тексте
            2. avatar Сергей 28 декабря 2016, 16:13 #
              Спасибо, уже решил немного по-другому, просто проставил вместо родителя шаблон, но все-равно спасибо, еще пригодится, я ранее тоже сталкивался с такой проблемой, и на других форумах часто такой вопрос задается, может к вам и заглянут за ответом), потому как ответа там не нашел.
              Часто заглядываю на эту страничку, написано просто и понятно
              1. avatar Сергей 28 декабря 2016, 13:53 #
                Скажите как указать getCollection несколько родителей 'parent' => 26,…
                1. avatar Simkin Andrew 28 декабря 2016, 16:06 #
                  Указываете в условии, что родитель должен совпадать с одним из элементов массива:
                  if(!$docs = $modx->getCollection('modResource', array(
                      'parent:IN' => array(26,27),
                  ))){return;}
                2. avatar Андрей 27 мая 2016, 20:36(был изменён) #
                  Спасибо за подсказки буду использовать MODX Revo API
                  © REALADMIN.RU   2018 г.
                  Страница сгенерирована: 0,2892 s | 10 mb.
                  На каком уровне Вы играете в шахматы?
                  О П Р О С
                  Home Question Top