Многоуровневое меню на usel

Сегодня я буду рассказывать, как вывести многоуровневое меню средствами usel протокола на примере и tpl, и xslt шаблонизатора. 
Как вывести меню, используя usel протокол, вы можете почитать на wiki.umisoft в статье Меню с помощью Usel (для tpl-шаблонизатора)
Видеокаст прикреплен снизу.

Вся задумка состоит в том, чтобы обращаться через usel протокол только к одному уровню и, при выводе каждого найденного пункта, пытаться вывести через usel протокол подпункты. Поэтому мы создаем, также как и в статье на wiki, новое поле типа "кнопка-галочка" с именем "Новое меню" (вы можете назвать поле как угодно, главное, правильно написать латинский вариант в usel файле, см.ниже). Затем отмечаем некоторые страницы этой галочкой, создаем файл usel выборки и файлы вывода результата.

А теперь по пунктам с приведенным кодом.

  1. Сделать файл для usel выборки, который будет учитывать уровень вложенности, или, проще говоря, искать только там где ему скажут. Для этого создадим файл /usels/new_menu.xml
    <?xml version="1.0" encoding="utf-8"?>
    <selection>
    	<target result="pages">
    		<type id="10" />
    		<category depth="1">{1}</category> 
    	</target>
    	<property name="novoe_menyu" value="1" />
    </selection>
  2. Создадим шаблон вывода результатов.
    1. TPL шаблонизатор: Создаем файл /tpls/usels/new_m.tpl
      <?php
      
      $FORMS = Array();
      
      $FORMS['elements_block'] = <<<END
      <ul>
      	%items%
      </ul>
      END;
      
      $FORMS['elements_block_line'] = <<<END
      <li><a href="%link%">%name%</a>
      	%data doSelection(new_m,new_menu, 14 )%
      </li>
      
      END;
      
      $FORMS['elements_block_empty'] = <<<END
      
      END;
      
      $FORMS['separator'] = <<<END
      |
      END;
      
      $FORMS['separator_last'] = <<<END
      !
      END;
      ?>
    2. XSLT шаблонизатор: Создадим дополнительные шаблоны. В примере я создал их в файле /xsltTpls/modules/content/common.xsl
      <xsl:template match="udata" mode="new_menu" />
      	
      	<xsl:template match="udata[page]" mode="new_menu">
      		<ul>
      			<xsl:apply-templates select="page" mode="new_menu" />
      		</ul>
      	</xsl:template>
      	
      	<xsl:template match="page" mode="new_menu">
      		<li><a href="{@link}"><xsl:value-of select="name" /></a>
      			<xsl:apply-templates select="document(concat('usel://new_menu/',@id))/udata" mode="new_menu" />
      		</li>
      	</xsl:template>
  3. Вызов usel протокола делаем следующим образом:
    1. XSLT шаблонизатор: вставляем в нужное место вызов протокола usel
      <xsl:apply-templates select="document('usel://new_menu/0')/udata" mode="new_menu" />
    2. TPL шаблонизатор: вставляем в нужном месте вызов макроса doSelection
      %data doSelection(new_m,new_menu,0)%

Видеокаст:



comments powered by HyperComments