Использование @-привязки в TV-параметрах

Здравствуйте, уважаемые сообщники.

Позвольте поделиться небольшим рецептиком, который пришлось создать по большой нужде :). При верстке сайта мне понадобился шаблон, в котором к странице цеплялась бы галерея. С самой галереей проблем не было, меня вполне устроила Easy2. Вопрос о том, как именно прикрутить картинки к странице, тоже не стоял – к шаблону прицепился текстовый TV-параметр с номером галереи, а в самом шаблоне был размещен сниппет галереи. После непродолжительного наполнения сайта контентом я понял, что вводить номера или названия папок с картинками на каждой страничке мне лень, энтузиазма на весь проект не хватит, да и запутаться проще простого. Значит, настала пора включить межушный рудимент.

Для начала я напомню вам, что такое @-привязка (@-binding). В возможных и дефолтовых значениях TV-параметров вы можете вводить строки, начинающиеся со знака «@» - это означает, что modx будет брать эти значения из некоего источника, например – из базы данных. Поскольку давить на клавиши мне было лень, тип TV превратился в «radio» - чтобы дать работу мышке. Моя база данных называется «pitomnik», поэтому запрос в графе «Возможные значения» выглядит так:

  1.  
  2. @SELECT `cat_name`,`cat_id` FROM `pitomnik_easy2_dirs` WHERE `cat_name`!='Easy 2'
  3.  

Такая строка означает, что в списке возможных значений будут пары из названий и номеров папок в галерее Easy2, кроме корневой папки (с названием «Easy 2» или номером «1»).

Теперь на странице, использующей шаблон с этим параметром, можно выбрать папку картинок галереи Easy2. Чудесно. Все бы было совсем хорошо, но каждая страничка использует свою папку с иллюстрациями, и вываливать каждый раз весь список – неудобно, особенно если документов сотни. Значит, нужно показывать только те папки, которые еще не использовались.

  1.  
  2. @SELECT `cat_name`,`cat_id` FROM `pitomnik_easy2_dirs` WHERE (`cat_name`!='Easy 2' AND `cat_id` NOT IN (SELECT `value` FROM `pitomnik_site_tmplvar_contentvalues` WHERE `tmplvarid` = '6'))
  3.  

Чтобы не было лишних вопросов, «6» - это идентификатор TV, обозначающий выбранную галерею, чтобы не спутать с другими, совершенно посторонними TV, которые могут запутать нас.

На этом эпопея с @-привязкой почти закончилась, осталось лишь маленькое неудобство. При повторном редактировании страницы получалось, что галерея, используемая на данной странице, не отображалась в списке (естественно, она же используется, мы запретили показ таких значений). На практике это означает, что после редактирования страницы галерея от нее «отвалится». Так что пришлось отказаться от привязки «@SELECT» и воспользоваться другим типом привязки – «@EVAL». В этом случае при создании TV в графе «возможные значения» помещается PHP-скрипт, возвращающий строку возможных значений параметра.

Для удобства восприятия я разбил скрипт на строки, но у вас он должен быть записан без переносов. В моем варианте он стал выглядеть так:

  1.  
  2. $q="SELECT `value` FROM `pitomnik_site_tmplvar_contentvalues` WHERE `tmplvarid`='6' AND `contentid`='".$_GET['id']."';";
  3. $r=mysql_query($q);
  4. $query="SELECT `cat_name`,`cat_id` FROM `pitomnik_easy2_dirs` WHERE (`cat_name`!='Easy 2' AND `cat_id` NOT IN (SELECT `value` FROM `pitomnik_site_tmplvar_contentvalues` WHERE `tmplvarid` = '6')) OR (`cat_id`='".$d[0]."')";
  5. $result=mysql_query($query);
  6. while($child = mysql_fetch_row($result))
  7. {$output .= $child[0]."==".$child[1]."||"; };
  8. $output .= "no-foto==7";
  9. return $output;
  10.  

