Многоуровневое меню Boostrap4 HostCMS

Комментариев: 0

Столкнулись с задачей сделать адаптивную верстку для сайта под управлением HostCMS. В целом, всё довольно логично и понятно, единственное пришлось немного поковыряться с меню. За основу был взят код с официального сообщества HostCMS и немного доработан.

Шаблон вывода меню:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:hostcms="http://www.hostcms.ru/"
	exclude-result-prefixes="hostcms">
	<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="/site">
		<ul class="navbar-nav mr-auto js-append-around">
			<!-- Выбираем узлы структуры первого уровня -->
			<xsl:apply-templates select="structure[show = 1]" />
		</ul>
	</xsl:template>
	
	<xsl:template match="structure">
		<li class="nav-item">
			
			
			
			<xsl:if test="count(structure[show = 1]) > 0">
				<xsl:attribute name="class">nav-item dropdown</xsl:attribute>
				<ul class="dropdown-menu">
					<xsl:apply-templates select="structure[show=1]" mode="sub"/>
				</ul>
			</xsl:if>
			
			<!-- Определяем адрес ссылки -->
			<xsl:variable name="link">
				<xsl:choose>
					<!-- Если внешняя ссылка -->
					<xsl:when test="url != ''">
						<xsl:value-of disable-output-escaping="yes" select="url"/>
					</xsl:when>
					<!-- Иначе если внутренняя ссылка -->
					<xsl:otherwise>
						<xsl:value-of disable-output-escaping="yes" select="link"/>
					</xsl:otherwise>
				</xsl:choose>
			</xsl:variable>
			
			<xsl:choose>
				<xsl:when test="count(structure[show = 1]) > 0">
				<a href="{$link}" title="{name}" class="nav-link dropdown-toggle" data-toggle="dropdown"><xsl:value-of disable-output-escaping="yes" select="name"/><b class="caret"></b></a>
				</xsl:when>
				<xsl:otherwise>
					<a href="{$link}" class="nav-link" title="{name}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
				</xsl:otherwise>
			</xsl:choose>
		</li>
	</xsl:template>
	
	<xsl:template match="structure" mode="sub">
		
		
		
		<xsl:choose>
			<xsl:when test="count(structure[show = 1]) > 0">
				<li class="dropdown-submenu">
					<!-- Определяем адрес ссылки -->
					<xsl:variable name="link">
						<xsl:choose>
							<!-- Если внешняя ссылка -->
							<xsl:when test="url != ''">
								<xsl:value-of disable-output-escaping="yes" select="url"/>
							</xsl:when>
							<!-- Иначе если внутренняя ссылка -->
							<xsl:otherwise>
								<xsl:value-of disable-output-escaping="yes" select="link"/>
							</xsl:otherwise>
						</xsl:choose>
					</xsl:variable>
					
					<!-- Ссылка на пункт меню -->
					<a href="{$link}" class="nav-link" title="{name}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
					<xsl:if test="count(structure[show = 1]) > 0">
						<ul class="dropdown-menu">
							<xsl:apply-templates select="structure[show=1]" mode="sub"/>
						</ul>
						
					</xsl:if>
					
				</li>
			</xsl:when>
			<xsl:otherwise>
				<li>
					<!-- Определяем адрес ссылки -->
					<xsl:variable name="link">
						<xsl:choose>
							<!-- Если внешняя ссылка -->
							<xsl:when test="url != ''">
								<xsl:value-of disable-output-escaping="yes" select="url"/>
							</xsl:when>
							<!-- Иначе если внутренняя ссылка -->
							<xsl:otherwise>
								<xsl:value-of disable-output-escaping="yes" select="link"/>
							</xsl:otherwise>
						</xsl:choose>
					</xsl:variable>
					
					<!-- Ссылка на пункт меню -->
					<a href="{$link}" class="nav-link" title="{name}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
					<xsl:if test="count(structure[show = 1]) > 0">
						<ul class="dropdown-menu">
							<xsl:apply-templates select="structure[show=1]" mode="sub"/>
						</ul>
						
					</xsl:if>
					
				</li>
			</xsl:otherwise>
		</xsl:choose>
		
		
	</xsl:template>
</xsl:stylesheet>

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *