вторник, 25 мая 2010 г.

MODx и создание меню с иконками c помощью снипета Wayfinder

Решил расширить кругозор и изучить CMS для создания сайтов. Давно слышал о MODx и решил поэкспериментировать с ним.



Для начала пришлось разобраться с принципами создания шаблонов, проанализировать работу дефолтного шаблона, понять что такое сниппеты, чанки и прочие премудрости :)

В дефолтном шаблоне увидел что меню реализовано с помощью сниппета wayfinder. Далее дело техники, как говорится гугл в помощь )

Выяснилось следующее - интеграция меню происходит посредством нескольких действий:
  1. Вызов сниппета в шаблоне страницы, выглядит это примерно так:
  [[Wayfinder?startId=`0` &outerTpl=`mam.OuterTpl`&rowTpl=`mam.RowTpl`  &firstClass=`` &hereClass=`-hover`]]       
2. В случае одноуровневого меню нам необходимо настроить 2 шаблона в виде чанка, первый &outerTpl это шаблон контейнера меню
<div class="menuH">
    [+wf.wrapper+]
  </div>
&rowTpl - шаблон пунктов меню верхнего уровня, может выглядеть таким образом:
<div class="img"><a href="[+wf.link+]"><img src="images/button-1.png" alt="[+wf.linktext+]" title="[+wf.linktext+]" height="24"  /></a></div>
но тут возникает трудность, т.к. в моем случае каждый пункт меню имеет свою уникальную иконку и картинки соответственно имена в виде button-1.png, button-1-hover.png, button-2.png, button-2-hover.png, есть специальный подстановщик [+wf.docid+], который подставляет id документа, но проблема в том что структура создавалась не последовательно и id разделов не совпали с индексами картинок. На странице редактирования есть поле Позиция в меню, в котором указывается id для сортировки вывода разделов в меню. Попробовал в лоб написать src="images/button-[+wf.menuindex+][+wf.classnames+].png" не сработало :(  т.к. оказалось нет такого подстановочного шаблона. Но не беда, нагуглил хак вайфиндера
в wayfinder.inc.php изменить: строку 21
var $placeHolders = array(
      'rowLevel' => array('[+wf.wrapper+]','[+wf.classes+]','[+wf.classnames+]','[+wf.link+]','[+wf.title+]','[+wf.linktext+]','[+wf.id+]','[+wf.attributes+]','[+wf.docid+]','[+wf.introtext+]','[+wf.description+]','[+wf.subitemcount+]','[+wf.menuindex+]'),
      'wrapperLevel' => array('[+wf.wrapper+]','[+wf.classes+]','[+wf.classnames+]'),
      'tvs' => array(),
   );
и в  181 (renderRow function)
$phArray = array($useSub,$useClass,$classNames,$resource['link'],$resource['title'],$resource['linktext'],$useId,$resource['link_attributes'],$resource['id'],$resource['introtext'],$resource['description'],$numChildren,$resource['menuindex']);
теперь все пучком и наше меню работает как надо
До встречи ;)

2 комментария:

  1. Отличный способ подставить иконки или картинки вместо каждого пункта меню, а то простой текст уже надоел... Сейчас растолкую что написал автор:
    1.Открывaем assets\snippets\wayfinder\wayfinder.inc
    2. Делаем пару обновлений (описано автором)
    3. Содержимое Чанка mh.RowTpl заменяем на: [+wf.wrapper+]
    замени ЛИ=li ИМГ=img
    (но прежде удостоверьтесь что шаблон Wayfinder действительно использует этот чанк, для этого в шаблоне сайта должно быть написано [[Wayfinder?startId=`0` &rowTpl=`mh.RowTpl`...)
    4. если все ОК, то картинки меню закачиваем в папку images, например: images/button-2.png
    POWERED BY TRINITRON (ICQ:251939070)

    ОтветитьУдалить
  2. Начиная с версии 2.0.2 шаблоны Wayfinder поддерживают также TV-параметры, что позволяет подключать иконки таким образом: img src="[+tvName+]"

    ОтветитьУдалить