Получить TV по id

Я переношу сайт на ModX Revolution и не имею опыта работы с xPDO.
На сайте, который я перемещаю, есть функция поиска, которая просматривает несколько телевизоров, назначенных некоторым ресурсам, и возвращает соответствующие страницы.
У меня возникли проблемы с включением этого с помощью xPDO.

Я могу вернуть все страницы, на которых для телевизора установлено заданное значение, но я не могу понять, как расширить это до:
Find all resources where TV1 == X, TV2 == Y, TV3 == Z .
Как я могу запросить несколько телевизоров одновременно?

$value = «Mexico»; $c = $modx->newQuery(‘modResource’); $c->innerJoin(‘modTemplateVarResource’,’TemplateVarResources’); $c->where(array( ‘TemplateVarResources.tmplvarid’ => 7, ‘»‘.$value.'» IN (TemplateVarResources.value)’, )); $resources = $modx->getCollection(‘modResource’,$c);
Vecta 19 Авг 2013 в 23:42

3 ответа

Хмммм, я думаю, что это происходит примерно так:

$c->where(array( ‘TV1:=’ => ‘X’ ‘AND:TV2:=’ => ‘Y’ ‘AND:TV3:=’ => ‘Z’ ));
Sean Kimball 20 Авг 2013 в 00:15

Рабочий пример из моего кода для двух телевизоров: reserved (id:11) и cost_obj (id:12)

Считыватели ID-карт от компании «Скатех-ТВ».


$c->leftJoin(‘modTemplateVarResource’, ‘cost_obj’, array(‘modResource.id = cost_obj.contentid’, ‘cost_obj.tmplvarid = 12’)); $c->leftJoin(‘modTemplateVarResource’, ‘reserved’, array(‘modResource.id = reserved.contentid’, ‘reserved.tmplvarid = 11’)); $c->query[‘where’][0][0][] = new xPDOQueryCondition(array( ‘sql’ => ‘CAST(`reserved`.`value` as UNSIGNED INTEGER) > ?’, ‘binding’ => array( ‘value’ => 0, ‘type’ => PDO::PARAM_INT, ‘length’=>0), ‘conjunction’=>’AND’) ); $c->query[‘where’][0][1][] = new xPDOQueryCondition(array( ‘sql’ => ‘CAST(`cost_obj`.`value` as UNSIGNED INTEGER) > ?’, ‘binding’ => array( ‘value’ => 0, ‘type’ => PDO::PARAM_INT, ‘length’=>0), ‘conjunction’=>’AND’) ); $c->query[‘where’][0][2][] = new xPDOQueryCondition(array( ‘sql’ => ‘CAST(`reserved`.`value` as UNSIGNED INTEGER) >= CAST(`cost_obj`.`value` as UNSIGNED INTEGER)’, ‘conjunction’=>’AND’) );

Этот запрос равен

reserved > 0 AND cost_obj > 0 AND reserved >= cost_obj
Vasis 20 Авг 2013 в 01:01

Еще по теме:  Где можно посмотреть фильмы без интернета

Просто присоединитесь к таблице modTemplateVar для каждого телевизора, на котором вы хотите выполнить поиск. Обратите внимание на третий параметр соединения, который содержит термины ON. Убедитесь, что вы указали правильный идентификатор телевизора, который хотите получить.

$value = «Mexico»; $c = $modx->newQuery(‘modResource’); $c->innerJoin(‘modTemplateVar’, ‘TV1’, ‘TV1.contentid = modResource.id AND TV1.tmplvarid = X’); $c->innerJoin(‘modTemplateVar’, ‘TV2’, ‘TV2.contentid = modResource.id AND TV2.tmplvarid = Y’); $c->innerJoin(‘modTemplateVar’, ‘TV3’, ‘TV3.contentid = modResource.id AND TV3.tmplvarid = Z’); $c->where(array( ‘TV1.value:LIKE’ => $value, ‘TV2.value’. ‘TV3.value’. )); $resources = $modx->getCollection(‘modResource’,$c);

Обратите внимание, что это не проверено, но должно дать вам общее представление о том, как вы должны настроить свой запрос. Возможно, вам придется добавить несколько обратных кавычек к именам таблиц в предложениях ON, не знаю, насколько придирчив к этому синтаксический анализатор xPDO.

Получение идентификатора приложения ID и Secret для Oauth2 авторизации через twitch.tv

Также обратите внимание, что это не очень эффективный запрос для больших наборов. Наиболее эффективным способом достижения этого было бы создание пользовательского объекта xpdo, который соответствует вашим потребностям, но это довольно сложный проект, если он вам нужен только для этого конкретного случая.

Если возможно, вы также можете просто попробовать выполнить вызов getResources, куда довольно легко добавить условное обозначение TV. Это все еще медленно, так как это делается с более или менее одинаковыми соединениями, но, по крайней мере, вам не придется искать и устранять неполадки на пути к решению.

[[getResources? depth=`10` tvFilters=`nameOfTV1==%[[+value]]%,othertv==othervalue` ]]

Обратите внимание, что запятая — это И, а двойная черта — это ИЛИ в строке tvFilters. И делаем это программно:

$value = ‘Mexico’; $resources = $modx->runSnippet(‘getResources’, array( ‘parents’ => ‘1,2,3. ‘, ‘depth’ => 10, ‘tpl’ => ‘yourTemplateForEachResource’, ‘tvFilters’ => ‘nameOfTV1==%’ . $value . ‘%,othertv==othervalue’ ));

Еще по теме:  Обновления для ТВ приставки DEXP

Я предполагаю, что создание собственного запроса обычно будет быстрее, но в getResources встроено некоторое кэширование и оптимизация, которые могут выиграть в долгосрочной перспективе (при правильном использовании).

Источник: question-it.com

Получение полей у родителя родителя (дедушки) =)

Для того чтобы получить данные полей дедушки вызываемого документа понадобится простой сниппет grandpaGet:

$parent_id = $modx->resource->get(‘parent’); $parent_obj = $modx->getObject(‘modResource’, $parent_id); //находим деда $granpa_id = $parent_obj->get(‘parent’); $granpa_obj = $modx->getObject(‘modResource’, $granpa_id); //Смотрим параметр что получить $whattoget = $scriptProperties[‘whattoget’]; //Получаем объект $granpa_thing = $granpa_obj->get($whattoget); //Выводим информацию. echo «$granpa_thing»;

И вызывать его можно с параметром где указываем название поля которое нужно получить, в примере мы получим заголовок документа у дедушки:

[[grandpaGet? resource->get(‘parent’); $parent_obj = $modx->getObject(‘modResource’, $parent_id); //находим деда $granpa_id = $parent_obj->get(‘parent’); $granpa_obj = $modx->getObject(‘modResource’, $granpa_id); //Смотрим параметр что получить $whattoget = $scriptProperties[‘whattoget’]; //Получаем объект $granpa_thing = $granpa_obj->getTVValue($whattoget); //Выводим информацию. echo «$granpa_thing»;

Источник: morngail.com

получить документ по id в modx

Очень просто хочу иметь несколько областей контента на одной странице. Обратите внимание, что это мой первый сайт Modx. Пока у меня есть домашняя страница и созданы дочерние документы для субрегионов на главной странице. Все, что я хочу, это назвать их в шаблоне. Например, есть документ с идентификатором 2, и мне нужен длинный заголовок на домашней странице (id из 1). Что-то вроде:

[[~2*longtitle]]

К сожалению, приведенное выше просто возвращает URL-адрес этого вспомогательного документа, а не longtitle самого документа. До сих пор я не нашел никакой документации по этому поводу. Кто-нибудь знает, как это сделать?

спросил(а) 2020-03-06T17:59:55+03:00 3 года, 6 месяцев назад
добавить комментарий
пожаловаться

У вас есть 2 варианта, сложный путь — выбранный вами маршрут;) и простой способ. который я также опишу. Для того, что вы пытаетесь сделать, вам захочется использовать либо getResources http://rtfm.modx.com/display/ADDON/getResources, который позволит вам перебирать коллекцию ресурсов и извлекать нужные вам поля [в этот случай «content»] или getresourceField http://rtfm.modx.com/display/ADDON/getResourceField, который позволит вам указать один ресурс и поле для извлечения, просто назовите его несколько раз в своем шаблоне. Вы можете попробовать:

Еще по теме:  Вес токарного станка ТВ 16 без стола

[[getResources? tpl=’myTpl’ https://progi.pro/poluchit-dokument-po-id-v-modx-9008134″ target=»_blank»]progi.pro[/mask_link]

Оцените статью
Добавить комментарий