MODX процессоры.

Доброго времени суток уважаемое сообщество.
В modx есть 2 процессора:
$response = $modx->runProcessor('resource/update', $data);
На обновление ресурса (в массиве $data должен присутствовать id ресурса)
$response = $modx->runProcessor('resource/create', $data);
На создание ресурса.

Но вопрос такой, как узнать, существует ли ресурс? Т.е Если вызвать обновление на несуществующий ресурс получим законную ошибку, если создавать ресурс который уже есть — скорее всего получим ошибку (будут совпадать алиасы, и скорее всего создать ресурс не получится)

Дак как можно узнать о существовании ресурса? Соответственно получить его id
В голове крутится только костыль через PDO запрос по pagetitile, но может быть есть способ лучше?
Николай
02 июля 2014, 16:36
modx.pro
1 950
0

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

Василий Наумкин
02 июля 2014, 21:26
+1
Если знаешь id, то вся очень просто —
if ($modx->getCount('modResource', $id)) {
// Ресурс есть, работаем
}

Если не знаешь, то всё чуть сложнее —
if ($modx->getCount('modResource', array('pagetitle' => $pagetitle, 'context_key' => $ctx))) {
// Ресурс есть, работаем
}
Параметры в запросе, понятно, по желанию.
    Николай
    02 июля 2014, 21:59
    0
    if ($modx->getCount('modResource', array('pagetitle' => $pagetitle, 'context_key' => $ctx))) {
    // Ресурс есть, работаем
    }
    А как получить из этого id?
      Василий Наумкин
      02 июля 2014, 22:04
      +1
      if ($res = $modx->getObject('modResource', array('pagetitle' => $pagetitle, 'context_key' => $ctx))) {
      	$id = $res->get('id');
      }
      Алексей Карташов
      02 июля 2014, 22:06
      +1
      $resource = $modx->getObject('modResource', array('pagetitle' => $pagetitle, 'context_key' => $ctx));
      if ($resource instanceof modDocument) {
        $id = $resource->id;
      
        // или
        // $resourceArray = $resource->toArray();
        // $id = $resourceArray['id'];
      }
      Писал с телефона, возможны опечатки
    Николай
    02 июля 2014, 22:09
    0
    Всем спасибо!!!
      Николай
      06 июля 2014, 12:48
      0
      Наверное что то идет не так.

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

      <?php
      $i = 1;
      $content = file_get_contents('http://bloodvirus.imhonet.ru/content/films/rates/');
      $pattern = '~data-content="Следующая(.*?)</span>~is';
      while (preg_match($pattern, $content, $matches)) {
          
          $content = file_get_contents('http://bloodvirus.imhonet.ru/content/films/rates/?page='.$i);
          preg_match_all('~<div class="m-inlineitemslist-describe-h2">(.*?)</a>~is',$content,$result);
          
          foreach($result[0] as &$v) {
              $v = trim(strip_tags($v));
              $v=trim(substr($v,0,strlen($v)-25));
             $name[] = $v; 
          }
          preg_match_all('~<div class="m-inlineitemslist-describe-h2">.*?href="(.*?)"~is',$content,$result);
       
          foreach($result[1] as &$v) {
             $urls[] = $v; 
          }
      $i++;
      }
      
      $add = 0;
      
          for ($i = 0; $i < count($name); $i++) {
              unset($data);
          	$data['class_key'] = 'msProduct';
          	$data['context_key'] = 'web';
          	$data['parent'] = '567';
          	$data['template'] = '4';
          	$data['pagetitle'] = $name[$i];
          	$data['longtitle'] = $urls[$i];
          	$data['source'] = '2';
          	$data['published'] = '1';
              $response = $modx->runProcessor('resource/create', $data);
              if ($response->isError()) { print_r($modx->error->failure($response->getMessage()).'<br />'); }
              $add++;
          }
      
      
      echo "<br />Возможно добавлено фильмов: $add;";
      Но если я добавляю условие:

      if ($res = $modx->getObject('modResource', array('pagetitle' => $name[$i], 'context_key' => 'web'))) {
      	$data['id'] = $res->get('id');
      	$response = $modx->runProcessor('resource/update', $data);
      } else {
      $response = $modx->runProcessor('resource/create', $data);
      }
      То на выходе я имею белую страницу, без каких либо выводимых ошибок. Даже если весь перебор массива воткнуть в try. Я что то не так сделал?
        Василий Наумкин
        06 июля 2014, 13:38
        0
        Включи вывод ошибок, должно что-то быть вместо белой страницы:
        ini_set('display_errors', 1);
        ini_set('error_reporting', -1);
          Николай
          06 июля 2014, 14:38
          0
          Завелось, поехало. Василий, посмотрите пожалуйста, в этой части кода нету явных касяков?
          for ($i = 0; $i < count($name); $i++) {
                  unset($data);
              	$data['class_key'] = 'msProduct';
              	$data['context_key'] = 'web';
              	$data['parent'] = '567';
              	$data['template'] = '4';
              	$data['pagetitle'] = (string)$name[$i];
              	$data['longtitle'] = (string)$urls[$i];
              	$data['source'] = '2';
              	$data['published'] = '1';
          
          if ($res = $modx->getObject('modResource', array('pagetitle' => $name[$i], 'context_key' => 'web'))) {
          	$data['id'] = $res->get('id');
          	$response = $modx->runProcessor('resource/update', $data);
          	$upd++;
          } else {
          $response = $modx->runProcessor('resource/create', $data);
          $add++;
          }
          
                  if ($response->isError()) { print_r($modx->error->failure($response->getMessage()).'<br />'); }
              }
          Если из категории удалить все ресурсы, то по новой они добавятся с лёту, без проблем. Если же я удалю хотя бы 1 ресурс, то после выполнения кода недостающий ресурс не добавляется, за то на странице выведется 582 (столько ресурсов должно было обновится, + 583й должен был добавиться) раза Array
          Я так понимаю это print_r($modx->error->failure($response->getMessage())
          Но почему не выводится содержимое массива?
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        9