Получение id ресурса по pagetitle
Нашел кучу примеров и вариантов, как зная id получить любое поле хоть родителя, хоть дедушки, но никак не могу понять как провернуть обратное — зная поле, в моем случае pagetitle, узнать id ресурса, чтобы потом уже узнать любое поле… неужели никому не надо было ни разу или это элементарно и я туплю?
Комментарии: 17
$q = $modx->newQuery('modResource');
$q->where(array('pagetitle':LIKE => '%пейджтайтл%')); //тут ставим любые поля ресурса
$resource = $modx->getObjectt('modResource', $q);
print_r($resource->toArray());
понадобилось добавить условие для поиска (выяснилось что заголовки могут повторяться в других разделах), доработал код вот так
<?php
$q = $modx->newQuery('modResource');
$q->where(array('pagetitle' => $idsearch, 'parent=' => array('993','992','995','989','990','991','994','996','997','988')));
$resource = $modx->getObject('modResource', $q);
$iddd = $resource->uri;
return $iddd;
на 99% дает верный результат, но в нескольких случаях выдает ресурс у которого родитель не перечислен в условии. что не так?
Спасибо!
$q = $modx->newQuery('modResource');
$q->where(array('pagetitle' => $idsearch, 'parent:IN' => array('4498')));
$resource = $modx->getObject('modResource', $q);
ищет только в верхнем уровне, как можно добавить чтобы искал в n-вложенных уровнях?
Тогда можно воспользоваться getChildIds
$child = $modx->getChildIds($parent, $depth, array('context_key' => 'web'));
$q = $modx->newQuery('modResource');
$q->where(array('pagetitle' => $idsearch, 'parent:IN' => $child));
$resource = $modx->getObject('modResource', $q);
Спасибо, я решил вот так
учитывая что id для меня не самоцель, а этап для получения урл ресурса, мне кажется это более подходящий вариант
[[!pdoResources?
&parents=`2`
&depth=`3`
&limit=`1`
&tpl=`tpl.url`
&where=`{"pagetitle":"[[+tv.rrr]]"}`
]]
меня тоже озарило)учитывая что id для меня не самоцель, а этап для получения урл ресурса, мне кажется это более подходящий вариант
Эмм… пример выше намного лучше и полезней…
согласен. посмотрел в статистику — мое творение в 4 раза больше запросов с БД генерит, на больших выборках разница во времени очень заметна.
У меня работает так
[[!pdoResources?
&parents=`2`
&depth=`3`
&limit=`1`
&tpl=`tpl.url`
&where=`{"pagetitle":[[+tv.rrr]]}`
]]
т.е. TV не обертываю в кавычки
Роли не имеет. Так все равно больше запросов. На больших объемах это сильно заметно.
У Вас получилось сделать как написал Михаил?
Да, конечно.
У меня не получается, ошибку выдает
я код немного переделал под себя, вот такой точно не выдает ошибку
<?php
$q = $modx->newQuery('modResource');
$q->where(array('pagetitle' => $idsearch));
$resource = $modx->getObject('modResource', $q);
$iddd = $resource->uri;
return $iddd;
":LIKE" пишется сразу после pagetitle. Разберитесь с синтаксисом.
$q->where(array('pagetitle:LIKE' => '%pagetitle%'));
Код из коммента выше будет искать по точному совпадению, т.е. если перед pagetitle или после него будет пробел или другой символ, сниппет ничего не вернет.
Как вариант:
echo $modx->getObject('modResource', ['pagetitle' => 'page title'])->get('id');
// or
$res = $modx->getObject('modResource', ['pagetitle' => 'page title']);
echo $res->get('id');
echo $res->get('parent');
echo $res->getTVValue('foo');
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.