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

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

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

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

ресурсы в modx

Получение полей по 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-поля.

Темы:
MODX
Ещё интересное — 6
Комментарии —
  1. Андрей
    Андрей27 мая 2016, 20:36(был изменён)#
    Спасибо за подсказки буду использовать MODX Revo API
    1. Сергей
      Сергей28 декабря 2016, 13:53#
      Скажите как указать getCollection несколько родителей 'parent' => 26,…
      1. Andy Si28 декабря 2016, 16:06#
        Указываете в условии, что родитель должен совпадать с одним из элементов массива:
        if(!$docs = $modx->getCollection('modResource', array(
            'parent:IN' => array(26,27),
        ))){return;}
      2. Сергей
        Сергей28 декабря 2016, 16:13#
        Спасибо, уже решил немного по-другому, просто проставил вместо родителя шаблон, но все-равно спасибо, еще пригодится, я ранее тоже сталкивался с такой проблемой, и на других форумах часто такой вопрос задается, может к вам и заглянут за ответом), потому как ответа там не нашел.
        Часто заглядываю на эту страничку, написано просто и понятно
        1. Сергей
          Сергей09 января 2017, 17:28#
          Не подскажете как заполнять TV поля при использовании resource/create?
          1. Сергей
            Сергей09 января 2017, 18:43#
            извиняюсь, уже нашел в вашем тексте
          2. Максим
            Максим19 января 2017, 17:27#
            Подскажите пожалуйста, как после создание ресурса редиректить его на него?
            1. Andy Si19 января 2017, 20:37(был изменён)#
              Создаём ссылку для перенаправления из идентификатора созданного ресурса и перенаправляем по ней. Вроде так:
              $id = $newResource->get('id');
              $url = $modx->makeUrl($id);
              $modx->sendRedirect($url,array(
                  'responseCode' => 'HTTP/1.1 301 Moved Permanently'
              ));
            2. Сергей
              Сергей28 октября 2017, 10:54#
              Скажите, можно ли в выборке getCollection указать глубину выборки для родителя?
              1. Andy Si28 октября 2017, 11:41(был изменён)#
                Нет, выборка идёт по условию xPDOCriteria и там нельзя задавать глубинку. Для этой задачи лучше использовать вызов сниппета pdoResources в коде:
                $result = $modx->runSnippet('pdoResources', array(
                'parents'=>'26',
                'level'=>'3',
                'return' => 'json'
                ));
                В результате получаешь JSON массив со всеми ресурсами, отвечающими выборке.
                1. Сергей
                  Сергей28 октября 2017, 12:23#
                  Спасибо
              2. xaker777
                xaker77722 ноября 2017, 22:23#
                где найти хорошие видео уроки modx revo хочу сделать блог хороших уроков нету ????
                1. Andy Si23 ноября 2017, 10:32#
                  Не сталкивался. По видеоурокам обычно такие вещи не изучают. Хотя бы из-за того что примеры кода из видео нельзя скопировать, а перепечатать можно с ошибками и потом будут вопросы — почему же не работает как там.
                2. Александр
                  Александр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. Andy Si28 июня 2018, 15:44#
                    Тут str_replace не отрабатывает, он не работает со строками, где есть перенос строк. Погугли по запросу — preg_replace многострочный
                  2. Amsterdam
                    Amsterdam29 марта 2019, 13:26#
                    Напугал меня твой призрак!!;))
                    1. mr
                      mr04 августа 2019, 10:37#
                      А как найти ресурсы с определенным значением TV и удалить их?
                      1. Andy Si04 августа 2019, 16:30#
                        Примерно так:
                        if(!$docs = $modx->getCollection('modResource', array(
                            'deleted' => 0
                        ))){return;}
                        
                        foreach($docs as $doc){
                            $id = $doc->get('id');
                            if ($doc->getTVValue('image') == '0.jpg') {
                                $modx->runProcessor('resource/delete', array('id' => $id));
                            }
                        }
                        Ну и помним о предварительном создании резервной копии базы данных
                        1. mr
                          mr04 августа 2019, 18:24#
                          Шикарно, спасибо!

                          PS

                          adblock отключил, рекламой интересуюсь ;)
                          1. Andy Si05 августа 2019, 18:55#
                            lol, ну отлично))
                      2. Артём
                        Артём16 июля 2020, 14:20#
                        Добрый день.

                        Подскажите код для вставки в сниппет.
                        Нужно выполнить код, если ID ресурса равно 10
                        1. Andy Si16 июля 2020, 19:29(был изменён)#
                          if ($modx->resource->getId()==10){}
                        2. Vasiliy
                          Vasiliy18 марта 2021, 11:37#
                          Добрый день.
                          Подскажите пожалуйста как на примере данного кода сделать генератор страниц с 2-3 переменными?
                          Спасибо.
                          1. Andy Si18 марта 2021, 12:44#
                            Добрый день. Не разобрал суть вопроса. Если имеется ввиду, чтобы заполнять несколько TV полей, то просто продублировать:
                            $res->setTVValue('img-1','test.png');
                            $res->setTVValue('img-2','test.png');
                            $res->setTVValue('img-3','test.png');
                            
                          2. Vasiliy
                            Vasiliy18 марта 2021, 12:51#
                            Допустим есть переменные q1 q2 q3 и a1 a2 a3
                            Нужна генерация страниц
                            заголовок q1 a1, q1 a2, q1 a3…
                            описание…
                            содержимое «Нам нравится q1, поэтому a1....» и т.п.
                            1. Andy Si18 марта 2021, 13:24#
                              Не понимаю в чём проблема. Просто 3 раза скопируй код создания страницы и подставь в нужные места переменные. Если дело в незнании PHP, то переменные там вставляются через точку, примерно так:
                              'content' => 'Нам нравится ' . $q1 . ', поэтому ' . $a1 . '...',
                            2. Vasiliy
                              Vasiliy18 марта 2021, 13:50(был изменён)#
                              спасибо!)
                              Но а как будет осуществляться ротация переменных? Или тоже вручную все делать? А если переменных 10-20-100?
                              © REALADMIN.RU   2024 г.
                              Страница сгенерирована: 0,2453 s | 6 mb.
                              На каком уровне Вы играете в шахматы?
                              OPROS