[REVO] Выбор из списка ресурсов в TV и вывод выбранного варианта в виде ссылки

Уважаемые господа!

Нужно, чтобы в TV была возможность выбора из списка дочерних ресурсов заданного контейнера. Причем, чтобы начать вводить значение можно было клавиатурой и затем по мере ввода выбрать нужное. При вызове TV должна возвращаться ссылка на выбранный ресурс. Для этого я воспользовался Output Options -> Output Type = URL

Если в Input Type ставлю Resource List все работает хорошо и при вызове возвращается гиперссылка с правильным анкорным текстом, но в процессе заполнения TV нельзя пользоваться клавиатурой. Приходится выбирать мышью из большого списка. Для моей задачи это неудобно.

Если в в Input Type ставлю Listbox (Single Select) то нужно писать какую-то конструкцию. В интернете нарыл:

@SELECT `pagetitle` AS `name`,`id` FROM `[[+PREFIX]]site_content` WHERE `published` = 1 AND `deleted` = 0 AND parent = 54


При заполнении ТВ можно действительно пользоваться клавиатурой и это удобно, но результатом вывода такого ТВ является гиперссылка с анкорным текстом, который идентичен номеру ресурса. Но хотелось бы, чтобы в анкоре стоял Pagetitle или Menutitle. Как этого добиться? (MODX Revo)
  • avatar
  • 0
  • 11338

7 комментариев

avatar
Вместо какойто консутркции пишем:
@EVAL return $modx->runSnippet('listMyResources',array('parent' => 54));

Создаем сниппет listMyResources, в него пишем:
$parent = $modx->getOption('parent',$scriptProperties,54);
$parentObj = $modx->getObject('modResource',$parent);
if (!($parentObj instanceof modResource)) { return ''; }
$resArray = $parentObj->getMany('Children');
$resources = array();
foreach($resArray as $res) {
  if ($res instanceof modResource) {
    $resources[] = $res->get('pagetitle') . '==' . $res->get('id');
  }
}
$out = implode("||",$resources);
return $out;

Все целиком взято с rtfm: rtfm.modx.com/display/revolution20/Creating+a+multi-select+box+for+related+pages+in+your+template
Комментарий отредактирован 2013-01-28 00:14:24 пользователем Glorfin
avatar
Спасибо! Работает как нужно. Но опять же в результате вызова TV с таким сниппетом выводится Id ресурсов. Если ставлю Output Type = URL то выводится ссылка вида
<a href="..." title="58">58</a>
<a href="..." title="59">59</a>

Как добиться нормального вида ссылки? Чтобы вместо id ресурсов был Title или Menutitle?
avatar
Хм. попробуйте выводить так:
<a href="[[~[[*yourTV]]]]">[[getResourceField? &id=`[[*yourTV]]` &field=`pagetitle`]]</a>
avatar
Да, это работает, но только если в ТВ выбрано одно значение. А если несколько, то нет. Похоже нужен сниппет, который сможет несколько значений типа 84||85 перевести в ссылки.
avatar
Да, и в правду. Сам только недавно перешел с EVO.
В общем, готовое решение у меня выглядит так:

В InputType оставляем Вашу конструкцию:
@SELECT `pagetitle` AS `name`,`id` FROM `[[+PREFIX]]site_content` WHERE `published` = 1 AND `deleted` = 0 AND parent = (id_откуда выводим)

В output ставим Тип вывода «Разделитель». Разделитель пишем ||.
Удаляем сниппет listMyResources и вместо него создаем сниппет getMyResources:
<?php
if (empty($input)) { return 'This article is so unique, that we couldn\'t find anything related to it!'; }
$tpl = $modx->getOption('tpl',$scriptProperties,'resourceTpl');
if ($modx->getChunk($tpl) == '') { return 'We found some related pages, but don\'t know how to present it.'; }
$ids = explode('||', $input);
$output = array();
foreach ($ids as $key => $value) {
  $resource = $modx->getObject('modResource',array(
    'published' => 1,
    'id' => $value));
  if ($resource instanceof modResource) {
    $output[] = $modx->getChunk($tpl,$resource->toArray());
  }
}
return implode('',$output);


Так же надо создать чанк для шаблона (его можем менять) resourceTpl:
<a href="[[~[[+id]]]]" title="[[+pagetitle]]">
    [[+longtitle:default=`[[+pagetitle]]`]]
  </a> 


Все! На страницу выводим так:
[[getMyResources? &input=`[[*ВАШ_ТВ]]` &tpl=`resourceTpl`]]

Всю информацию взял из ссылки по первому сообщению.
avatar
Спасибо! Работает!
avatar
А каким образом вывести картинку из TV прикрепленную к такому ресурсу?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.