Здравствуйте, уважаемые сообщники.
Позвольте поделиться небольшим рецептиком, который пришлось создать по большой нужде :). При верстке сайта мне понадобился шаблон, в котором к странице цеплялась бы галерея. С самой галереей проблем не было, меня вполне устроила Easy2. Вопрос о том, как именно прикрутить картинки к странице, тоже не стоял – к шаблону прицепился текстовый TV-параметр с номером галереи, а в самом шаблоне был размещен сниппет галереи. После непродолжительного наполнения сайта контентом я понял, что вводить номера или названия папок с картинками на каждой страничке мне лень, энтузиазма на весь проект не хватит, да и запутаться проще простого. Значит, настала пора включить межушный рудимент.
Для начала я напомню вам, что такое @-привязка (@-binding). В возможных и дефолтовых значениях TV-параметров вы можете вводить строки, начинающиеся со знака «@» - это означает, что modx будет брать эти значения из некоего источника, например – из базы данных. Поскольку давить на клавиши мне было лень, тип TV превратился в «radio» - чтобы дать работу мышке. Моя база данных называется «pitomnik», поэтому запрос в графе «Возможные значения» выглядит так:
@SELECT `cat_name`,`cat_id` FROM `pitomnik_easy2_dirs` WHERE `cat_name`!='Easy 2'
Такая строка означает, что в списке возможных значений будут пары из названий и номеров папок в галерее Easy2, кроме корневой папки (с названием «Easy 2» или номером «1»).
Теперь на странице, использующей шаблон с этим параметром, можно выбрать папку картинок галереи Easy2. Чудесно. Все бы было совсем хорошо, но каждая страничка использует свою папку с иллюстрациями, и вываливать каждый раз весь список – неудобно, особенно если документов сотни. Значит, нужно показывать только те папки, которые еще не использовались.
@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'))
Чтобы не было лишних вопросов, «6» - это идентификатор TV, обозначающий выбранную галерею, чтобы не спутать с другими, совершенно посторонними TV, которые могут запутать нас.
На этом эпопея с @-привязкой почти закончилась, осталось лишь маленькое неудобство. При повторном редактировании страницы получалось, что галерея, используемая на данной странице, не отображалась в списке (естественно, она же используется, мы запретили показ таких значений). На практике это означает, что после редактирования страницы галерея от нее «отвалится». Так что пришлось отказаться от привязки «@SELECT» и воспользоваться другим типом привязки – «@EVAL». В этом случае при создании TV в графе «возможные значения» помещается PHP-скрипт, возвращающий строку возможных значений параметра.
Для удобства восприятия я разбил скрипт на строки, но у вас он должен быть записан без переносов. В моем варианте он стал выглядеть так:
@EVAL
$q="SELECT `value` FROM `pitomnik_site_tmplvar_contentvalues` WHERE `tmplvarid`='6' AND `contentid`='".$_GET['id']."';";
$r=mysql_query($q);
$d=mysql_fetch_row($r);
$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]."')";
$result=mysql_query($query);
while($child = mysql_fetch_row($result))
{$output .= $child[0]."==".$child[1]."||"; };
$output .= "no-foto==7";
return $output;
Позвольте прокомментировать по строкам:
- @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
Комментарии (0)