Реализация выпадающего меню на базе структуры сайта с помощью xsl-шаблона

#
Re: Реализация выпадающего меню на базе структуры сайта с помощью xsl-шаблона
Создал XSL шаблон как описан в данной теме и назвал его ВыпадающееМеню.
Создал файл menu.js и скопировал в него код.
Прописал все в макете.

В итоге:


Предупреждение: DOMDocument::loadXML() [domdocument.loadxml]: input conversion failed due to input error, bytes 0x98 0xD0 0xBD 0xD0 в файле /modules/Xsl/Xsl.class.php (строка 267)
Предупреждение: DOMDocument::loadXML() [domdocument.loadxml]: input conversion failed due to input error, bytes 0x98 0xD0 0xBD 0xD0 в файле /modules/Xsl/Xsl.class.php (строка 267)
Предупреждение: DOMDocument::loadXML() [domdocument.loadxml]: encoder errorComment not terminated in Entity, line: 26 в файле /modules/Xsl/Xsl.class.php (строка 267)
Предупреждение: DOMDocument::loadXML() [domdocument.loadxml]: Premature end of data in tag choose line 23 in Entity, line: 26 в файле /modules/Xsl/Xsl.class.php (строка 267)
Предупреждение: DOMDocument::loadXML() [domdocument.loadxml]: Premature end of data in tag variable line 23 in Entity, line: 26 в файле /modules/Xsl/Xsl.class.php (строка 267)
Предупреждение: DOMDocument::loadXML() [domdocument.loadxml]: Premature end of data in tag if line 21 in Entity, line: 26 в файле /modules/Xsl/Xsl.class.php (строка 267)
Предупреждение: DOMDocument::loadXML() [domdocument.loadxml]: Premature end of data in tag template line 15 in Entity, line: 26 в файле /modules/Xsl/Xsl.class.php (строка 267)
Предупреждение: DOMDocument::loadXML() [domdocument.loadxml]: Premature end of data in tag stylesheet line 3 in Entity, line: 26 в файле /modules/Xsl/Xsl.class.php


