Twig JS (gulp-twig) - Обход больших структур данных с учетом принципов DRY - PullRequest
0 голосов
/ 09 мая 2018

TL; DR

Есть ли способ программно переназначить, откуда частичка Twig считывает свои данные? У меня есть BLOB-объект JSON, который предоставляет структуру данных для элементов в библиотеке шаблонов, и мне нужно убедиться, что Twig предоставляет правильные данные в соответствующие .twig частичные файлы.

Фон

У меня есть следующие данные JSON:

button.json (упрощенно)

{
    "element": {
        "button": {
            "attr": {
                "class": "btn"
            },
            "subelement": {
                "span": {
                    "attr": {
                        "class": "btn__text"
                    },
                    "content": {
                        "text": "Button Text"
                    }
                }  
            }
        }
    }
}

И следующие шаблоны Twig:

button.twig (упрощенно)

{% set base = 'button' %}
{% set el = element[base] %}

<button type="button"
{% include '_partial/_attr.class.twig' %}
>

    {% set el = element[base].subelement.span %}

    {% include 'span.twig' with { el: el } %}
    </span> {# <span> closes here as it could have subsequent elements inside it #}

</button>

span.twig (упрощенно)

<span
{% include '_partial/_attr.class.twig' %}
>

{% if el.content.text %}
    {{ el.content.text }}
{% endif %}

И веточка частичная:

_attr.class.twig

{% if el.attr.class %}
    class="{{ el.attr.class }}"
{% endif %}

Приведенный выше выводит следующий HTML-код:

<button type="button" class="btn">
    <span class="btn__text">Button Text</span>
</button>

Все эти файлы вносят свой вклад в библиотеку шаблонов, где я собираюсь перейти на СУХОЙ (отсюда и частичный файл (один из многих)). Я хотел бы сделать все как можно больше для повторного использования, чтобы <button> или <span> могли быть объявлены один раз, но использоваться в разных контекстах.

Проблема

В button.twig я жестко кодирую {% set el = element[base].subelement.span %}, чтобы изменить значение el (чтобы <span> получил правильные данные). Этот синтаксис работает только до тех пор, пока существует только уровень subelement.

Рассмотрим эту структуру:

<form>
    <div class="form-element>
        <label>Label Example</label>
        <input type="text">
    </span>
</form>

Я озадачен тем, как получить доступ к данным для <label> и <input>, поскольку все перестановки, которые я пробовал (например, element[base].subelement.div.subelement.label и element[base.subelement.div].subelement.label), не работают.

Я пытаюсь добиться надежного способа обхода объекта данных, чтобы у меня были структуры разметки x элементов глубиной.

До сих пор мои мысли были:

  • Создание ссылки на ключ объекта с помощью функции JS (возникли проблемы с возвращением возвращенной строки в ссылку на объект Twig)
  • Создание своего рода «трекера», который отслеживает, насколько глубоко я в структуре данных (опять же, я думаю, функция JS, которая может сказать Twig, насколько глубоко элемент x находится в структуре данных)
  • Переформатирование структуры данных, чтобы иерархия была выражена иначе)
  • Правильно ли я даже переназначил el, чтобы он всегда представлял текущий элемент?
  • Я также пытался использовать attribute(base, xxx) безрезультатно

1 Ответ

0 голосов
/ 09 июля 2018

Оказывается, я сильно задумался над этим, поскольку в Twig уже встроена отличная функция "переключения контента", использующая оператор with.

Вот как все теперь работает ...

Во-первых, я превратил все subelement объекты в массивы, поэтому мой файл button.json будет выглядеть так:

button.twig (упрощенно)

{
    "element": {
        "button": {
            "attr": {
                "class": "btn"
            },
            "subelement": [
                {
                    "span": {
                        "attr": {
                            "class": "btn__text"
                        },
                        "content": {
                            "text": "Button Text"
                        }
                }
            ]
        }
    }
}

Тогда я мог бы сделать то, что я назвал «переключением контекста» в моих шаблонах веток, используя что-то вроде:

button.twig (упрощенно)

{% set root = root.subcomponent[0] %}

{# _button_text_ #}
    {# <span> #}
        {% include '../_partial/_text.span.twig' with { root: root._button_text_ } %}
    </span>
{# /_button_text_ #}

Ключом является использование with { foo: bar } с включением, поскольку оно «сдвигается», когда в JSON компонент считывает свои данные. Кроме того, я знаю, что span всегда будет subcomponent[0], так что это абсолютно безопасно для использования. При необходимости оператор всегда может быть заключен в такое условие, как:

{% if root.subcomponent[0] == '_button_text_' %}
    {% set root = root.subcomponent[0] %}
{% endif %}

или для нескольких (повторяющихся) подэлементов:

{% for subcomponent in root.subcomponent %}
    {# _description_list_item_ #}
        {# <div> #}
            {% include '../../../atom/structure/_partial/_structure.division.twig' with { root: subcomponent._description_list_item_ } %}

            {% set root = subcomponent._description_list_item_ %}

            {# _description_term_ #}
                {% include '../../../atom/text/_partial/_text.description-term.twig' with { root: root.subcomponent[0]._description_term_ } %}
            {# /_description_term_ #}

            {# _description_details_ #}
                {% include '../../../atom/text/_partial/_text.description-details.twig' with { root: root.subcomponent[1]._description_details_ } %}
            {# /_description_details_ #}

        </div>
    {# /_description_list_item_ #}

{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...