Обновление ресурса типа JSON

1. Имеется бд игровых предметов (Items), в которую с течением времени могут добавляться новые записи.
2. Имеется PHP скрипт, который собирает из БД названия предметов в JSON (на данный момент во внешний ресурс) для Автозаполнения Input
3. Из-за проблем с кешированием, при изменении/добавлении предметов в БД, хочу записывать данные в ресурс MODX

4. Ресурс добавляю с помощью универсального сниппета:
$document = $modx->newObject('modResource');
$document->set('createdby', $modx->user->get('id'));// - присваиваем автора ресурсу.
$document->set('template', '1');// - присваиваем шаблон ресурсу.
$document->set('isfolder', '0');// - новый ресурс не будет контейнером.
$document->set('hidemenu', '1');
$document->set('published', '1');// - будет опубликован.
$document->set('createdon', time());// - дата создания контента.
$document->set('pagetitle', $name);// - заголовок материала.
$document->set('alias', $name);// - псевдоним для ссылки.
$document->set('description', 'Items IDs');// - описание, description.
$document->setContent($data);// - содержимое ресурса.
$document->set('parent', $parent);// - идентификатор родителя.
$document->save();// - сохраняем материал.
Работает отлично, но есть одно НО: при повторном использовании создается новый ресурс с точно таким же названием.

5. Первая мысль — проверить, есть ли ресурс с данным именем. Для этого использую:
$modx->getObject(“modResource”, 1);
Где 1 — id ресурса. это значит что для начала мне нужно узнать id ресурса.

6. Таким образом появляется вторая мысль — при помощи pdoTools найти id ресурса по имени, если id нет, значит можно смело создать новый ресурс, если id есть, то обновляем контент данного ресурса.

7. Пытался таким образом получить id ресурса по его имени:
$resource_id = $modx->runSnippet('pdoResources',Array(
	'resources' => 'Test',
	'returnIds' => 1
));

return $resource_id;

//echo $resource_id;
/*
echo '<pre>';
print_r($resource_id);
echo '</pre>';
*/
Однако, данный код не работает. PHP дебаг молчит… Думается мне, pdoTools таким образом не работает.

Не подскажете решение?
Дмитрий
02 мая 2015, 17:09
modx.pro
1
1 495
0

Комментарии: 12

Дмитрий
02 мая 2015, 19:59
0
1. Понял в чем моя ошибка:
$resource_id = $modx->runSnippet('pdoResources',Array(
	'resources' => 'Test',
	'returnIds' => 1
));
resouces — берет id ресурсов.

2. Решил проблему следующим образом:
Создал чанк:
[[!pdoResources?
    &parents = `[[+parent]]`
    &returnIds = `1`
]]
Где parent — id контейнера с JSON ресурсами.

В итоге, получился следующий сниппет:
$resource_id = $modx->getChunk('JSON-Creator-GetID',Array(
	'parent' => $parent
));

$ids = explode(',',$resource_id);

$i = 0;
if($resource_id){
	foreach($resource_id as $id){
		if ($modx->getObject('modResource',$id)){
			$i = $id;
		}
	}
}

if($i > 0){
	$document = $modx->getObject('modResource',$id);
}else{
	$document = $modx->newObject('modResource');
}

