К содержанию

Обновление ресурса типа 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 991
Реклама

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

Дмитрий
Дмитрий Старожил
02 мая 2015, 19:59
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
    Слегка дополнил код создания:
    $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
      Чувствуется профессиональный маркетолог — заголовок об одном, текст о другом.
      По коду… советую использовать процессор. Что это такое почитать можно тут.
        Дмитрий
        Дмитрий Старожил
        04 мая 2015, 20:26
        Далеко мне до понимания этой статьи…

        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
          Далеко мне до понимания этой статьи…
          Статья немного не та.

          Лучше вот эту прочитать.
            Дмитрий
            Дмитрий Старожил
            04 мая 2015, 22:09
            Спасибо!
            Но, похоже что сегодня не мой день:
            $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
              А не ты ли тут задавал вопрос о странных id в parent = 31?

              Ресурсы у тебя, похоже, создаются, но не показываются в админке.
                Сергей Шлоков
                Сергей Шлоков Старожил
                05 мая 2015, 07:17
                Проблема в невнимательности. Вот рабочий код, найди отличия (подсказка внизу)
                $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
                  Мда. Тоже отличился невнимательностью. Скопировал старый код.
                  //Было
                  $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
                    Действительно, дело в невнимательности.
                    Кроме того, что нашли вы, в ресурсе 'Test' стоял чанк а не сниппет. Потому ничего и не происходило.
                    :facepalm:

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