MODX процессоры.
Доброго времени суток уважаемое сообщество.
В modx есть 2 процессора:
Но вопрос такой, как узнать, существует ли ресурс? Т.е Если вызвать обновление на несуществующий ресурс получим законную ошибку, если создавать ресурс который уже есть — скорее всего получим ошибку (будут совпадать алиасы, и скорее всего создать ресурс не получится)
Дак как можно узнать о существовании ресурса? Соответственно получить его id
В голове крутится только костыль через PDO запрос по pagetitile, но может быть есть способ лучше?
В modx есть 2 процессора:
$response = $modx->runProcessor('resource/update', $data);
На обновление ресурса (в массиве $data должен присутствовать id ресурса)$response = $modx->runProcessor('resource/create', $data);
На создание ресурса.Но вопрос такой, как узнать, существует ли ресурс? Т.е Если вызвать обновление на несуществующий ресурс получим законную ошибку, если создавать ресурс который уже есть — скорее всего получим ошибку (будут совпадать алиасы, и скорее всего создать ресурс не получится)
Дак как можно узнать о существовании ресурса? Соответственно получить его id
В голове крутится только костыль через PDO запрос по pagetitile, но может быть есть способ лучше?
Комментарии: 9
Если знаешь id, то вся очень просто —
Если не знаешь, то всё чуть сложнее —
if ($modx->getCount('modResource', $id)) {
// Ресурс есть, работаем
}
Если не знаешь, то всё чуть сложнее —
if ($modx->getCount('modResource', array('pagetitle' => $pagetitle, 'context_key' => $ctx))) {
// Ресурс есть, работаем
}
Параметры в запросе, понятно, по желанию.if ($modx->getCount('modResource', array('pagetitle' => $pagetitle, 'context_key' => $ctx))) {
// Ресурс есть, работаем
}
А как получить из этого id? if ($res = $modx->getObject('modResource', array('pagetitle' => $pagetitle, 'context_key' => $ctx))) {
$id = $res->get('id');
}
Ну или так))
$resource = $modx->getObject('modResource', array('pagetitle' => $pagetitle, 'context_key' => $ctx));
if ($resource instanceof modDocument) {
$id = $resource->id;
// или
// $resourceArray = $resource->toArray();
// $id = $resourceArray['id'];
}
Писал с телефона, возможны опечатки
Всем спасибо!!!
Наверное что то идет не так.
По скольку мой любимый ресурс из за постоянных изменений становится не любимым, я хочу забрать от туда свою базу фильмов.
По скольку мой любимый ресурс из за постоянных изменений становится не любимым, я хочу забрать от туда свою базу фильмов.
<?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. Я что то не так сделал?
Включи вывод ошибок, должно что-то быть вместо белой страницы:
ini_set('display_errors', 1);
ini_set('error_reporting', -1);
Завелось, поехало. Василий, посмотрите пожалуйста, в этой части кода нету явных касяков?
Я так понимаю это print_r($modx->error->failure($response->getMessage())
Но почему не выводится содержимое массива?
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())
Но почему не выводится содержимое массива?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.