Позвольте прокомментировать по строкам:

  • @EVAL – с этих символов начинается значение поля «Возможные значения». Такая запись означает, что дальше пойдет PHP.
  • $q – переменная с sql-запросом. Обратите внимание, в него вставлено значение «$_GET['id']» - это номер документа, который мы будем редактировать
  • $r – результат запроса к БД
  • $d – объект с номером используемой на данной странице галереи.
  • $query – запрос для выборки списка неиспользованных еще папок с картинками в Easy2. Выбираются все каталоги Easy2, кроме корневого (`cat_name`!='Easy 2'), которые ранее не использовались (`cat_id` NOT IN (SELECT… тут пошел подзапрос на список использованных значений…), а потом в список обязательно должен попасть элемент, соответствующий данной странице (OR (`cat_id`='".$d[0]."')";)
  • $child – элемент списка возвращенных номеров и названий папок в галерее, которые мы можем использовать на текущей странице.

Дальше они просто складываются в строку $output и в конце я дописал для себя «"no-foto==7";». У меня под номером 7 в галерее папка с одной картинкой из разряда «тут фоток нет». Такое значение используется у меня по умолчанию, но я хотел бы иметь возможность выбрать его в любом документе.

Вот, собственно, и все. Решение не универсальное, хорошо бы было еще вставить префикс таблицы БД, поиск по названию TV, задание списков всегда доступных/недоступных папок в галерее и еще подшлифовать кое-что, но для использования в боевых условиях уже пригодно. Если использование этого рецепта вызвало у вас затруднения, буду рад помочь консультацией. Желаю вам комфортной работы в MODx.

Александр Поляков,
lecosson@mail.ru

с 1 по 10 из 11 | Далее | Последние
new comment 21.02.2010, 16:50:26

Хорошая статья. @EVAL очень удобная штука :)..

Если у меня более десятка строк кода для тв-параметра, рнр код выношу в сниппет, а с помощью @EVAL делаю вызов сниппета, что-то типа: @EVAL $output = $modx->runSnippet("tvSnippet-1"); return $output; так более удобно править код, чем всё будет в одной длинной строке :)

Вы писали "«6» - это идентификатор TV" - я бы вместо `tmplvarid` = '6' зделал `tmplvarid` = (SELECT `id` FROM `pitomnik_site_tmplvars` WHERE `name`='you-tv-name' LIMIT 1)

где: "you-tv-name" - названия тв-параметра обозначающего галерею. "pitomnik_" - префикс таблиц модх.

  • моя поправка вызвана тем, что однажды дорабатывал после кого-то крупный портал, и ид тв-параметров отличались, работа делалась на тестовом сервера, а при переносе на лайв пришлось переписывать привязывая к имени тв-параметра, а не к ид :) с тех пор если привязываю, то к именам тв-параметрам )
new comment 22.02.2010, 00:45:49

Спасибо, отличное дополнение. Со временем наверняка придется все это добро собрать в кучу и оформить в плагин. Есть у меня желание сделать дополнительный тип TV (приаттаченая галерея). После установки свежего ManagerManager с TV-картинками работать стало удобнее, но одна картинка - это все-равно не галерея.

new comment 22.02.2010, 10:24:05

Кстати, для правки кода есть расчудесный плагинчик - редактор EditArea с нумерацией строк, подсветкой синтаксиса CSS, HTML, Javascript, PHP и т.п. Ставится как еще один RichEdit. До нормальной среды не дотягивает, конечно, но по сравнению с Plain Text - как небо и земля. На больших мониторах очень чувствуется.

new comment 22.02.2010, 10:52:41

EditArea - то что нужно ).. Давненько хотел что-то подобное, когда-то искал плагин под тинимсе для подсветки кода - не нашел :).. На досуге буду прикручивать EditArea (готовых решений не нашел, или плохо искал).

new comment 22.02.2010, 11:32:51

А что там прикручивать? Распаковать в папку, скопировать код в плагин, указать несколько событий в системе. Или дистр не нашли? Я через пару часов доберусь до своего компа, могу дать ссылочку.

new comment 22.02.2010, 12:18:55

Нашел :).. Просто времени сейчас нет играться с подобным (по моему 1-2 часа уйдёт чтобы сделать плагин и "отшлифовать" под себя)

http://www.cdolivet.com/index.php?page=editArea - это нашел, оно? )

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

new comment 22.02.2010, 12:50:24

Да, действительно на интеграцию editArea ушло 15 минут )

new comment 27.02.2010, 00:00:15

Я немножко выпал из жизни - загрипповал и переставил систему на основном компе :) Насчет ссылочки - да, это оно. Теперь, например, можно редактировать CSS прямо в менеджере.

new comment 27.02.2010, 20:49:10

да да.. цсс и рнр и хтмл ).. для нужного нужная подсветка подгружается ).. * тут мысля навернулась - поиздеваться с тв, точнее где "возможные значения" вместо input замутить textarea и плагин написанный задействовать, и кнопочку вкл\выкл ).. можно будет удобно работать с сложными тв-параметрами ))

WiT
new comment 31.03.2010, 12:28:56

Так и интегрировать ни чего не нужно, есть плагин http://modxcms.com/extras/package/638 с последней версией EditArea. Время установки 60 секунд )

с 1 по 10 из 11 | Далее | Последние

Добавить комментарий

Для форматирования используйте синтаксис Markdown. Если вы не можете разобрать символы в рисунке, нажмите на него для автоматического обновления
Если вы не можете разобрать символы в рисунке, нажмите на него для автоматического обновления
Код безопасности: