Всем привет, сделал плагин на билдере с двумя моделями Продукты и Категории, в продуктах связал категории через релэйшен виджет. Теперь на главной старинице (CMS page) надо вывести Название категории, а под ней список продуктов принадлежащие этой категори с линком в детальное описание продуктов. Так вот как это правильно сделать?

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

Не могу вкурить как выдергивать данные модели в CMS page без штатного компонента билдера?

Надеюсь вы поняли, что я тут написал 😂

  • andezer Очень просто

    Цепляешь builderList плагин на модель категории

    Делаешь

    {% for record in records %}
        {% for product in record.products %}
            {{ product.name }}
        {% endfor %}
    {% endfor %}

Можешь сюда написать код, которым ты пытаешься вызвать связь? И код того как ты создал связь)

В модели Product.php

public $belongsToMany = [
        'categories' => [
            'Ezasoft\Products\Models\Category',
            'table' => 'ezasoft_products_relations',
            'order' => 'title'
        ]
    ];

В модели Category.php

public $belongsToMany = [
        'products' => [
            'Ezasoft\Products\Models\Product',
            'table' => 'ezasoft_products_relations',
            'order' => 'title'
        ]
    ];

В странице products.htm

title = "Products"
url = "/:slug"
layout = "default"
is_hidden = 0

[builderDetails]
modelClass = "Ezasoft\Products\Models\Product"
identifierValue = "{{ :slug }}"
modelKeyColumn = "slug"
displayColumn = "title"
notFoundMessage = "Record not found"
==
<h1>ПРОДУКЦИЯ</h1>
{% set record = builderDetails.record %}
{% set displayColumn = builderDetails.displayColumn %}
{% set notFoundMessage = builderDetails.notFoundMessage %}

{% if record %}
    {{ attribute(record, displayColumn) }}
    {{ record.description | raw }}
{% else %}
    {{ notFoundMessage }}
{% endif %}

В странице product_list.htm

title = "product_list"
url = "/"
layout = "default"
is_hidden = 0

[builderList]
modelClass = "Ezasoft\Products\Models\Product"
scope = "-"
scopeValue = "{{ :scope }}"
displayColumn = "title"
noRecordsMessage = "No records found"
detailsPage = "products"
detailsKeyColumn = "slug"
detailsUrlParameter = "slug"
pageNumber = "{{ :page }}"
==
{% set records = builderList.records %}
{% set displayColumn = builderList.displayColumn %}
{% set noRecordsMessage = builderList.noRecordsMessage %}
{% set detailsPage = builderList.detailsPage %}
{% set detailsKeyColumn = builderList.detailsKeyColumn %}
{% set detailsUrlParameter = builderList.detailsUrlParameter %}

{% for category in categories %}
    {{ category.title }}
{% endfor %}

{{ record.category }}
<ul class="record-list">
    {% for record in records %}
        <li>
            {# Use spaceless tag to remove spaces inside the A tag. #}
            {% spaceless %}
                {% if detailsPage %}
                    <a href="{{ detailsPage|page({ (detailsUrlParameter): attribute(record, detailsKeyColumn) }) }}">
                {% endif %}

                {{ attribute(record, displayColumn) }}

                {% if detailsPage %}
                    </a>
                {% endif %}
            {% endspaceless %}
        </li>
    {% else %}
        <li class="no-data">{{ noRecordsMessage }}</li>
    {% endfor %}
</ul>

{% if records.lastPage > 1 %}
    <ul class="pagination">
        {% if records.currentPage > 1 %}
            <li><a href="{{ this.page.baseFileName|page({ (pageParam): (records.currentPage-1) }) }}">&larr; Prev</a></li>
        {% endif %}

        {% for page in 1..records.lastPage %}
            <li class="{{ records.currentPage == page ? 'active' : null }}">
                <a href="{{ this.page.baseFileName|page({ (pageParam): page }) }}">{{ page }}</a>
            </li>
        {% endfor %}

        {% if records.lastPage > records.currentPage %}
            <li><a href="{{ this.page.baseFileName|page({ (pageParam): (records.currentPage+1) }) }}">Next &rarr;</a></li>
        {% endif %}
    </ul>
{% endif %}

Пытаюсь безуспешно выдернуть названия категорий так

{% for category in categories %}
    {{ category.title }}
{% endfor %}
{% for category in categories %}
    {{ category.title }}
{% endfor %}

Почему ты делаешь так?

Ты же не передал переменную categories на страницу.

Ты должен обращаться как

{% for category in record.categories %}
    {{ category.title }}
{% endfor %}

    reazzon Забыл добавить что это применяется только внутри цикла {% for record in records %} Если тебе нужно вынести за цикл, то вызывай еще один компонент к модели категории.

    reazzon Да потому, что я тупой, навалял на скорую руку прям в сообщение форума эту часть кода и пропустил record., но суть в том, что этот кусок кода

    {% for category in record.categories %}
        {{ category.title }}
    {% endfor %}

    работает только в products.php, а в product_list.php нет, почему?

    • reazzon ответили на это сообщение.

      andezer Пост выше. Ты вызываешь его не внутри цикла {% for record in records %}

      • andezer ответили на это сообщение.
      • andezer оценил это.

        reazzon Помог, спасибо!!!

        А как теперь отфильтровать пот такому принцыпу:

        Категория 1

        продукт 1
        продукт 2
        продукт 3

        Категория 2

        продукт 4
        продукт 5
        продукт 6

        Ну тоесть сама категория, а под ней все продукты пренодлежащие этой категории?

          andezer Очень просто

          Цепляешь builderList плагин на модель категории

          Делаешь

          {% for record in records %}
              {% for product in record.products %}
                  {{ product.name }}
              {% endfor %}
          {% endfor %}
          • andezer ответили на это сообщение.
          • andezer оценил это.

            Совеутю тебе написать свой компонент для этого всего. Потому-что ты очень сильно ограничен рамками стандартного компонента билдера

            • andezer ответили на это сообщение.

              Все работает как надо, спасибо

              reazzon Цепляешь builderList плагин на модель категории

              Делаешь

              {% for record in records %}
              {% for product in record.products %}
              {{ product.name }}
              {% endfor %}
              {% endfor %}

              Спасибо за решение, вопрос закрыт

              reazzon Совеутю тебе написать свой компонент для этого всего. Потому-что ты очень сильно ограничен рамками стандартного компонента билдера

              Да тут с билдером не могу справиться, а ты мне про свой плагин 😅

              • reazzon ответили на это сообщение.

                Таки билдер годится только для ознакомления. Через cli гораздо проще и временами быстрее.

                andezer Главное начать. А там даже легче будет. Через Builder много лишних движений когда уже пытаешься выводить информацию на фронт

                reazzon изменил(а) название на "Вывод данных через BuilderList компонент со связями".
                месяц спустя

                andezer
                Категория 1
                продукт 1
                продукт 2
                продукт 3
                Категория 2
                продукт 4
                продукт 5
                продукт 6

                Не могу понять как происходит сортировка, продукты я так понимаю по алфавиту, а вот категории не могу понять по какому принципу сортируются. Подключил через админку sort_order, но путем перетаскивания продуктов и категорий, т.е. меняя их местами, ничего не происходит. Где мне копать, дайте напровление как отсортировать например по ID.

                • reazzon ответили на это сообщение.

                  andezer ты меняешь их местами и они все-равно в списке остаются на своих местах?

                  BuilderList это вообще можно сказать "заглушка" когда делаешь свой плагин.

                  Сделай свой компонент. Это намного проще и тупо быстрее