Как создать пункт подменю в Docpad?

Моя папка с документами имеет структуру, как показано ниже

index.html
post/
  post1.html
  post2.html
pages/
  about.html
  interior.html
  exterior.html
  gallery.html
  post.html //listing blog post
  contact.html
  interior/
    in1.html
    in2.html
    ...
    in5.html
  exterior/
    ex1.html
    ex2.html
    ...
    ex7.html
  gallery/
    img1,2,3,4

Моя структура меню, как это

Главная | О нас | Интерьер | Экстерьер | Галерея | сообщения | Контакты

Я создаю меню, перечисляя коллекцию страниц, все в порядке!

.navigation
nav
  ul.nav.topnav
    li.dropdown.active
      a(href='/')
        | Home
    each doc in getCollection('pages').toJSON()
      - clazz = (document.url === doc.url) ? 'active' : null
      li.dropdown(typeof="sioc:Page", about=doc.url, class=clazz)
        a(href=doc.url, property="dc:title")= doc.title

как я могу добавить элемент подменю для интерьера и экстерьера, перечислив страницы из внутренней/внешней папки

заранее спасибо!


person billyduc    schedule 25.07.2013    source источник


Ответы (4)


Может быть, вы используете docpad-menu..?

person npofopr    schedule 26.07.2013
comment
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. - person Baby Groot; 26.07.2013
comment
привет npofopr, я использую нефритовый шаблон, как преобразовать эко в нефритовый - person billyduc; 29.07.2013
comment
Плагин меню, похоже, делает это за меня. Спасибо нпофопр. И я согласен с точкой зрения @Sim на более точный ответ. Ваше здоровье! - person Mikeumus; 21.10.2013

Это может быть неэффективный способ справиться с этим, но это то, что я до сих пор понял для чего-то подобного (CoffeeKup + Bootstrap):

  li class: "dropdown", ->
    a href: "#", class: "dropdown-toggle", "data-toggle": "dropdown", ->
      text "API"
      b class: "caret"
    ul class: "dropdown-menu", ->
      for file in @getFilesAtPath("api").toJSON()
        li ->
          if @document.relativeOutDirPath == "."
            a href: file.relativeOutPath, file.title
          else
            a href: "../" + file.relativeOutPath, file.title

Обратите внимание на часть @getFilesAtPath("api").toJSON(). У меня есть папка с именем «/api», и она содержит файлы. Используя этот тип структуры, соответствующие теги <li> для каждого файла в этой папке.

Конечно, используя это, вам нужно создать еще одну из этих вещей для каждой создаваемой вами папки (я не смог найти способ перебирать имена каталогов).

Настоящая фигня начинает летать (и может у вас лучше атака на это), это сам тег <li>. Обратите внимание на оператор if, который должен проверить, находимся ли мы на странице index.html или в какой-то подпапке. Затем мне нужно добавить "../" к пути к файлу. Я искал, но еще не нашел простой атрибут стиля @document.pathToRoot.

person Chris    schedule 18.09.2013

Вы можете пометить соответствующие документы в соответствующем YAML, например.

---
submenu: interior
title: in1
---

и используйте это для рендеринга из соответствующей коллекции в вашей навигации или, например, например.

<ul>
<% for entry in @getCollection("html").findAllLive({submenu: interior}).toJSON(): %>    
   <li><%= entry.title %></li>
<% end %>
</ul>

Чтобы использовать соответствующую папку вместо YAML, вы должны изменить запрос с submenu: interior на relativeOutDirPath: /interior/.

person stackasec    schedule 02.10.2013

Вы можете присвоить своим страницам верхнего уровня тег метаданных locationOfChildren, который будет путем к папке, в которой находятся дочерние страницы. Если страница верхнего уровня (например, index.html) не имеет дочерних элементов, просто не определяйте тег и не присваивайте ему значение.

Затем вы можете добавить оператор if, который запустит цикл для списка дочерних документов, если определено locationOfChildren.

.navigation
  nav
    ul.nav.topnav
      li.dropdown.active
        a(href='/')
          | Home
      each doc in getCollection('pages').toJSON()
        - clazz = (document.url === doc.url) ? 'active' : null
        li.dropdown(typeof="sioc:Page", about=doc.url, class=clazz)
          a(href=doc.url)= doc.title
          if doc.locationOfChildren
            ul.dropdown
              each childDoc in getFilesAtPath(doc.locationOfChildren).toJSON()
                - clazz = (document.url === childDoc.url) ? 'active' : null
                li.dropdown(typeof="sioc:Page", about=childDoc.url, class=clazz)
                  a(href=childDoc.url)= childDoc.title

Вероятно, вы не хотите, чтобы ваши страницы сортировались в алфавитном порядке, поэтому вы можете добавить тег navOrder к метаданным каждой страницы и присвоить ему целочисленные значения. В обеих строках запроса (getCollection и getFilesAtPath) добавьте .findAllLive({isPage:true},[{navigationOrder:1}]) перед методом .toJSON(), и все будет готово.

Ex: getFilesAtPath(doc.locationOfChildren).findAllLive({isPage:true},[{navOrder:1}]).toJSON()

person Kevin Dice    schedule 12.04.2014