На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > скрипт для многоуровнего меню , вставка тегов рекурсией
      здравствуйте, скачал скрипт для многоуровневого меню
      вот вывод самого меню используются листы
      ExpandedWrap disabled
        <div id="nav">
            <ul>
                <li><a href="#"><b>Web Design</b></a>
                    <ul class="submenu">
                        <li><a href="http://woork.blogspot.com">Woork</a></li>
                        <li><a href="http://www.dzone.com">DZone</a></li>
                    </ul>
                </li>
                <li><a href="#"><b>Tech News</b></a>
                    <ul class="submenu">
                        <li><a href="http://www.mashable.com">Mashable</a></li>
                        <li><a href="http://www.cnet.com">CNET</a></li>
                    </ul>
                </li>
            <ul>
        <div>

      подскажите, а как эти самые ul и li вставлять рукерсией, так как количество подменю я не знаю, берутся из БД
        прекрасный вопрос, я считаю
        я бы, например, использовал циклы. да что "например", а даже именно так и делаю
        а вот как "рекурсией" даже не придумать сходу
          Цитата zera @
          я бы, например, использовал циклы

          можете подсказать как, у меня и так не идет
            подскажу, надо использовать какие-либо серверные языки
            кроме того скриптом рекомендую называть скрипты :)
            html это не скрипты
              Gwt, при чем тут раздел JavaScript Frameworks? Что используется на твоем сервере?
                Цитата gruy @
                Gwt, при чем тут раздел JavaScript Frameworks? Что используется на твоем сервере?

                Да может ошибся, может просто в javascript надобыло!!
                или я вообще путаю, что это решается javascript-ом

                Добавлено
                Цитата zera @
                подскажу, надо использовать какие-либо серверные языки
                кроме того скриптом рекомендую называть скрипты :)
                html это не скрипты

                я пишу на RoR!впринципе данные из БД получаю, а вот сделать меню с ними уже нет
                  Цитата Gwt @
                  данные из БД получаю, а вот сделать меню с ними уже нет

                  Как уже было сказано, пройдись циклом по полученным данным и построй html код для меню.
                    Цитата gruy @
                    Как уже было сказано, пройдись циклом по полученным данным и построй html код для меню.

                    так вот и не получается это
                      Показывай как делаешь. Или даже не пытался?
                        А как они в базе хранятся?
                          Цитата Мохнатый @
                          А как они в базе хранятся?

                          да там довольно все просто.
                          id, name, parent_id и все
                            Может попробовать nested_set?
                            Сообщение отредактировано: Мохнатый -
                              вот написал все-же вариант, но он очень очень кривой, но хоть что то!
                              ExpandedWrap disabled
                                <div id="myslidemenu" class="jqueryslidemenu">
                                    <%def recurs(id)%>
                                      <%@cat =Category.find_all_by_parent_id(id) %>
                                      <%if @cat.size!=nil%>
                                        <ul>
                                          <%@cat.each do |cat|%>
                                            <li><%=link_to cat.name%>
                                              <%@cat = Category.find_all_by_parent_id(cat.id)%>
                                              <%recurs(cat.id)%>
                                            <%end%>
                                          <%end%>
                                        </li>
                                      </ul>
                                    <%end%>
                                 
                                    <%get_category_parent.each do |parent|%>
                                      <ul>
                                        <li> <%=link_to parent.name%>
                                          <%recurs(parent.id)%>
                                        </li>  
                                      </ul>
                                    <%end%>
                                    <br style="clear: left" />
                                  </div>
                                Так у тебя рекурсии конечно нет никакой здесь. (аа, поправил уже =))
                                Я все-таки уверен, что проблема решается построением дерева при помощи nested_set.

                                Если не брать nested_set, то:
                                Суть в чем - есть парент, для каждого парента есть чайлд, этот чайлд в свою очередь может быть парентом.
                                Парент - это <ul>, чайлд - <li>.
                                Условие выхода из рекурсии - отсутствие чайлдов.
                                Получается что-то типа:

                                Метод должен быть реализован в модели:
                                До выполнения метода нужно найти самого верхнего парента.

                                ExpandedWrap disabled
                                  @@html = ""
                                   
                                  def build_menu parent_id
                                    parent = Menu.find parent_id
                                    @@html += "<ul>#{parent.name}"
                                    unless (childs = parent.childs?).nil?
                                      childs.each do |child|
                                        @@html += "<li>#{build_menu child.id}</li>"
                                      end
                                    else
                                    @@html += "</ul>"
                                    return @@html    
                                  end


                                Не уверен, что нет ошибок. Сейчас у себя реализую подобное.
                                Сообщение отредактировано: Мохнатый -
                                  нет не работает этот код, пытаюсь его заставить работать)))
                                    Знаю, писал сразу сюда на форум.
                                    У меня аналогичная задача тоже присутствует, только она за 5 минут не встраивается =).
                                      Цитата Мохнатый @
                                      У меня аналогичная задача тоже присутствует, только она за 5 минут не встраивается =).

                                      ок, если решение найдешь, даш знать!!!я пока отойду от этой задачи, другое покодю))))
                                        Вот я и добрался до этого места:

                                        ExpandedWrap disabled
                                          class MenuBuilder
                                            @@html = ""
                                           
                                            def initialize ids
                                              @ids = ids
                                            end
                                           
                                            def get_menu
                                              build_menu roots
                                            end
                                           
                                            private
                                            def build_menu parents
                                              @@html += "<ul>"
                                              parents.each do |menu|
                                                @@html += "<li><a href='/#{menu.link}' title='#{menu.title}'><span>#{menu.title}</span></a>"
                                                build_menu menu.children if menu.children.any?
                                                @@html += "</li>"
                                              end
                                              @@html += "</ul>"
                                            end
                                           
                                            def roots
                                              Menu.roots
                                            end
                                          end

                                        Такой код у меня работает и вполне себе рекурсивно строит меню. Я использую nested_set, который дает мне методы roots и children, чтобы я не парился над лишними проверками.
                                          Мохнатыйммм странно у меня не работает
                                          установил nested_set
                                          в модель Category добавил acts_as_nested_set
                                          в помошники Category добавил твои функции

                                          при обращении вылетает ошибка

                                          Attempt to call private method
                                            Выложи код как ты этот класс используешь.
                                            У меня это модель на самом деле, я просто опустил дополнительный код. Само построение меню завязано на ActiveRecord коллбэк. Если ты это хочешь использовать а хелпере, то методы нужно немного изменить.
                                            Сообщение отредактировано: Мохнатый -
                                              Мохнатый все огромное спасибо, все работает! у меня был просто косяк там!
                                              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                              0 пользователей:


                                              Рейтинг@Mail.ru
                                              [ Script execution time: 0,0736 ]   [ 14 queries used ]   [ Generated: 16.07.25, 09:09 GMT ]