We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 21773
    • 8 Posts
    こんにちは。
    初めてのPostで質問とは、なんとも申し訳ないのですが、助けてください。

    PHPの事はさっぱり分からない、WEBデザイナーです。
    テンプレートを作っているのですが、DropMenuの仕様がわからず、ここ3日程ハマっています huh
    いろいろな方法で試してみましたが、思う様に動かず。

    とりあえず、下記の様に記述してみました。

    <div id="navigation">
       [!DropMenu? &selfAsLink=`1` &useCategoryFolders=`1` &startDoc=`0` &subdivClass=hoverZone &hereClass=`here`!]
    </div>


    この内容で書き出されるのが、下記になります。

    <div id="navigation">
       <ul class="topnav">
          <li><a href="index.html" title="">TOP</a></li>
          <li><a href="category1.html" title="">カテゴリ1</a></li>
          <ul>
             <li><a href="category1/1-one.html" title="">カテゴリ1のサブメニュー1</a></li>
             <li><a href="category1/1-two.html" title="">カテゴリ1のサブメニュー2</a></li>
             <li class="last"><a href="category1/1-three.html" title="">カテゴリ1のサブメニュー3</a></li>
          </ul>
          <li><a href="category2.html" title="">カテゴリ2</a></li>
          <li class="here last"><a href="category3.html" title="">カテゴリ3</a></li>
          <ul>
             <li><a href="category3/3-one.html" title="">カテゴリ3のサブメニュー1</a></li>
             <li><a href="category3/3-two.html" title="">カテゴリ3のサブメニュー2</a></li>
             <li class="last"><a href="category3/3-three.html" title="">カテゴリ3のサブメニュー3</a></li>
          </ul>
          <li class="lest"><a href="category4.html" title="">カテゴリ4</a></li>
       </ul>
    </div>


    この内容を、

    <div id="navigation">
       <ul class="topnav">
          <li class="firstcategory"><a href="index.html" title="">TOP</a></li>
          <li class="category"><a href="category1.html" title="">カテゴリ1</a>
          <ul>
             <li class="first"><a href="category1/1-one.html" title="">カテゴリ1のサブメニュー1</a></li>
             <li><a href="category1/1-two.html" title="">カテゴリ1のサブメニュー2</a></li>
             <li class="last"><a href="category1/1-three.html" title="">カテゴリ1のサブメニュー3</a></li>
          </ul>
          </li>
          <li class="category"><a href="category2.html" title="">カテゴリ2</a></li>
          <li class="here category"><a href="category3.html" title="">カテゴリ3</a>
          <ul>
             <li class="first"><a href="category3/3-one.html" title="">カテゴリ3のサブメニュー1</a></li>
             <li><a href="category3/3-two.html" title="">カテゴリ3のサブメニュー2</a></li>
             <li class="last"><a href="category3/3-three.html" title="">カテゴリ3のサブメニュー3</a></li>
          </ul>
          </li>
          <li class="lastcategory"><a href="category4.html" title="">カテゴリ4</a></li>
       </ul>
    </div>


    この様にclassを埋め込みたい場合は、DropMenuの記述はどの様にしたらよいのでしょうか。
    もしや、Snippetを作らなくてはムリ?
    リスト出力を変えようと思ったら、やはりSnippetやPHPを作る能力が必要っぽいですね...。

    どうぞ、お知恵を拝借したく、よろしくお願いします :’(

    すみません、CODEを間違えていたので書き直しました。
      • 33488
      • 429 Posts
      この様にclassを埋め込みたい場合は、DropMenuの記述はどの様にしたらよいのでしょうか。
      もしや、Snippetを作らなくてはムリ?
      リスト出力を変えようと思ったら、やはりSnippetやPHPを作る能力が必要っぽいですね...。
      誰もレスがないようなので・・・とりあえず、ばっさり言っちゃうとDropMenuを改造する必要はありますね
      http://modxcms.com/forums/index.php/topic,3996.0.html
      をベースにちらっとみたところ、LIのLastにはLastというクラス名が付けられています。
      これにFirst側を付ければ1つは解決になるかと思います。
      トップの階層と次の階層の切り分けは、DIVで分けることはできるので、DIVとUL/LIをMIXした形でCSSを作ればいいじゃないかなと思います。(CSSの細かい部分は、おまかせ)

      試しに、ちらっと改造したコードは以下の通り。
      // ###########################################
      // DropMenu                                  #
      // ###########################################
      // Configurable menu / navigation builder using UL tags
      // Offers optional DIV wrappers for top level and nested menus (useful for hover zones)
      // as well as configurable classes for the DIV, UL, and LI elements.  It even
      // marks ancestors of and the current element with a Class (indicating you are here
      // and in this area of the site).  Also applies .last CSS class to final LI in each UL.
      //
      // Developed by Vertexworks.com and Opengeek.com
      // Feel free to use if you keep this header and credits in place
      //
      // Inspired by List Site Map by Jaredc, SimpleList by Bravado,
      // and ListMenuX by OpenGeek
      //
      // Configuration parameters:
      //
      // &menuName        - name of a placeholder for placing the output in the layout
      // &topnavClass     - CSS class for styling the class assigned to the outermost UL
      //
      // TO DO: configuration parameters above, more usage examples, CSS examples, output indenting
      
      // ###########################################
      // Usage Examples                            #
      // ###########################################
      // Creates menu with wrapping DIV with id=myMenu, starting at the site root, two levels deep,
      // with descriptions next to the links, and nested UL elements with class=nestedLinks; output
      // of menu can be placed in layout using placeholder named myMenu ( e.g. [ +myMenu+ ] )
      // [[DropMenu? &menuName=`myMenu` &startDoc=`0` &levelLimit=`2` &topdiv=`true` &showDescription=`true` &subnavClass=`nestedLinks`]]
      //
      // Creates topMenu from site root, including only 1 level, with class=topMenubar applied to the top level UL
      // and class=activeLink applied to current page LI
      // [[DropMenu? &menuName=`topMenu` &startDoc=`0` &levelLimit=`1` &topnavClass=`topMenubar` &here=`activeLink`]]
      //
      // Creates dropmenu 3 levels deep, with DIV wrappers around all nested lists styled with class=hoverZone
      // and currentPage LI styled with class=currentPage
      // [[DropMenu? &levelLimit=3 &subdiv=true &subdivClass=hoverZone &subnavClass=menuZone &here=currentPage]]
      //
      // Creates dropmenu of infinite levels, ordered by menutitle in descending order
      // [[DropMenu?orderBy=menutitle&orderDesc=true]]
      
      // ###########################################
      // Configuration parameters                  #
      // ###########################################
      
      // $phMode [ true | false ]
      // Whether you want it to output a [+placeholder+] or simply return the output.
      // Defaults to false.
      $phMode = false;
      
      // $menuName [ string ]
      // Sets the name of the menu, placeholder, and top level DIV id (if topdiv
      // option is true). Set to "dropmenu" by default.
      $phName = (!isset($phName)) ? 'dropmenu' : "$phName";
      
      // $siteMapRoot [int]
      // The parent ID of your root. Default 0. Can be set in
      // snippet call with startDoc (to doc id 10 for example):
      // [[DropMenu?startDoc=10]]
      $siteMapRoot = 0;
      
      // $removeNewLines [ true | false ]
      // If you want new lines removed from code, set to true. This is generally
      // better for IE when lists are styled vertically.
      $removeNewLines = (!isset($removeNewLines)) ? false : ($removeNewLines==true);
      
      // $maxLevels [ int ]
      // Maximum number of levels to include. The default 0 will allow all
      // levels. Also settable with snippet variable levelLimit:
      // [[DropMenu?levelLimit=2]]
      $maxLevels = 0;
      
      
      // $textOfLinks [ string ]
      // What database field do you want the actual link text to be?
      // The default is pagetitle because it is always a valid (not empty)
      // value, but if you prefer it can be any of the following:
      // menutitle, id, pagetitle, description, parent, alias, longtitle, introtext
      // TO DO: set text to be first non-empty of an array of options
      $textOfLinks = (!isset($textOfLinks)) ? 'menutitle' : "$textOfLinks";
      
      // $titleOfLinks [ string ]
      // What database field do you want the title of your links to be?
      // The default is pagetitle because it is always a valid (not empty)
      // value, but if you prefer it can be any of the following:
      // menutitle, id, pagetitle, description, parent, alias, longtitle, introtext
      $titleOfLinks = (!isset($titleOfLinks)) ? 'description' : "$titleOfLinks";
      
      // $pre [ string ]
      // Text to append before links inside of LIs
      $pre = (!isset($pre)) ? '' : "$pre";
      
      // $post [ string ]
      // Text to append before links inside of LIs
      $post = (!isset($post)) ? '' : "$post";
      
      // $selfAsLink [ true | false ]
      // Define if the current page should be a link (true) or not (false)
      $selfAsLink = (!isset($selfAsLink)) ? false : ($selfAsLink==true);
      
      // $hereClass [ string ]
      // CSS Class for LI and A when they are the currently selected page, as well
      // as any ancestors of the current page (YOU ARE HERE)
      $hereClass = (!isset($hereClass)) ? 'here' : $hereClass;
      
      
      
      // $showDescription [true | false]
      // Specify if you would like to include the description
      // with the page title link.
      $showDescription = (!isset($showDescription)) ? false : ($showDescription==true);
      
      // $descriptionField [ string ]
      // What database field do you want the description to be?
      // The default is description. If you specify a field, it will attempt to use it
      // first then fall back until it finds a non-empty field in description, introtext,
      // then longtitle so it really tries not be empty. It can be any of the following:
      // menutitle, id, pagetitle, description, parent, alias, longtitle, introtext
      // TO DO: set description to the first non-empty of an array of options
      $descriptionField = (!isset($descriptionField)) ? 'description' : "$descriptionField";
      
      
      // $topdiv [ true | false ]
      // Indicates if the top level UL is wrapped by a containing DIV block
      $topdiv = (!isset($topdiv)) ? false : ($topdiv==true);
      
      // $topdivClass [ string ]
      // CSS Class for DIV wrapping top level UL
      $topdivClass = (!isset($topdivClass)) ? 'topdiv' : "$topdivClass";
      
      // $topnavClass [ string ]
      // CSS Class for the top-level (root) UL
      $topnavClass = (!isset($topnavClass)) ? 'topnav' : "$topnavClass";
      
      
      
      // $useCategoryFolders [ true | false ]
      // If you want folders without any content to render without a link to be used
      // as "category" pages (defaults to true). In order to use Category Folders,
      // the template must be set to (blank) or it won't work properly.
      $useCategoryFolders = (!isset($useCategoryFolders)) ? true : "$useCategoryFolders";
      
      // $categoryClass [ string ]
      // CSS Class for folders with no content (e.g., category folders)
      $categoryClass = (!isset($categoryClass)) ? 'category' : "$categoryClass";
      
      
      
      // $subdiv [ true | false ]
      // Indicates if nested UL's should be wrapped by containing DIV blocks
      // This is useful for creating "hover zones"
      // (see http://positioniseverything.net/css-dropdowns.html for a demo)
      // TO CONSIDER: Setting a subdiv class at all turns on hover DIVs?
      $subdiv = (!isset($subdiv)) ? false : ($subdiv==true);
      
      // $subdivClass [ string ]
      // CSS Class for DIV blocks wrapping nested UL elements
      $subdivClass = (!isset($subdivClass)) ? 'subdiv' : "$subdivClass";
      
      
      
      // $orderBy [ string ]
      // Document field to sort menu by
      $orderBy = (!isset($orderBy)) ? 'menuindex' : "$orderBy";
      
      // $orderDesc [true | false]
      // Order results in descending order?  default is false
      $orderDesc = (!isset($orderDesc)) ? false : ($orderDesc==true);
      
      
      // HACK: activeTreeOnly
      // $activeTreeOnly [ true | false ]
      // Define if the menutree should show all menuitems or only those in active menutree branch
      $activeTreeOnly = (!isset($activeTreeOnly)) ? false : ($activeTreeOnly==true);
      
      
      //
      // HACK: first li class
      $firstClass = (!isset($firstClass)) ? '': $firstClass;
      
      // ###########################################
      // End config, the rest takes care of itself #
      // ###########################################
      
      $debugMode = false;
      
      // Initialize
      $MakeMap = "";
      $siteMapRoot = (isset($startDoc)) ? $startDoc : $siteMapRoot;
      $maxLevels = (isset($levelLimit)) ? $levelLimit : $maxLevels;
      $ie = ($removeNewLines) ? '' : "\n";
      //Added by Remon: (undefined variables php notice)
      $activeLinkIDs = array();
      $subnavClass = (!isset($subnavClass)) ? '':$subnavClass;
      
      // Overcome single use limitation on functions
      global $MakeMap_Defined;
      
      if (!isset ($MakeMap_Defined)) {
        function filterHidden($var) {
          return (!$var['hidemenu']==1);
        }
        function filterEmpty($var) {
            return (!empty($var));
        }
        function MakeMap($modx, $listParent, $listLevel, $description, $titleOfLinks, $maxLevels, $inside, $pre, $post, $selfAsLink, $ie, $activeLinkIDs, $topdiv, $topdivClass, $topnavClass, $subdiv, $subdivClass, $subnavClass, $hereClass, $useCategoryFolders, $categoryClass, $showDescription, $descriptionField, $textOfLinks, $orderBy, $orderDesc, $activeTreeOnly,$firstClass, $debugMode) {
          // Added by Remon. Define this variable _here_ ;-)
          $output = '';
      
          $children = $modx->getActiveChildren($listParent, $orderBy, (!$orderDesc) ? 'ASC' : 'DESC', 'id, pagetitle, description, isfolder, parent, alias, longtitle, menutitle, hidemenu, introtext, content_dispo, contentType, type, template');
          // filter out the content that is set to be hidden from menu snippets
          $children = array_filter($children, "filterHidden");
          $numChildren = count($children);
      
          if (is_array($children) && !empty($children)) {
      
            // determine if it's a top category or not
            $toplevel = !$inside;
      
            // build the output
            $topdivcls = (!empty($topdivClass)) ? ' class="'.$topdivClass.'"' : '';
            $topdivblk = ($topdiv) ? "<div$topdivcls>" : '';
            $topnavcls = (!empty($topnavClass)) ? ' class="'.$topnavClass.'"' : '';
            $subdivcls = (!empty($subdivClass)) ? ' class="'.$subdivClass.'"' : '';
            $subdivblk = ($subdiv) ? "<div$subdivcls>$ie" : '';
            $subnavcls = (!empty($subnavClass)) ? ' class="'.$subnavClass.'"' : '';
            $output = ($toplevel) ? "$topdivblk<ul$topnavcls>$ie" : "$ie$subdivblk<ul$subnavcls>$ie";
      
            //loop through and process subchildren
            $firstFlg = true;
            foreach ($children as $child) {
              // figure out if it's a containing category folder or not
              $numChildren --;
              $isFolder = $child['isfolder'];
                $itsEmpty = ($isFolder && ($child['template'] == '0'));
              $itm = "";
      
                      // if menutitle is blank fall back to pagetitle for menu link
                      $textOfLinks = (empty($child['menutitle'])) ? 'pagetitle' : "$textOfLinks";
      
                // If at the top level
              if (!$inside)
              {
                $itm .= ((!$selfAsLink && ($child['id'] == $modx->documentIdentifier)) || ($itsEmpty && $useCategoryFolders)) ?
                        $pre.$child[$textOfLinks].$post . (($debugMode) ? ' self|cat' : '') :
                        '<a href="[~'.$child['id'].'~]" title="'.$child[$titleOfLinks].'">'.$pre.$child[$textOfLinks].$post.'</a>';
                $itm .= ($debugMode) ? ' top' : '';
              }
      
              // it's a folder and it's below the top level
              elseif ($isFolder && $inside)
              {
      
                $itm .= ($itsEmpty && $useCategoryFolders) ?
                        $pre.$child[$textOfLinks].$post . (($debugMode) ? 'subfolder T': '') :
                        '<a href="[~'.$child['id'].'~]" title="'.$child[$titleOfLinks].'">'.$pre.$child[$textOfLinks].$post.'</a>'. (($debugMode) ? ' subfolder F' :'');
              }
      
              // it's a document inside a folder
              else
              {
                $itm .= ($child['alias'] > '0' && !$selfAsLink && ($child['id'] == $modx->documentIdentifier)) ? $child[$textOfLinks] : '<a href="[~'.$child['id'].'~]" title="'.$child[$titleOfLinks].'">'.$child[$textOfLinks].'</a>';
                $itm .= ($debugMode) ? ' doc' : '';
              }
              $itm .= ($debugMode)? "$useCategoryFolders $isFolder $itsEmpty" : '';
      
              // BEGIN HACK: activeTreeOnly
              // loop back through if the doc is a folder and has not reached the max levels
              if ($isFolder && (($maxLevels == 0) || ($maxLevels > $listLevel +1))) {
                // activeTreeOnly TRUE
                if ($activeTreeOnly)
                {
                	$makeMapYes = FALSE;
                  if (is_array($activeLinkIDs))
                  {
                    if ($child['id'] == $modx->documentIdentifier || in_array($child['id'], $activeLinkIDs)) 
                    {
                    	$makeMapYes = TRUE;
                    }
                  }
                }
                // activeTreeOnly FALSE or child is in active tree
                if (!$activeTreeOnly || $makeMapYes)
                {
                  $itm .= MakeMap($modx, $child['id'], $listLevel +1, $description, $titleOfLinks, $maxLevels, true, $pre, $post, $selfAsLink, $ie, $activeLinkIDs, $topdiv, $topdivClass, $topnavClass, $subdiv, $subdivClass, $subnavClass, $hereClass, $useCategoryFolders, $categoryClass, $showDescription, $descriptionField, $textOfLinks, $orderBy, $orderDesc, $activeTreeOnly,$firstClass, $debugMode);
                }
              }
              // END HACK: activeTreeOnly
      		$class = $firstFlg == true ? $firstClass:'';
      		if ($numChildren == 0) {
      			$class = 'last';
      		}
      		$firstFlg = false;
      		
              if ($itm && !$selfAsLink && ($child['id'] == $modx->documentIdentifier)) {
                $output .= "    <li class=\"$hereClass".$class."\">$itm</li>$ie";
              }
              elseif ($itm) {
                // Added by Remon
                // define it here:
                if (is_array($activeLinkIDs)) {
                  if (in_array($child['id'], $activeLinkIDs)) {
                    $class .= ($class ? ' ' : '').$hereClass;
                  }
                }
                // it's an empty folder and using Category Folders
                if ($useCategoryFolders && $itsEmpty) {
                  $class .= ($class ? ' ' : '').$categoryClass;
                }
                if ($class) {
                  $class = ' class="'.$class.'"';
                }
      
                // TO DO: set description to the first non-empty of an array of options
                if ($showDescription && (!empty($child['$descriptionField']))) {
                    $desc = " – ".$child['$descriptionField'];
                } elseif ($showDescription && (!empty($child['description']))) {
                    $desc = ' – ' . $child['description'];
                } elseif ($showDescription && (!empty($child['introtext']))) {
                    $desc = ' – ' . $child['introtext'];
                } elseif ($showDescription && (!empty($child['longtitle']))) {
                    $desc = ' – ' . $child['longtitle'];
                } else {
                    $desc = '';
                }
      
                $output .= "<li$class>$itm$desc</li>$ie";
                $class = '';
              }
            }
            $output .= "</ul>$ie";
            $output .= ($toplevel) ? (($topdiv) ? "</div>$ie" : "") : (($subdiv) ? "</div>$ie" : "");
          }
          return $output;
        }
        $MakeMap_Defined = true;
      }
      
      $currentID = $modx->documentIdentifier;
      $parentID = $currentID;
      
      // find the parent docs of the current "you-are-here" doc
      // used in the logic to mark parents as such also
      while ($parentID != $siteMapRoot && $parentID != 0) {
        $parent = $modx->getParent($parentID, 0);
        if ($parent) {
          $parentID = $parent['id'];
          $activeLinkIDs[] = $parentID;
        } else {
          $parentID = 0;
        }
      }
      
      if ($phMode) {
          // output to a [+placeholder+]
          $modx->setPlaceholder($phName, MakeMap($modx, $siteMapRoot, 0, $showDescription, $titleOfLinks, $maxLevels, false, $pre, $post, $selfAsLink, $ie, $activeLinkIDs, $topdiv, $topdivClass, $topnavClass, $subdiv, $subdivClass, $subnavClass, $hereClass, $useCategoryFolders, $categoryClass, $showDescription, $descriptionField, $textOfLinks, $orderBy, $orderDesc, $activeTreeOnly, $firstClass,$debugMode));
      
      } else {
          // return the output a "usual"
          return MakeMap($modx, $siteMapRoot, 0, $showDescription, $titleOfLinks, $maxLevels, false, $pre, $post, $selfAsLink, $ie, $activeLinkIDs, $topdiv, $topdivClass, $topnavClass, $subdiv, $subdivClass, $subnavClass, $hereClass, $useCategoryFolders, $categoryClass, $showDescription, $descriptionField, $textOfLinks, $orderBy, $orderDesc, $activeTreeOnly, $firstClass,$debugMode);
      
      }
      


      呼び出しに$firstClassでLIの先頭のときのクラス名を指定すれば、先頭のLIにそのクラス名が使われて、中間はクラス名の指定なしになります。
      最後尾には、lastが付けられます。最後尾のクラス名は固定なので、コードを修正する必要があります。
      ただ、DropMenuにはいろいろとあるようなので、ほかのバグがあるんじゃないかと思います。
        • 21773
        • 8 Posts
        takizさん smiley
        ありがとうございます。

        教えて頂いた方法で、なんとか思う形への出力に成功しました。
        やっぱり、Defaultのままでは無理だったんですね...。
        あきらめて別の表示方法で試してみていました。

        PopUpメニューを表示させたくて、今回の様な質問をさせて頂いていました。
        しかし、できたもののブラウザによっては、思う動作をしてくれず、
        (これは、CSSとJavaScriptのせいだと思いますが)
        もう少し改良の余地がありそうです。

        ありがとうございました。
          • 33488
          • 429 Posts
          とりあえず、参考になってよかったです。
          イメージするとなんかカッコよい感じのツリーメニューとかが出てそうな気がするんですけど。
          うまく動いたら公開してくださいまし・・。
          JavascriptやCSS確かにIEとfirefoxでも違いますし、スニペットより大変かも・・・ :’(
            • 21773
            • 8 Posts
            ふふふ grin
            本当は、上記の方法でロールオーバーなドロップメニューを表示させる予定でした。

            が、WinIEの前に崩れました lipsrsealed
            他の機会に使おうと思って、一応温めてはあるのですが、当分つかい(え)そうもなく。
            使用する際には、是非公開させて頂きたく思います。
            わからないことだらけですので、今後とも是非是非、質問にご回答の程、よろしくおねがいしますです。