Динамический список значений в TV-параметре

Если Вы используете в своих проектах TV-параметры, то наверняка знаете, что для них можно задавать список возможных значений. А что же делать, если список должен быть динамическим? Для чего это нужно, лучше проиллюстрировать на примере.

На сайте есть раздел "Каталог авто". Каждый дочерний документ в каталоге – это марка машины. Кроме этого, есть раздел «Статьи», конечно же на тему автомобилей:) В каждой статье может упоминаться об одной или нескольких марках машин. И мы решили, для лучшей навигации сайта, указывать, о каких марках идёт речь в конкретной статей (можно провести аналогию с тегами).

 

дерево документов
Рис.1 - Дерево документов

 

Создаём TV-параметр, назовём его autolist. В поле "Возможные значения" можем просто перечислить все марки из нашего каталога. Но у этого способа есть ряд недостатков. Во-первых, нам лень делать это вручную. Во-вторых, если в каталог добавится ещё хоть одна марка, мы должны не забыть дописать ее в этот списке. В-третьих, используя статический список (например, BMW||Honda||Porshe) в базе данных значение параметра autolist будет хранится в таком же (словесном) виде. И если вдруг придётся переименовать, или исправить ошибку в названии марки авто, такие записи в таблице станут нерабочими.

 

статический список значений TV-параметра
Рис.2 - Статический список значений TV-параметра

 

Чтобы забыть про все эти проблемы создадим динамический список автомобилей. В списке авто, на странице статьи, будут выводится все текущие документы (марки) из папки "Каталог авто". Для этого в поле "Возможные значения" в режиме редактирования TV-параметра, вызовем сниппет:

@EVAL return $modx->runSnippet('print_autolist');
  • @EVAL — это @-привязка, которая позволяет вставлять php-код
  • $modx->runSnippet() — метод вызова сниппета
  • 'print_autolist' — сниппет, который вернёт динамический список марок

 

динамический список значений TV-параметра
Рис.3 - Динамический список значений TV-параметра

 

Скорее всего, для многих уже стало всё предельно ясно, но я продолжу. Итак создаём сниппет формирования списка авто:

<?php
//----------------------------------------------------------------------------
// выбираем неудалённые документы их папки "каталог авто" (3)
//---------------------------------------------------------------------------- 
$query="SELECT id, pagetitle
FROM   modx_site_content
WHERE  parent=3 AND deleted=0
ORDER  by pagetitle";
$result=mysql_query($query) or die('Database query error!');
$Autos=array();
while ($Data=mysql_fetch_object($result)){
$Autos[$Data->id]=$Data->pagetitle;
}
//----------------------------------------------------------------------------
// формируем строку для вывода в поле "Возможные значения" 
// в формате (||название==id||название==id)
//----------------------------------------------------------------------------
$list='';
foreach ($Autos as $id=>$auto)
{
$list.='||'.$auto.'=='.$id;
}
return $list;
?>

Стоит пояснить формат вывода: ||название==id||название==id:

  • первый разделитель с строке «возможные значения» даст в результате пустой первый элемент списка
  • || - разделить (отделяет один пункт списка от другого)
  • название – видимая часть пункта списка
  • id — значение пункта списка

То есть html-код вывода TV-параметра autolist на странице документа будет следующий:

<select id="tvauto[]" name="tvauto[]" multiple="multiple" 
onchange="documentDirty=true;" size="8">
<option value=""></option>
<option value="10">Audi</option>
<option value="4">BMW</option>
... 
<option value="15">Volkswagen</option>
</select>

 

вывод TV-параметра с динамическим списком значений на странице документа
Рис.5 - TV-параметр с динамическим списком значений на странице документа

 

В базе данных значение TV-параметра будет следующим:

 

запись в базе данных
Рис.6 - Запись в базе данных

 

 

Автор: Татьяна