Я пытаюсь найти способ визуализировать ресурс с определенным tpl на основе значения переменной шаблона (tv). вот мой вариант использования:
Я установил modx для базового сайта с домашней страницей и блогом (я использовал надстройку статей). Я хочу отображать сообщения блога на главной странице вне контейнера статей. По моему опыту, самый простой способ сделать это — использовать getResource. Однако для этого конкретного проекта я хотел бы изменить tpl результатов getResources в зависимости от значения tv для каждого результата.
Переменную шаблона можно рассматривать как «тип сообщения». если вы выберете «текст», у него будет tplA, если вы выберете «мультимедиа», у него будет tplB и т. д.
Теперь, основываясь на моих исследованиях, вы должны использовать свойства tplCondition и conditionalTpls, чтобы добиться этого в вызове getResources, примерно так:
[[getResources? conditionalTpls=« тип сообщения» сообщениям блога в контейнере моих статей с помощью переменной шаблона.
MODX сниппеты — как создать и вывести
-используйте значение переменной шаблона, чтобы установить конкретный tpl на основе этого значения.
Любая помощь высоко ценится. Благодарность
РЕДАКТИРОВАТЬ: хорошо, я получил ответ на форумах и нашел «решение» для этого.
Вы можете сделать это с помощью css. в tpl вы делаете что-то вроде:
Это выведет тип сообщения, выбранный в телевизоре, в качестве фактического используемого класса элемента, и затем вы можете использовать css, чтобы придать выводу другой вид в зависимости от телевизора. На самом деле это так просто, я немного смущен, что не видел этого раньше. В моей ситуации это на 100% решает мою проблему, однако, если вам нужно изменить html, я предполагаю, что потребуется задействовать javascript или другой метод с php. просто оставьте это здесь на случай, если это кому-то понадобится!
user2251230 19 Апр 2014 в 03:42
3 ответа
Лучший ответ
Если вам нужно внести серьезные изменения в html, вы все равно можете решить эту проблему с помощью css, если у вас есть хорошая разметка. Однако, если этого недостаточно, я бы решил это, используя один tpl для вызова getresources и позволив этому tpl обрабатывать переключение. Если бы вы могли вывести свой телевизор, значение символизирует имя tpl, которое должно использоваться в каждом случае, вашему tpl понадобится только это: [[$[[+tv.yourtv]]]] Сначала будет проведена оценка вашего телевизора, а затем он будет обработан как фрагмент. Таким образом, вам не понадобится неприятный переключатель или предложение if.
Предполагается, что вам нужны совершенно разные tpls, а не просто нужно изменить какую-то небольшую часть стандартного tpl, хотя в этом случае вы все равно можете использовать эту технику!
Kristian Sandström 19 Апр 2014 в 13:34
Да, это тоже действующий метод. Спасибо за добавление. Я должен буду помнить ваш в будущем, потому что, как вы сказали, он работает во всех сценариях.
user2251230
19 Апр 2014 в 23:19
MODx Revolution — выводим TV параметры (4-я часть)
Условные шаблоны, похоже, отлично работают с pdoResources (часть pdoTools). (Я должен поставить «tv.» Перед телевизором в tplCondition, но не на других телевизорах)
James 28 Май 2014 в 18:19
[[pdoResources? tplCondition=`tv.blogPostType` tpl=`defaultTpl` ]]
Источник: question-it.com
ModX Revo: запрос нескольких телевизоров?
Я перехожу на сайт 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);
user261355 19 авг ’13 в 19:42 2013-08-19 19:42
2013-08-19 19:42
3 ответа
Рабочий пример из моего кода для двух телевизоров: reserved (id: 11) и cost_obj (ID:12)
$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
user1032631 19 авг ’13 в 20:55 2013-08-19 20:55
2013-08-19 20:55
Хммммм, я думаю, что-то вроде этого:
$c->where(array( ‘TV1:=’ => ‘X’ ‘AND:TV2:=’ => ‘Y’ ‘AND:TV3:=’ => ‘Z’ ));
user575872 19 авг ’13 в 20:15 2013-08-19 20:15
2013-08-19 20:15
Просто вставьте таблицу 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.
Также обратите внимание, что это не очень эффективный запрос для больших наборов. Самый эффективный способ сделать это — создать пользовательский объект xpdo, который соответствует вашим потребностям, но это вполне проект, если он нужен только для этого конкретного случая.
Если возможно, вы также можете просто попробовать сделать вызов getResources, где довольно легко добавить телевизионные приставки. Он все еще медленный, поскольку выполняется с более или менее одинаковыми объединениями, но, по крайней мере, вам не придется искать пути решения проблемы.
[[getResources? depth=`10` tvFilters=`nameOfTV1==%[[+value]]%,othertv==othervalue` ]]
Обратите внимание, что запятая — это AND, а двойные трубы — это OR в строке tvFilters. И делаем это программно:
$value = ‘Mexico’; $resources = $modx->runSnippet(‘getResources’, array( ‘parents’ => ‘1,2,3. ‘, ‘depth’ => 10, ‘tpl’ => ‘yourTemplateForEachResource’, ‘tvFilters’ => ‘nameOfTV1==%’ . $value . ‘%,othertv==othervalue’ ));
Я предполагаю, что создание собственного запроса обычно будет быстрее, но в getResources встроено некоторое кэширование и оптимизация, которые могут выиграть в долгосрочной перспективе (при правильном использовании).
Источник: stackru.com
MODX Revo API: Подборка кода для работы с API MODX
Для написания простого сниппета в MODX Revolution не нужно знать весь API, достаточно иметь подсказки по работе API, например: как получить id документа, как получить поля документа, как получить тв поля документа.
В данной подборке вы найдете для себя, коды которые облегчат создание своего сниппета и помогут разобраться в других сниппетах.