[EVO] Вывод ТВ с дополнительной информацией (Custom Widget для TV)

В MODX есть замечательная возможность создавать дополнительные параметры(TV)
но не все знают на сколько это многофункциональный елемент
К примеру вот замечательный вопрос:
Как работать с tv custom widget
который и натолкнул меня на написание этого топика


расмотрим довольно простой вариант:
<tr>
  <th align="left" valign="top" scope="row">Название:</th>
  <td align="left" valign="top">[+name+]</td>
</tr>

И нам нужно вывести эту строку только если TV name заполнен

Самые распрастраненные решения:
PHx
[+name:is=``:then=`<tr>
  <th align="left" valign="top" scope="row">Название:</th>
  <td align="left" valign="top">[+name+]</td>
</tr>`:else=``+]

IF
[[if? &is=`[+name+]:!empty` &then=`<tr>
  <th align="left" valign="top" scope="row">Название:</th>
  <td align="left" valign="top">[+name+]</td>
</tr>`]]

Недавно опубликованный плагин от alooze cleanEmptyBlock
[?<tr>
  <th align="left" valign="top" scope="row">Название:</th>
  <td align="left" valign="top">~~[+name+]~~</td>
</tr>?]


Но есть еще 1 простое и замечательное решение которое проще и красивее всех предыдущих:
[+name+]

а остальной код пишем в настройках TV


Так же можно использовать не только простой html код но и сниппеты к примеру

<img src="[[phpthumb? &input=`[+value+]` &options=`w=150,h=76,far=C,bg=FFFFFF`]]" />


Единсвенный недостаток данного решение это когда нужно использовать один и тот же ТВ с разным оформлением.

зато теперь можно проще делать вот такое:
<h2>C этим товаром покупают</h2>
[[Ditto? &documents=`[+value+]`]]


p.s. Все больше и больше понимаю на сколько же гибок MODX когда даже для самых простых задач есть столько разных вариантов решения)

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

avatar
Класс!
avatar
Я уже кстати не первый раз замечаю что в MODX можно порой найти решения из коробки не хуже чем то что дописанно ) просто нужно посмотреть с другой стороны)
avatar
Это точно)
avatar
Кстати а php в шаблонах можно как-то использовать?
avatar
code.google.com/p/modx-ja/downloads/detail?name=custom_widgets.zip&can=4&q=

Note: [+value+] is only special place holder.

1) chunk
@CHUNK: chunk-name
[chunk-name]-------------
<img src="[+value+]" alt="[*pagetitle*]-[(site_name)]" />
-------------------------
or
[chunk-name]-------------
<a href="[+value+]">
<img src="phpThumb.php?src=[+value+]&w=200" alt="[*pagetitle*]-[(site_name)]" />
</a>
-------------------------

2) include
@INCLUDE: tv.inc
[tv.inc]-----------------
<?php
  $value ='[*pagetitle*]-[(site_name)]';
?>

?

This method only rewrites $value. The array and the object can be passed. In this correspondence, this method is the most important. 

-------------------------

3) file
@FILE: tv.inc
[tv.inc]-----------------
  <img src="[+value+]" alt="[*pagetitle*]-[(site_name)]" />
-------------------------

4) eval
@EVAL: return '<img src="' . $value . '" alt="[*pagetitle*]" />';

5) direct
<img src="[+value+]" alt="[*pagetitle*]" />

*Important
In case of emptily $value
Output is nothing.
Комментарий отредактирован 2013-03-02 21:03:08 пользователем Dmi3yy
avatar
@EVAL, @INCLUDE, @CHUNK, @FILE. Но [+value+] доступно только после этих собако-комманд. Т.е. сначало выполнится код в котором на выходе должен встретиться плейсхолдер value.

Единственный вариант — передать value в качестве параметра нужному сниппету.
Комментарий отредактирован 2013-03-02 21:09:24 пользователем Agel_Nash
avatar
Тестил на своей сборке

<img src="[[phpthumb? &input=`[+value+]` &options=`w=150,h=76,far=C,bg=FFFFFF`]]" />

работает замечательно

ну а вопрос парсера думаю будет решен в modx evo 1.0.9
avatar
Поправился. Я проглядел строчку
$widget_output = str_replace('[+value+]', $value, $widget_output);

