Copied to clipboard

Flag this post as spam?

This post will be reported to the moderators as potential spam to be looked at


  • Jonathan Heaton 2 posts 22 karma points
    Feb 25, 2010 @ 11:52
    Jonathan Heaton
    0

    Umbraco Menu macro disappears first when click menu link

    Hey,

    Im using Umbraco 4 and have built a menu using a macro.  I have one issue though when I click on a menu item the entire macro disappears immediately, some time before the rest of the page disappears so the new page can render.  The new page renders the menu at the same time as the rest of the page though.

    Any ideas on why this could be happening? 

    cheers 

    Jon

  • Chris Gaskell 59 posts 142 karma points
    Feb 25, 2010 @ 12:11
    Chris Gaskell
    0

    Jon

    Could you post your XSLT please. Dont forget the apply the 'code' style - makes it much easier to read :)

    Chris.

  • Jonathan Heaton 2 posts 22 karma points
    Feb 26, 2010 @ 22:50
    Jonathan Heaton
    0

    The menu is mtt_UltimateNav module.   Heres the xslt.  thanks Jon

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE xsl:stylesheet [
      <!ENTITY nbsp "&#x00A0;">
    ]>

    <xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:msxml="urn:schemas-microsoft-com:xslt"
      xmlns:msxsl="urn:schemas-microsoft-com:xslt"
      xmlns:umbraco.library="urn:umbraco.library"
      xmlns:netaddicts-be="urn:netaddicts-be:xslt"
      exclude-result-prefixes="msxml umbraco.library netaddicts-be">

      <xsl:output method="xml" omit-xml-declaration="yes"/>

      <xsl:param name="currentPage"/>



      <!-- Holds the start node for the navigation. Optional -->
      <xsl:param name="startNodeId" select="/macro/startNodeId"/>
      <!-- Holds the current page node for the navigation. Optional -->
      <!--<xsl:param name="currentPage" select="/macro/currentPage"/>-->

      <!-- Holds number of sublevels to generate. Macro parameter is optional. Defaults to one if not supplied -->
      <xsl:param name="maxDrilldownLevel" select="netaddicts-be:ReadMacroParameter(//macro/maxLevels,'1')"/>

      <xsl:template match="/">



        <!-- Check whether a start node has been supplied -->
        <xsl:choose>
          <xsl:when test="$startNodeId != ''">

            <!-- Start building the top navigation from the node supplied by start node id -->
            <xsl:call-template name="buildTopNavigation">
              <xsl:with-param name="navigationNodes" select="umbraco.library:GetXmlNodeById($startNodeId)"/>
              <!-- <xsl:with-param name="currentPage" />-->
            </xsl:call-template>

          </xsl:when>
          <xsl:otherwise>

            <!-- Start building navigation from top level node -->
            <xsl:call-template name="buildTopNavigation">
              <xsl:with-param name="navigationNodes" select="umbraco.library:GetXmlAll()"/>
              <!--<xsl:with-param name="currentPage" />-->
            </xsl:call-template>

          </xsl:otherwise>
        </xsl:choose>

      </xsl:template>

      <!-- Start building the top navigation (first level navigation) -->
      <xsl:template name="buildTopNavigation">
        <xsl:param name="navigationNodes"/>
        <!--<xsl:param name="currentPage"/>-->
        

          <ul  id="menu-sections" class="typeface-js mainNav">

            <li>
              <xsl:if test="1226=$currentPage/@id">
                <xsl:attribute name="class">active</xsl:attribute>
              </xsl:if>
              <a href="/ebp-homepage.aspx">
                <span>HOME</span>
              </a>
            </li>

            <!-- Iterate child nodes -->
            <xsl:for-each select="$navigationNodes/child::node">

              <!-- Create var for easier reading/processing -->
              <xsl:variable name="currentProcessedNode" select="."/>
              <xsl:variable name="currentLevel" select="0"/>

              <!-- Check whether node should be visible in first level navigation -->
              <xsl:if test="string($currentProcessedNode/data [@alias = 'umbracoNaviHide']) != '1'">

                

                <li>
                
                  

                  <xsl:if test="$currentPage/ancestor::node/@id = current()/@id">
                    <xsl:attribute name="class">child_selected active</xsl:attribute>
                  </xsl:if>
                  

                  <!-- Build the navigation link using the node currently being processed in the for-each loop -->
                  <xsl:call-template name="buildLink">
                    <xsl:with-param name="node" select="$currentProcessedNode"/>
                  </xsl:call-template>

                  <!-- Build next level navigation only if applicable -->
                  <!-- Still need to check whether all child nodes have been set to umbracoHideChildren = 1 whereas umbracoNaviHide = 0
                    this case would yield an empty ul element -->
                  <xsl:if test="(count($currentProcessedNode/node) &gt; 0)
                          and (string($currentProcessedNode/data [@alias = 'umbracoHideChildren']) != '1')
                          and ($currentLevel &lt; $maxDrilldownLevel)">
                    <xsl:call-template name="buildNavigation">
                      <xsl:with-param name="parentNode" select="$currentProcessedNode"/>
                      <xsl:with-param name="level" select="$currentLevel + 1"/>
                    </xsl:call-template>
                  </xsl:if>

                </li>

              </xsl:if>

            </xsl:for-each>
            
          </ul>

      </xsl:template>

      <!-- A template used for building the non top navigation tree -->
      <xsl:template name="buildNavigation">
        <xsl:param name="parentNode"/>
        <xsl:param name="level"/>
        
        <ul>
          <!-- Iterate over the child nodes-->
          <xsl:for-each select="$parentNode/node">

            <!-- Create var for easier reading/processing -->
            <xsl:variable name="currentProcessedNode" select="."/>

            <!-- Check whether node should be processed -->
            <xsl:if test="string($currentProcessedNode/data [@alias = 'umbracoNaviHide']) != '1'">

              <li class="child">

                <xsl:if test="@id=$currentPage/@id">
                  <xsl:attribute name="class">child childactive</xsl:attribute>
                </xsl:if>
                <xsl:if test="not(@id=$currentPage/@id)">
                  <xsl:attribute name="class">child</xsl:attribute>
                </xsl:if>

                <!-- Build the navigation link -->
                <xsl:call-template name="buildLink">
                  <xsl:with-param name="node" select="$currentProcessedNode"/>
                </xsl:call-template>

                <!-- Build next level navigation only if applicable; recursive call -->
                <!-- Still need to check whether all child nodes have been set to umbracoHideChildren = 1 whereas umbracoNaviHide = 0
                    this case would yield an empty ul element -->
                <xsl:if test="
                        (count($currentProcessedNode/node) &gt; 0) 
                          and (string($currentProcessedNode/data [@alias = 'umbracoHideChildren']) != '1')
                          and ($level &lt; $maxDrilldownLevel)">
                  <xsl:call-template name="buildNavigation">
                    <xsl:with-param name="parentNode" select="$currentProcessedNode"/>
                    <xsl:with-param name="level" select="$level + 1"/>
                  </xsl:call-template>
                </xsl:if>

              </li>

            </xsl:if>

          </xsl:for-each>
          
        </ul>
        
      </xsl:template>

      <!-- A template that builds our navigation link based on node properties -->
      <xsl:template name="buildLink">
        <xsl:param name="node"/>

        <xsl:choose>

          <!-- Build link to external page -->
          <xsl:when test="string($node/data [@alias = 'externalURL']) != ''">

            <xsl:call-template name="buildExternalLink">
              <xsl:with-param name="node" select="$node"/>
            </xsl:call-template>

          </xsl:when>

          <!-- Build link for redirecting to a custom supplied url -->
          <xsl:when test="string($node/data [@alias = 'umbracoRedirect']) != ''">

            <xsl:call-template name="buildRedirectLink">
              <xsl:with-param name="node" select="$node"/>
            </xsl:call-template>

          </xsl:when>

          <!-- Default link builder -->
          <xsl:otherwise>

            <xsl:call-template name="buildNormalLink">
              <xsl:with-param name="node" select="$node"/>
            </xsl:call-template>

          </xsl:otherwise>
        </xsl:choose>

      </xsl:template>

      <!-- A template that builds a link to an external page -->
      <xsl:template name="buildExternalLink">
        <xsl:param name="node"/>

        <!--
        <xsl:call-template name ="outputNode">
          <xsl:with-param name="currentNode" select="$node"/>
        </xsl:call-template>
        -->

        <a>
         
          <!-- Set the href attribute -->
          <xsl:attribute name="href">
            <xsl:value-of select="$node/data [@alias = 'externalURL']"/>
          </xsl:attribute>
          <!-- Set the target attribute if available from the properties -->
          <xsl:if test="string($node/data [@alias = 'externalTarget']) != ''">
            <xsl:attribute name="target">
              <xsl:value-of select="$node/data [@alias = 'externalTarget']"/>
            </xsl:attribute>
          </xsl:if>
          <!-- Set the title attribute if available from the properties -->
          <xsl:if test="string($node/data [@alias = 'navTooltip']) != ''">
            <xsl:attribute name="title">
              <xsl:value-of select="string($node/data [@alias = 'navTooltip'])"/>
            </xsl:attribute>
          </xsl:if>
          <!-- Set actual text for the link, either available from the properties or just plain umbraco link-->
          <span>
          <xsl:choose>
            <xsl:when test="string($node/data [@alias = 'navText']) != ''">
              <xsl:value-of select="string($node/data [@alias = 'navText'])"/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:value-of select="$node/@nodeName"/>
            </xsl:otherwise>
          </xsl:choose>
          </span>
        </a>

      </xsl:template>

      <xsl:template name="buildRedirectLink">
        <xsl:param name="node"/>

        <!--
        <xsl:call-template name ="outputNode">
          <xsl:with-param name="currentNode" select="$node"/>
        </xsl:call-template>
        -->

        <a>
          <!-- Set the href attribute based on the redirect supplied -->
          <xsl:attribute name="href">
            <!--<xsl:value-of select="netaddicts-be:FixLink(string($node/data [@alias = 'umbracoRedirect']))"/>-->
            <xsl:value-of select="umbraco.library:NiceUrl($node/@id)"/>
          </xsl:attribute>
          <!-- Set the title attribute if available from the properties -->
          <xsl:if test="string($node/data [@alias = 'navTooltip']) != ''">
            <xsl:attribute name="title">
              <xsl:value-of select="string($node/data [@alias = 'navTooltip'])"/>
            </xsl:attribute>
          </xsl:if>
          <!-- Set actual text for the link, either available from the properties or just plain umbraco link-->
          <span>
           <xsl:choose>
            <xsl:when test="string($node/data [@alias = 'navText']) != ''">
              <xsl:value-of select="string($node/data [@alias = 'navText'])"/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:value-of select="$node/@nodeName"/>
            </xsl:otherwise>
          </xsl:choose>
          </span>
        </a>

      </xsl:template>
      
      <xsl:template name="buildNormalLink">
        <xsl:param name="node"/>

        <!--
        <xsl:call-template name ="outputNode">
          <xsl:with-param name="currentNode" select="$node"/>
        </xsl:call-template>
        -->

        <a>
          <!-- Set the href attribute, either the alias if available, else use NiceUrl() -->
          <xsl:attribute name="href">
            <xsl:choose>
              <xsl:when test="string($node/data [@alias = 'umbracoUrlAlias']) != ''">
                <xsl:value-of select="netaddicts-be:FixLink(string($node/data [@alias = 'umbracoUrlAlias']))"/>
              </xsl:when>
              <xsl:otherwise>
                <xsl:value-of select="umbraco.library:NiceUrl($node/@id)"/>
              </xsl:otherwise>
            </xsl:choose>
          </xsl:attribute>
          <!-- Set the title attribute if available from the properties -->
          <xsl:if test="string($node/data [@alias = 'navTooltip']) != ''">
            <xsl:attribute name="title">
              <xsl:value-of select="string($node/data [@alias = 'navTooltip'])"/>
            </xsl:attribute>
          </xsl:if>
          <!-- Set actual text for the link, either available from the properties or just plain umbraco link-->
          <span>
          <xsl:choose>
            <xsl:when test="string($node/data [@alias = 'navText']) != ''">
              <xsl:value-of select="string($node/data [@alias = 'navText'])"/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:value-of select="$node/@nodeName"/>
            </xsl:otherwise>
          </xsl:choose>
          </span>
        </a>

      </xsl:template>

      <!-- For debugging purposes, writes out all relevant node properties -->
      <xsl:template name="outputNode">
        <xsl:param name="currentNode"/>
        <ul>
          <li>
            @id=<xsl:value-of select="$currentNode/@id"/>
          </li>
          <li>
            @nodeName=<xsl:value-of select="$currentNode/@nodeName"/>
          </li>
          <li>
            @umbracoNaviHide=<xsl:value-of select="$currentNode/data [@alias = 'umbracoNaviHide']"/>
          </li>
          <li>
            @umbracoHideChildren=<xsl:value-of select="$currentNode/data [@alias = 'umbracoHideChildren']"/>
          </li>
          <li>
            @navText=<xsl:value-of select="$currentNode/data [@alias = 'navText']"/>
          </li>
          <li>
            @navTooltip=<xsl:value-of select="$currentNode/data [@alias = 'navTooltip']"/>
          </li>
          <li>
            @externalURL=<xsl:value-of select="$currentNode/data [@alias = 'externalURL']"/>
          </li>
          <li>
            @externalTarget=<xsl:value-of select="$currentNode/data [@alias = 'externalTarget']"/>
          </li>
          <li>
            @umbracoRedirect=<xsl:value-of select="$currentNode/data [@alias = 'umbracoRedirect']"/>
          </li>
          <li>
            @umbracoUrlAlias=<xsl:value-of select="$currentNode/data [@alias = 'umbracoUrlAlias']"/>
          </li>
        </ul>
      </xsl:template>

      <msxsl:script language="C#" implements-prefix="netaddicts-be">
        <![CDATA[
        
        //Function is taken from XSLTSearch by Douglas Robar from Percipient Studios (http://www.percipientstudios.com/)
        public string ReadMacroParameter(string value, string defaultValue) {
          if (value == "")
            return defaultValue;
          else
            return value.Replace(" ", "");
        }
        
        //Function fixes a possible wrongly formatted link
        public string FixLink(string oldLink) {
          string newLink = string.Empty;
          
          if (!oldLink.StartsWith("/"))
            newLink += "/";
          newLink += oldLink;
          if (!oldLink.EndsWith(".aspx"))
            newLink += ".aspx";
          
          return newLink;
        }
      
      ]]>
      </msxsl:script>
      

    </xsl:stylesheet>

  • Nik Wahlberg 639 posts 1237 karma points MVP
    Feb 27, 2010 @ 05:03
    Nik Wahlberg
    0

    Hi Jon,

    This XSLT is fairly comprehensive (and built by one of our 'masters'). I guess the better question here is: What are you trying to accomplish? A simple top nav with submenu? Only a top navigation? If you post your requirements and a snippet of your site structure we should be able to help.

    Thanks,
    Nik

  • This forum is in read-only mode while we transition to the new forum.

    You can continue this topic on the new forum by tapping the "Continue discussion" link below.

Please Sign in or register to post replies