We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 15034
    • 55 Posts
    Здравствуйте!

    Подскажите, пожалуйста, как организовать при помощи WayFinder такое меню.. чтобы выводились только дочерние документы.. И возможно ли вообще..

    Дерево такое:

    *Столовая (корень)
    - Завтрак
    - Кашка
    - Яблочко

    - Обед
    -Борщ
    -Курятина
    -Водка

    - Ужин
    - Чаёк
    - Хлебушек



    А меню у нас на сайте должно быть два.

    Первое меню должно быть таким:


    Завтрак | Обед | Ужин


    А второе меню вот таким:


    Кашка | Яблочко | Борщ | Курятина | Водка | Чаёк | Хлебушек


    C первым меню все понятно, а вот со вторым ... Думала сначала, может скрыть завтрак с обедом и ужином, а в Wayfinder для 1 меню указать, чтобы показывал hidden.. а во втором, соответственно, вызвать wayfinder по всему корню, исключая скрытые ... но этот способ себя не оправдал (поскольку дочерние документы не отображаемых в меню документов тоже не отображаются).

    Еще попробовала для второго меню использовать параметр Exclude, в нем указала id завтрака, обеда и ужина - но тоже не подошло.

    я в печали... подскажите, буду благодарна kiss
      Мужчина должен говорить только три слова: люблю, куплю, поедем!
      • 13400
      • 44 Posts
      а если примерно так (нужно подставить свои значения в id)

      <?php
      $results = $modx->getDocumentChildren(
        $id = 2, 
        $active = 1, 
        $deleted = 0, 
        'id, pagetitle, published, menuindex, deleted, hidemenu, menutitle', 
        $where = 'hidemenu = 0', 
        $sort='menuindex', 
        $dir='ASC', 
        $limit = '' 
      );
      
      $menu1 = "<div id=\"menu1\">";
      $menu2 = "<div id=\"menu2\">";
      $output = "";
      
      foreach($results as $key => $value) {
      
      	if (empty($modx->getChildIds($value["id"]) {
      		$menu2 .= $value["menutitle"]."|";
      	} else {
      		$menu1 .= $value["menutitle"]."|";
      	}
      }
      
      $menu1 = "</div>";
      $menu2 = "</div>";
      
      $output = "<div id=\"menu\">\n";
      $output .= $menu1;
      $output .= $menu2;
      $output .= "</div>\n";
      }
      return $output;
      ?>
        • 15034
        • 55 Posts
        Спасибо за помощь... значит, если только свой сниппет писать, это решить можно?
        почему же меня не покидает ощущение что WF это может..

        По сути, нужен параметр. Который будет только у кашек и прочих борщей. И чтобы выборка шла по этому параметру.

        о, а если так: пусть у Завтрака, Обеда и Ужина будет шаблон "Время"
        а у всяких там кашек и борщей пусть будет шаблон "Еда". Тогда мы сможем сделать выборку из столовой только тех док-тов, у которых шаблон "Еда"... осталось найти, где в бд указано какой шаблон у какого дока.

        Да по любому в WF это есть... но проще написать самой. smiley
          Мужчина должен говорить только три слова: люблю, куплю, поедем!
          • 29487
          • 385 Posts
          Если меню первого уровня папки, а второго - не папки, то можно использовать шаблон parentRowTpl, содержащий только [+wf.wrapper+]
          Можно просто дописать параметр &parentRowTpl=`@CODE:[+wf.wrapper+]` если не используется плагин phx.

          А если здесь все пункты папки, можно использовать шаблон categoryFoldersTpl, прописав для Завтрак/Обед/Ужин в свойствах ссылки rel="category" или установив им пустой шаблон
            • 15034
            • 55 Posts
            написала сниппет из разряда 2 пальца об асфальт

            <?php
            $sql = 'SELECT * FROM `modx_site_content` WHERE `template` =5';
            $res=mysql_query($sql);
             while ($row=mysql_fetch_array($res)) {
                
            	echo '<li>'	;			      
                                          echo "".$row['pagetitle']."";  
            echo '</li>';
            }
            ?>


            Клево, выводятся названия Кашка, Борщик, и все как надо. Почти.

            Есть только небольшой нюанс... осталось написать, чтобы были ссылки... я не знаю как...
            еще пару сеансов стенотерапии, глядишь что-то и получится...

            P.S. а ведь наверняка это решаемо за пять сек.. а я тут [цензура] полночи


            Upd. хочется спать... ссылки написала... только работают они исключительно, если нету алиаса у родительского дока..
            пыталась прикрутить трехэтажную проверку наличия алиаса в паренте, что-то ни о чем.. надо спать короче
              Мужчина должен говорить только три слова: люблю, куплю, поедем!
              • 15034
              • 55 Posts
              Уважаемый Jager!
              Стала подпиливать Ваш код и кое-что не понимаю, а именно :


              Quote from: Jager at Jul 31, 2010, 02:14 PM

              а если примерно так (нужно подставить свои значения в id)

              <?php
              $results = $modx->getDocumentChildren(
              $id = 2, //// id какого документа должно тут быть ? я так предполагаю, что id корня (в примере это док. "Столовая")?
              $active = 1,
              $deleted = 0,
              ’id, pagetitle, published, menuindex, deleted, hidemenu, menutitle’, //// это параметры которые трогать
              $where = ’hidemenu = 0’,
              $sort=’menuindex’, //// не буду
              $dir=’ASC’,
              $limit = ’’ //// вроде все так
              );

              $menu1 = "<div id=\"menu1\">"; //// это тоже понятно
              $menu2 = "<div id=\"menu2\">";
              $output = "";

              foreach($results as $key => $value) {

              if (empty($modx->getChildIds($value["id"]) {
              $menu2 .= $value["menutitle"]."|"; //// что мы делаем в этом условии?
              } else {
              $menu1 .= $value["menutitle"]."|";
              }
              }

              $menu1 = "</div>";
              $menu2 = "</div>";
              $output = "<div id=\"menu\">\n"; ///// вывод
              $output .= $menu1;
              $output .= $menu2;
              $output .= "</div>\n";
              }
              return $output;
              ?>



              И еще. Дочерние доки... такие, как "курятина", "борщ" тоже являются папками.. но их содержимое пока никого не волнует, просто сам факт как-то нужно учитывать или нет?
                Мужчина должен говорить только три слова: люблю, куплю, поедем!
                • 785
                • 2,113 Posts
                Все можно проще, используя стандартные сниппеты. Например, если разделы находятся в корне сайта, то подойдет такой вариант (небольшой дополнительный сниппет):

                <?php
                $startId = $modx->runSnippet('UltimateParent');
                $output = $modx->runSnippet('Wayfinder', array('startId'=>$startId, 'level'=>'1'));
                return $output;
                ?>


                Если разделы не в корне, надо задать при вызове UltimateParent параметр topLevel.

                Кстати, специально оба сниппета UltimateParent и Wayfinder вызываются в дополнительном сниппете, чтобы можно было сделать этот дополнительный сниппет кэшируемым.
                  Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
                  Статьи о MODx, регулярно новые публикации
                  • 15034
                  • 55 Posts
                  AKots, все так просто и красиво...
                  но работает как-то не так, как надо... сообщений об ошибках нет, просто не показывает ничего...
                  и почему мы вызываем сначала UP, а потом WF...

                  безумно туплю... жара видимо влияет

                  где нибудь есть нормальная документация, для даунов ...
                  по всем этим замечательным встроенным сниппетам..
                    Мужчина должен говорить только три слова: люблю, куплю, поедем!
                    • 785
                    • 2,113 Posts
                    Не знаю, что тут может не работать – может быть неверно вызывается этот дополнительный сниппет? Если добавить
                    echo $startId;
                    выводится правильный id?
                    Еще одна тонкость – всегда полезно смотреть html-код страницы, так как может быть все вывелось, но из-за каких-то ошибок не отобразилось в браузере.
                    Документация есть по каждому отдельному сниппету, нужно ее искать. При этом, скорее всего, качественная документация будет только на английском языке.
                      Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
                      Статьи о MODx, регулярно новые публикации
                      • 15034
                      • 55 Posts
                      Quote from: AKots at Aug 01, 2010, 05:20 AM

                      Если добавить
                      echo $startId;
                      выводится правильный id?

                      выводится цифра 1. и все.

                      html-код страницы, так как может быть все вывелось

                      в исходном коде тоже самое. просто симпатичная единичка.

                      Не знаю, что тут может не работать – может быть неверно вызывается этот дополнительный сниппет?

                      Т.к. мозг закипает от жары... в общем, нарисовала даже как должно быть wink.



                      как видно из схемы, тут 2 див-а, див menu в соотв. чанке формируется (вполне успешно!) так
                      <div id="menu">
                      [[Wayfinder? &startId=`17` &level=`1` &ignoreHidden=`true`]]
                      </div>


                      в другом чанке у нас сайдбар. сайдбар формируется так
                       
                      <div id="sidebar">
                      <ul>
                      [!LeftMenu!]
                      </ul>
                      </div>


                      Всем вышеприведенным я постаралась показать, как этот доп.сниппет (под кодовым названием LeftMenu) вызывается . Может, его надо как-то по другому вызывать?


                      И еще, как это сделать, подскажите, пожалуйста

                      Если разделы не в корне, надо задать при вызове UltimateParent параметр topLevel.

                      потому что разделы и правда не в корне, может из-за этого ничего не показывает. .. я попробовала topLevel дописать но видимо неправильно, поскольку ничего не изменилось.

                        Мужчина должен говорить только три слова: люблю, куплю, поедем!