Т.е. по факту это даже не плейсхолдер. Синтаксис просто похож.
avatar
Посмотрел код и лично мне не понравился такой подход из-за того, что для такого маленького блока вызывается функция parseDocumentSource. Мало того, что этот блок все равно будет распарсен. Так еще и повторно посылются события OnParseDocument. В общем мутка интересная, но по старинке как-то привычнее и более выгодно чтоли.
avatar
А как бы перечислить несколько значений через разделитель, например, для выбора размера в select чтобы в option оборачивалось одно значение
avatar
Указанный способ у меня не сработал. Или недостаточно развернут план действий или я чего то не понял (но все равно спасибо за топик). :)

Все оказалось еще проще: тип вывода должен быть Custom input. Вызывать через @EVAL в значении по умолчанию или просто написать там html решать по ситуации. Например так:
@EVAL return $modx->runSnippet('ListChild', array('docId'=>7, 'depth'=>2, 'html'=>1, 'optiongroups'=>1));
но все равно надо внутрь сниппета поставлять значение TV.
Комментарий отредактирован 2014-01-06 21:33:31 пользователем vixbrd
avatar
А подскажите, как вывести имя TV в случае с DropDown List Menu?
Если возможные значения ввести в таком виде:
Знач1||Знач2||Знач3

То в шаблоне если вставить [*имя_tv*] мы получим то, что хотим, однако, есть такой вариант:
Имя1==Знач1||Имя2==Знач2||Имя3==Знач3

Вот теперь в базу сохраняются только Знач1, Знач2, Знач3 в зависимости от того, что выбрано, а в самом селекте показываются человекопонятные Имя1, Имя2, Имя3.

Если в этом случае в шаблоне поставить [*имя_tv*] то выведется соответствующее значение Знач1, Знач2, Знач3, как правило это какие-то ID, а нужно в шаблоне вывести человекопонятное соответствие этому ID.

Скорее всего, нужно копать в сторону Визуальный компонент: CustomWidget, но как там прописать что, не могу понять…

Если в поле Output вписать [+value+] — в шаблон подставляется все те же Знач1, Знач2, Знач3

Пробовал подставлять [+value+] — в шаблоне пусто. Что-то самому дописывать надо или все-таки есть какой-то стандартный плейсхолдер, чтобы вывести Имя1, Имя2, Имя3?
avatar
Нет такого плейсхолдера именно потому, что эти значения могут формироваться динамически абсолютно разными способами, а таблице значений ТВ хранятся только значения (если несколько — через разделитель ||) и CustomWidget тут не поможет.

Тут может помочь собственный сниппет в шаблоне/чанке на выводе сайта, который будет в зависимости от условия формирования ТВ его разбирать:
— если например значения формируются автоматом с помощью сниппета dropdownlist или простым селектом из базы, т.е. на выходе получаем id какого-то ресурса из дерева modx — то достаточно простой подстановки значения в DocInfo вида — [[DocInfo? &docid=`[*tv_name*]`]] — отдаст заголовок с id ресурса равному значению ТВ.
— если значения статические и занесены просто в поле «возможные значения», то надо брать это поле из базы и разбирать на основании id tv и его значения выбирать нужный.
— третий вариант — который вы уже называли — не вносить «возможные значения» через разделитель там где это не нужно (а нужно это обычно разве что в фильтрации и т.п.), а просто их перечислять значение1||значение1||значение3 и т.п. В этом случае значения и имена у ТВ будут совпадать и хватает обычного вывода [*tv_name*]
avatar
Если в [*tv_name*] содержится одно значение, то, действительно, достаточно простого вызова [[DocInfo? &docid=`[*tv_name*]`]].

Но если [*tv_name*] содержит несколько значений (Знач1, Знач2, Знач3), то этот список нужно разобрать с помощью сниппета ddGetMultipleField:

Например:
[[ddGetMultipleField? &field=`[*tv_name*]` &splY=`,` &glueY=`<br />` &tplY=`rowTpl`]]

Код rowTpl:
[[DocInfo? &docid=`[+val0+]` &field=`pagetitle`]]
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.