Что делать? А меню очень нужно((((

P.S.: версия системы 5.9.22
#
Re: Реализация выпадающего меню на базе структуры сайта с помощью xsl-шаблона
natalya, подскажите пожалуйста, как решить проблему, описанную выше.
#
Re: Реализация выпадающего меню на базе структуры сайта с помощью xsl-шаблона
замените windows-1251 на utf-8
#
Re: Реализация выпадающего меню на базе структуры сайта с помощью xsl-шаблона
trilogy,
БОЛЬШОЕ спасибо!
#
Re: Реализация выпадающего меню на базе структуры сайта с помощью xsl-шаблона
вот так переделала первоначальный код для выпадающего меню см.ниже
все работает
но мне теперь его надо реализовать в инглиш версии, где структура это 1 и 2 уровень
а не нулевой
что поправить в шаблоне
(смена level=0 на level=1 не помогает)
т.е. в меню у меня щас вообще пусто!

помогите кто знает


<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
      encoding="utf-8" indent="no" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml" />
   
   <xsl:template match="/document">
      <table border="0" cellpadding="0" cellspacing="0" width="100%" style="margin-top: 2px; margin-left: 0px;">
         <tr>
            <xsl:apply-templates select="structure[show=1]"/>
         </tr>
      </table>
   </xsl:template>
   
   <xsl:template match="structure">
      
      <xsl:param name="posit" select="1" />
      
      
      <xsl:variable name="current_structure_id" select="/document/structure/current_structure_id"/>
      <xsl:if test="show_link = 1">
         <!-- Определяем адрес ссылки -->
         <xsl:variable name="link"><xsl:choose>
               <!-- Если внешняя ссылка -->
               <xsl:when test="is_external_link=1"><xsl:value-of disable-output-escaping="yes" select="external_link"/></xsl:when>
               <!-- Иначе если внутренняя ссылка -->
               <xsl:otherwise><xsl:value-of disable-output-escaping="yes" select="link"/></xsl:otherwise>
         </xsl:choose></xsl:variable>
         
         <!-- Определяем стиль вывода ссылки -->
         <xsl:variable name="link_style"><xsl:choose>
               <!-- Выделяем текущую страницу жирным (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
               <xsl:when test="current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">font-weight: bold</xsl:when>
               <!-- Иначе обычный вывод с пустым стилем -->
               <xsl:otherwise></xsl:otherwise>
         </xsl:choose></xsl:variable>
         
         <xsl:choose>
            <xsl:when test="level=0">
               <xsl:choose>
                  <xsl:when test="count(structure[show=1]) > 0">
                     
                     
                     <td valign="top" OnMouseOver="JavaScript:SlideLayer('id_{@id}');" OnMouseOut="JavaScript:SlideLayerHide('id_{@id}');">
                        
                        <div>
                           <a href="{$link}" class="menu_center"><xsl:value-of select="name"/></a>
                        </div>
                        
                        
                        <div style="display: none; z-index: 10; padding-right: 0; margin-top: 1px; margin-left: 0px; margin-right: 0px;" id="id_{@id}">
                           
                           <table border="0" cellpadding="0" cellspacing="0">
                              
                              <xsl:variable name="posit_var" select="position()"/>
                              
                              <xsl:apply-templates select="structure[show=1]">
                                 
                                 <xsl:with-param name="posit" select="$posit_var"/>
                                 
                              </xsl:apply-templates>
                              
                           </table>
                        </div>
                     </td>
                     
                     
                  </xsl:when>
                  <xsl:otherwise>
                     <td  valign="top" align="center">
                        
                        <a href="{$link}" class="menu_center"><xsl:value-of select="name"/></a>
                        
                     </td>
                  </xsl:otherwise>
               </xsl:choose>
               
               
            </xsl:when>
            <xsl:otherwise>
               
               
               <tr>
                  
                  <td><a href="{$link}" class="menu_link_no_bold"><xsl:value-of select="name"/></a>
                  </td>
                  
               </tr>
               
            </xsl:otherwise>
         </xsl:choose>
         
      </xsl:if>
   </xsl:template>
</xsl:stylesheet>
Email: golden-puma@yandex.ru; Skype: golden_puma; Telegram: @GoldenPuma; Сайт: https://goldenpuma.ru
#
Re: Реализация выпадающего меню на базе структуры сайта с помощью xsl-шаблона
Puma писал(а):
смена level=0 на level=1 не помогает
- но это нужно сделать. Кроме того вам еще нужно вместо:
<xsl:template match="/document">
      <table border="0" cellpadding="0" cellspacing="0" width="100%" style="margin-top: 2px; margin-left: 0px;">
         <tr>
            <xsl:apply-templates select="structure[show=1]"/>
         </tr>
      </table>
</xsl:template>

использовать:
<xsl:template match="/document">
      <table border="0" cellpadding="0" cellspacing="0" width="100%" style="margin-top: 2px; margin-left: 0px;">
         <tr>
            <xsl:apply-templates select="//structure[show=1 and level=1]"/>
         </tr>
      </table>
</xsl:template>

#
Re: Реализация выпадающего меню на базе структуры сайта с помощью xsl-шаблона

Извините, несколько раз перечитал весь этот топик и остался в непонятках.
Сделал вариант выпадающее меню Наталии. Пока не форматировал его под себя просто раскрасил фон. Но оно ведет себя не стабильно. приходится действительно ловить мышкой выпадающие пункты. Причем в опере относительно нормально а в эксплоере это невыносимо.

Я посмотрел, меню сайта www.hostcms.ru работает нормально. И у меня вопрос возникает почему нельзя это меню уже готовое с этим оформлением уже заложить в движок? Чтобы просто выбрать его и чуть переделать под себя дизайн.
Или я чегото недогнал?
В этой ветке говорилось о том что все можно взять на демо сайте а я там ничего подобного ненашел.
И про этот момент непонятно какой скрипт переставили? У меня вообще последняя версия халявы стоит а там тотже расклад.
dkbdv писал(а):
Все, перестаю надоедать своими вопросами  В итоге, переставили скрипт с 4.1 до 5 версии, там выпадающее меню уже отшлифовано «на ура». Еще раз огромное спасибо команде HostCMS за поддержку!


Просто может уже окончательный вариант (как на вашем сайте) выложить. Так как меню вещь важная и если она будет нервы пользователям портить они и о движке могут отрицательное мнение сформировать.

Извините за занудный пост, но просто жизнь заставила
#
Re: Реализация выпадающего меню на базе структуры сайта с помощью xsl-шаблона
http://brilescat.ru.swteh.ru/
не выпадают пункты ( в Производителях и Котятах)
скрипт подключен
как проверить срабатывает JS или нет?
Email: golden-puma@yandex.ru; Skype: golden_puma; Telegram: @GoldenPuma; Сайт: https://goldenpuma.ru
#
Re: Реализация выпадающего меню на базе структуры сайта с помощью xsl-шаблона
Puma писал(а):
как проверить срабатывает JS или нет?

ну может кто подскажет в чем может быть проблема?
Email: golden-puma@yandex.ru; Skype: golden_puma; Telegram: @GoldenPuma; Сайт: https://goldenpuma.ru
#
Re: Реализация выпадающего меню на базе структуры сайта с помощью xsl-шаблона
adm.dream писал(а):
этой ветке говорилось о том что все можно взять на демо сайте а я там ничего подобного ненашел
- это потому что раньше у демо-сайта был другой макет, и на нам стандартно было реализовано выпадающее меню. Ниже приведен код XSL-шаблона, реализующего то выпадающее меню узлов структуры сайта:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="utf-8" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
   
   <xsl:template match="/document">
      <table width="100%" border="0" cellpadding="0" cellspacing="0" class="top_menu">
         <tr align="center">
            <!-- Выбираем узлы структуры -->
            <xsl:apply-templates select="structure[show=1]"/>
            <td style="padding-right: 15px;"></td>
         </tr>
      </table>
   </xsl:template>
   
   <xsl:template match="structure">
      
      <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
      <xsl:variable name="current_structure_id" select="/document/structure/current_structure_id"/>
      
      <td></td>
      <td>
         <div class="item_menu_div" id="menu_id_{@id}" onmouseover="TopMenuOver('menu_id_{@id}', 'child_menu_id_{@id}');" onmouseout="TopMenuOut('menu_id_{@id}', 'child_menu_id_{@id}');">
            <div class="tl"></div>
            <div class="tr"></div>
            <div class="bl"></div>
            <div class="br"></div>
            
            <!-- Показывать ссылку, или нет -->
            <xsl:if test="show_link=1">
               <!-- Определяем адрес ссылки -->
               <xsl:variable name="link">
                  <xsl:choose>
                     <!-- Если внешняя ссылка -->
                     <xsl:when test="is_external_link=1">
                        <xsl:value-of disable-output-escaping="yes" select="external_link"/>
                     </xsl:when>
                     <!-- Иначе если внутренняя ссылка -->
                     <xsl:otherwise>
                        <xsl:value-of disable-output-escaping="yes" select="link"/>
                     </xsl:otherwise>
                  </xsl:choose>
               </xsl:variable>
               
               <!-- Определяем стиль вывода ссылки -->
               <xsl:variable name="link_style">
                  <xsl:choose>
                     <!-- Выделяем текущую страницу жирным (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
                     <xsl:when test="current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">font-weight: bold</xsl:when>
                     <!-- Иначе обычный вывод с пустым стилем -->
                     <xsl:otherwise></xsl:otherwise>
                  </xsl:choose>
               </xsl:variable>
               
               <a href="{$link}">
                  <xsl:value-of disable-output-escaping="yes" select="name"/>
               </a>
            </xsl:if>
            
            <!-- Выводим подуровни меню -->
            <xsl:if test="count(structure[show = 1]) &gt; 0">
               <div id="child_menu_id_{@id}" class="poll_down_menu_lev_1" align="left">
                  <div class="tl"></div>
                  <div class="t"></div>
                  <div class="tr"></div>
                  <div class="r"></div>
                  <div class="bl"></div>
                  <div class="b"></div>
                  <div class="br"></div>
                  <div class="l"></div>
                  <ul>
                     <xsl:apply-templates select="structure[show=1]" mode="pool"/>
                  </ul>
               </div>
            </xsl:if>
            
            <!-- Если не показывать ссылку - выводим просто имя ссылки -->
            <xsl:if test="show_link=0">
               <xsl:value-of disable-output-escaping="yes" select="name"/>
            </xsl:if>
         </div>
      </td>
   </xsl:template>
   
   <xsl:template match="structure" mode="pool">
      <li>
         <!-- Показывать ссылку, или нет -->
         <xsl:if test="show_link=1">
            <!-- Определяем адрес ссылки -->
            <xsl:variable name="link">
               <xsl:choose>
                  <!-- Если внешняя ссылка -->
                  <xsl:when test="is_external_link=1">
                     <xsl:value-of disable-output-escaping="yes" select="external_link"/>
                  </xsl:when>
                  <!-- Иначе если внутренняя ссылка -->
                  <xsl:otherwise>
                     <xsl:value-of disable-output-escaping="yes" select="link"/>
                  </xsl:otherwise>
               </xsl:choose>
            </xsl:variable>
            
            <a href="{$link}">
               <xsl:value-of disable-output-escaping="yes" select="name"/>
            </a>
         </xsl:if>
         
         <!-- Если не показывать ссылку - выводим просто имя ссылки -->
         <xsl:if test="show_link=0">
            <xsl:value-of disable-output-escaping="yes" select="name"/>
         </xsl:if>
      </li>
   </xsl:template>
</xsl:stylesheet>

Для корректности его работы и отображения необходимо подключить в коде макета файл /templates/template1/hostcms.js, а также добавить в CSS макета блок стилей:

.top_menu
{
margin-bottom: 30px;
}

.top_menu .item_menu_div
{
position: relative;
background: url('/images/fon_top_menu.gif') repeat-x 0 0;
background-color: #e85200;
height: 29px;
padding: 9px 15px 0px 15px;
white-space: nowrap;
z-index: 1;
}

.top_menu a
{
color: #FFF;
}

.top_menu td
{
padding-left: 15px;
}

.top_menu .poll_down_menu_lev_1
{
position: absolute;
display: none;
background-color: #d62d00;
padding: 5px 10px 5px 10px;
left: 8px;
top: 47px;
}

.top_menu .poll_down_menu_lev_1 ul
{
list-style-type: none;
padding: 0px;
margin: 3px 5px 0px 0px;

/*
opacity: 0.4;
filter: progid:DXImageTransform.Microsoft.Alpha(opacity=50);
*/
}

.top_menu .poll_down_menu_lev_1 li
{
margin-bottom: 3px;
padding-left: 16px;
background: url('/images/li_arr.gif') no-repeat 0 9px;
}
Авторизация