Как пройти коллекцию, отфильтрованную Ajax в октябре CMS - PullRequest
0 голосов
/ 06 мая 2018

В CMS за октябрь у меня есть страница, которая использует мой компонент:

title = "products"
url = "/filter-products/:category_slug?"
layout = "default"
is_hidden = 00

[filterproducts]

==

{{ form_ajax('onFilterProducts', { update: {'product/products-listing': '#partialProducts'} }) }}
    {% partial 'products-filters' %}
{{ form_close() }}


<table id="partialProducts">
    {% partial 'product/products-listing' products = filterproducts.products %}
</table>

Мой компонент выглядит так:

class FilterProducts extends ComponentBase
{
    /** @var Collection */
    public $products;


    /**
     * @return array
     */
    public function componentDetails(): array
    {
        return [
            'name' => 'Filter Products',
            'description' => 'Filter Products',
        ];
    }

    public function onRun()
    {
        $this->products = $this->prepareProductsCollection();
    }


    public function onFilterProducts()
    {
        $this->products = $this->prepareProductsCollection();
    }

    public function prepareProductsCollection()
    {
        $options = post('filter', []);

        return $this->filterProducts($options);
    }

    /**
     * @param array $options
     *
     * @return \Illuminate\Database\Eloquent\Builder[]|Collection|\October\Rain\Database\Builder[]
     */
    protected function filterProducts(array $options = [])
    {
        /** @var \October\Rain\Database\Builder $query */
        $query = Product::query()->isActive();

        if (!empty($options)) {
            // do some filtering …
        }

        return $query->get();
    }
}

И partial/product/products-listing.htm выглядит так:

{% if products|length %}
    {% for record in product %}
        {% partial "product/product-row" record = record %}
    {% endfor %}
{% else %}
    {{ 'There are no Products that match the criteria'|_ }}
{% endif %}

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

Но когда я всегда могу увидеть Нет ни одного товара, соответствующего критерию .

Когда я сбрасываю $options, каждое поле формы отображается правильно.

Более того, когда я сбрасываю $this->products в методе onFilterProducts(), я получаю правильно отфильтрованную коллекцию, но эта коллекция не передается в частичную, которую следует обновить.

Итак, вопрос: как я могу передать продукты из запроса Ajax для обновления частичного.

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Поскольку вы пытаетесь передать продуктов с $this->products, то вы получите результат в продуктов , и вы попробовали это

{% partial 'product/products-listing' products = filterproducts.products %}

Таким образом, сначала он найдет переменную filterproducts, а затем найдет products в filterproducts.

Таким образом, вы должны пройти products вместо filterproducts.Вы должны заменить эту строку на

{% partial 'product/products-listing' products = products %}

И я обнаружил еще одну ошибку в partial/product/products-listing.htm.Вы пытаетесь получить record из product.Но вы еще не определили product.

Таким образом, вы должны сделать это изменение "изменить продукты вместо product " в partial/product/products-listing.htm

{% if products|length %}
    {% for record in products %}
        {% partial "product/product-row" record = record %}
    {% endfor %}
{% else %}
    {{ 'There are no Products that match the criteria'|_ }}
{% endif %}

Я думаю, что это будетпомочь вам, и если у вас есть какие-либо сомнения, пожалуйста, прокомментируйте.

0 голосов
/ 06 мая 2018

Пожалуйста, внесите изменения в ваш компонент

public function onRun()
{
    $this->products = $this->page['products'] = $this->prepareProductsCollection();
}


public function onFilterProducts()
{
    $this->products = $this->page['products'] = $this->prepareProductsCollection();
}

и измените код своей страницы следующим образом

<table id="partialProducts">
    {% partial 'product/products-listing' %}
</table>

, а также в вашем списке товаров / продуктов. пожалуйста исправьте ваш код

{% if products|length %}
    {% for record in products %}
    {% partial "product/product-row" record = record %}
    {% endfor %}
{% else %}
    {{ 'There are no Products that match the criteria'|_ }}
{% endif %}
...