$document->set('createdby', $modx->user->get('id'));// - присваиваем автора ресурсу.
$document->set('template', '1');// - присваиваем шаблон ресурсу.
$document->set('isfolder', '0');// - новый ресурс не будет контейнером.
$document->set('hidemenu', '1');
$document->set('published', '1');// - будет опубликован.
$document->set('createdon', time());// - дата создания контента.
$document->set('pagetitle', $name);// - заголовок материала.
$document->set('alias', $name);// - псевдоним для ссылки.
$document->set('description', 'Items IDs');// - описание, description.
$document->setContent($data);// - содержимое ресурса.
$document->set('parent', $parent);// - идентификатор родителя.
$document->save();// - сохраняем материал.
Проблема решена, однако буду рад любым пожеланиям по своему быдлокоду, ибо чую, что все может быть проще.
    Дмитрий
    02 мая 2015, 21:19
    -1
    Слегка дополнил код создания:
    $document->set('createdby', $modx->user->get('id'));// - присваиваем автора ресурсу.
    $document->set('template', '9');// - присваиваем шаблон ресурсу. (9 - empty)
    $document->set('isfolder', '0');// - новый ресурс не будет контейнером.
    $document->set('hidemenu', '1');
    $document->set('content_dispo', '1');
    $document->set('content_type', $content_type);
    $document->set('published', '1');// - будет опубликован.
    $document->set('createdon', time());// - дата создания контента.
    $document->set('pagetitle', $name);// - заголовок материала.
    $document->set('alias', $name);// - псевдоним для ссылки.
    $document->set('description', 'Items IDs');// - описание, description.
    $document->setContent($data);// - содержимое ресурса.
    $document->set('parent', $parent);// - идентификатор родителя.
    $document->save();// - сохраняем материал.
      Сергей Шлоков
      02 мая 2015, 22:14
      +1
      Чувствуется профессиональный маркетолог — заголовок об одном, текст о другом.
      По коду… советую использовать процессор. Что это такое почитать можно тут.
        Дмитрий
        04 мая 2015, 20:26
        0
        Далеко мне до понимания этой статьи…

        1. Пытался сделать тестовый сниппет:
        $fields = array(
        	//'id' => 129,
        	'pagetitle' => 'Json-Items_id1',//$name, // - заголовок материала.
        	'alias' => 'Json-Items_id1',//$name, // - псевдоним для ссылки.
        	'published' => 'true',
        	'parent' => '31',//$parent,
        	'hidemenu' => '1',
        	'description' => 'Items IDs',
        	'content_type' => '7',//$content_type,
        	'content_dispo' => '1',
        	'createdon' => time(),
        	'context_key' => 'web',
        	'content' => 'atata'
        );
        $modx->runProccessor('resource/create', $fields);
        /*
        if(!$modx->runProccessor('resource/create', $fields)){
        	$modx->runProccessor('resource/update', $fields);
        };
        */
        Но ничего не создается. :(

        1. И ошибку поглядеть не знаю где.
        Вывод php разумеется ничего не дает:
        error_reporting(E_ALL | E_STRICT);
        ini_set('display_errors', 1);
        А в логах MODx пусто.
          Василий Наумкин
          04 мая 2015, 20:53
          +1
          Далеко мне до понимания этой статьи…
          Статья немного не та.

          Лучше вот эту прочитать.
            Дмитрий
            04 мая 2015, 22:09
            0
            Спасибо!
            Но, похоже что сегодня не мой день:
            $fields = array(
            	//'id' => 129,
            	'pagetitle' => 'Json-Items_id11',
            	'alias' => 'Json-Items_id11',
            	'published' => 'true',
            	'parent' => '31',
            	'hidemenu' => '1',
            	'description' => 'Items IDs',
            	'content_type' => '7',
            	'content_dispo' => '1',
            	'createdon' => time(),
            	'context_key' => 'web',
            	'content' => 'atata'
            );
            $response = $modx->runProccessor('resource/create', $fields);
            if ($response->isError()) {
                $modx->log(modX::LOG_LEVEL_ERROR, 'error.  Message: '.$response->getMessage());
            }
            1. Ресурс не создается.
            2. В «Управление -> Отчеты -> Журнал ошибок» пусто.
              Василий Наумкин
              05 мая 2015, 07:04
              +1
              А не ты ли тут задавал вопрос о странных id в parent = 31?

              Ресурсы у тебя, похоже, создаются, но не показываются в админке.
                Сергей Шлоков
                05 мая 2015, 07:17
                +1
                Проблема в невнимательности. Вот рабочий код, найди отличия (подсказка внизу)
                $fields = array(
                	'pagetitle' => 'Test',
                	'alias' => 'Json-Items_id11',
                	'introtext'=>'',
                	'published' => 'true',
                	'parent' => '0',
                	'hidemenu' => '1',
                	'description' => 'Items IDs',
                	'content_type' => '7',
                	'content_dispo' => '1',
                	//'createdon' => time(),
                	'context_key' => 'web',
                	'content' => '{"id":1}'
                );
                $response = $modx->runProccessor('resource/create', $fields);
                if ($response->isError()) {
                    $modx->log(modX::LOG_LEVEL_ERROR, 'error.  Message: '.$response->getMessage());
                }
                Ответ. RunProcessor пишется с одной буквой «с».
                  Сергей Шлоков
                  05 мая 2015, 07:47
                  +1
                  Мда. Тоже отличился невнимательностью. Скопировал старый код.
                  //Было
                  $response = $modx->runProccessor('resource/create', $fields);
                  //Правильно
                  $response = $modx->runProcessor('resource/create', $fields);
                  Вот это точно работающий код
                  $fields = array(
                  	'pagetitle' => 'Json-Items_id11',
                  	'alias' => 'Json-Items_id11',
                  	'introtext'=>'',
                  	'published' => 'true',
                  	'parent' => '0',
                  	'hidemenu' => '1',
                  	'description' => 'Items IDs',
                  	'content_type' => '7',
                  	'content_dispo' => '1',
                  	//'createdon' => time(),
                  	'context_key' => 'web',
                  	'content' => '{"id":1}'
                  );
                  $response = $modx->runProcessor('resource/create', $fields);
                  if ($response->isError()) {
                      $modx->log(modX::LOG_LEVEL_ERROR, 'error.  Message: '.$response->getMessage());
                  }
                    Дмитрий
                    05 мая 2015, 08:24
                    0
                    Действительно, дело в невнимательности.
                    Кроме того, что нашли вы, в ресурсе 'Test' стоял чанк а не сниппет. Потому ничего и не происходило.
                    :facepalm:

                    У меня так постоянно, из-за какой-нибудь ерунды, я трачу неоправданно много времени на какую-либо проблему.
            Алексей Ерохин
            03 мая 2015, 14:35
            +1
            $modx->getObject('modResource', array('pagetitle'=>'test'))
              Дмитрий
              04 мая 2015, 02:56
              0
              Была такая мысль, но не было времени проверить. ;)
              Спасибо!
              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
              12