Идиоматический c способ в Jekyll наследовать данные по умолчанию, если данные проекта c недоступны - PullRequest
0 голосов
/ 04 апреля 2020

Я совершенно новичок в Джекилле. Я сделал что-то вроде этого:

  {% assign top_nav = site.data.menus %}
  {% if site.data.orgs[site.orgData].menus %}
    {% assign top_nav = site.data.orgs[site.orgData].menus %}
  {% endif %}
  <ul>
    {% for menu in top_nav %}
    <li>
      <a href="{{ menu.url }}">{{ menu.title }}</a>
    </li>
    {% endfor %}
  </ul>

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

Что мне не нравится в этом подходе, так это то, что у меня сейчас есть сотни места в моих шаблонах jekyll, которые делают это, если оператор проверки. Если бы это был какой-либо другой язык программирования сценариев, я бы определил такую ​​функцию, как function($org_name,$prop) {return $site.data.orgs[$org_name][$prop] ? $site.data.orgs[$org_name][$prop] : $site.data[$prop]; }. Каким был бы идиоматический способ достижения той же цели в Джекиле?


Я попробовал вариант предложения Дэвида Жакеля, выполнив это

. / Org_var. html

{% assign prop = include.prop %}

{% assign orgVar = site.data[prop] %}
{% if site.data.orgs[site.orgData][prop] %}
  {% assign orgVar = site.data.orgs[site.orgData][prop] %}
{% endif %}

. / _ include / nav. html

{% include_relative ../org_var.html prop=menus %}
{% for menu in orgVar %}
... print menu items

. / _ layout / header. html

{% include_relative ../org_var prop='electronics.televisions' %}
{% for tv in orgVar%}
{{ tv.modelName }}
... print tv values
{% endfor %}

Но я получаю синтаксическая ошибка в ../org_var.html, говоря {% include_relative file.ext param='value' param2='value' %}. В документации сказано, что я не могу использовать относительный путь с include или include_relative. Как сделать мою org_var.html универсальной и многократно используемой функцией? И будет ли electronics.televisions даже правильно оценивать правильный путь моей site.data.org.[site.orgData][...path] переменной?

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

Только что понял, что есть переменная default: для такой переменной, как smarty templates .

{% assign top_nav = site.data.orgs[site.orgData].menus | default: site.data.menus %}
0 голосов
/ 04 апреля 2020

Вы можете использовать Jekyll включает .

Из любого места, куда вы хотите использовать, вы включаете:

{% include nav.html org_name=org_name prop=prop %}

Позвонит _include / nav. html это может быть что-то вроде этого:

{% assign org_name = include.org_name %}
{% assign prop = include.prop %}

{% if site.data.orgs[org_name][prop] %}
  {% assign top_nav = site.data.orgs[site.orgData].menus %}
{% else %}
  {% assign top_nav = site.data.orgs[site.orgData].menus %}
{% endif %}
<ul>
  {% for menu in top_nav %}
  ...
...