Фільтрація об'єкта Magento 2


24

Чи можете ви використовувати Magento 2 у сховищах продуктів для фільтрування за атрибутами продукту?

У Magento 2 ви можете використовувати об'єкт критеріїв пошуку

\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria,

і сховище

\Magento\Catalog\Api\ProductRepositoryInterface $productRepository,

Для отримання списку об’єктів

$searchCriteria->getPageSize(10);
$list = $productRepository->getList($searchCriteria);

Однак об’єкт searchCriteria не має (здається?) Можливості прямої фільтрації. Клас критерії пошуку дійсно є методи для додавання що - то називають filterGroups

#File: lib/internal/Magento/Framework/Api/SearchCriteria.php        

public function getFilterGroups()
{
    $filterGroups = $this->_get(self::FILTER_GROUPS);
    return is_array($filterGroups) ? $filterGroups : [];
}

public function setFilterGroups(array $filterGroups = null)
{
    return $this->setData(self::FILTER_GROUPS, $filterGroups);
}    

Але незрозуміло, що саме, група фільтрів завдяки нетиповим масивам PHP.

Як я можу використовувати сховище Magento 2, щоб робити такі речі

  • Покажіть мені всі товари з [цієї специфічної товарної позиції]
  • Показати всі продукти, створені після [цієї дати]
  • тощо.

2
Здається, що зазначені групи - це масив Magento \ Framework \ Api \ Search \ FilterGroup, який, у свою чергу, має \ Magento \ Framework \ Api \ Filter фільтри, фільтри можна будувати за допомогою \ Magento \ Framework \ Api \ FilterBuilder, форми 'eq', 'neq', 'gt' тощо. Але не вдалося знайти список підтримуваних типів умов: \
Петро Джамбазов

2
Насправді щось подібне до списку можна знайти на Magento / Framework / Api / CriteriaInterface.php: 79
Petar Dzhambazov

Відповіді:


30

Перевірте наступний зразок класу. Для фільтра за SKU спробуйте:

$productFilterDemo->getProducts('sku', 'product_sku_value', 'eq');

Щоб отримати продукти, створені після конкретної дати, виконайте це:

$productFilterDemo->getProducts('created_at', 'creation date', 'gt');

Зразок класу:

<?php
namespace Vendor\ModlueName\Model;

use Magento\Framework\Api\SearchCriteriaBuilder;
use Magento\Catalog\Api\ProductRepositoryInterface;

class ProductFilterDemo
{
    /** @var ProductRepositoryInterface */
    protected $productRepository;

    /** @var SearchCriteriaBuilder */
    protected $searchCriteriaBuilder;

    /**
     * Initialize dependencies.
     *
     * @param ProductRepositoryInterface $productRepository
     * @param SearchCriteriaBuilder $searchCriteriaBuilder
     */
    public function __construct(
        ProductRepositoryInterface $productRepository,
        SearchCriteriaBuilder $searchCriteriaBuilder
    ) {
        $this->productRepository = $productRepository;
        $this->searchCriteriaBuilder = $searchCriteriaBuilder;
    }

    /**
     * Get products with filter.
     * 
     * @param string $fieldName
     * @param string $fieldValue
     * @param string $filterType
     * @return \Magento\Catalog\Api\Data\ProductInterface[]
     */
    public function getProducts($fieldName, $fieldValue, $filterType)
    {
        $searchCriteria = $this->searchCriteriaBuilder->addFilter($fieldName, $fieldValue, $filterType)->create();
        $products = $this->productRepository->getList($searchCriteria);
        return $products->getItems();
    }
}

4
Дякую, саме те, що я пішов після! Схоже, додавання декількох фільтрів створює умови "АБО" - чи є спосіб створити умови "І"?
Алан Шторм

3
- якщо у вас є момент. Чи правильно я використовую групу фільтрів? Вони, здається, застосовують як АБО, а не AND magento.stackexchange.com/questions/91023/…
Alan Storm

4
Фільтри поєднуються з "АБО" всередині однієї групи фільтрів, і кожна група поєднується з "І" на рівні критеріїв пошуку. Погляньте на: \ Magento \ Framework \ Api \ SearchCriteriaBuilder :: setFilterGroups ($ groups []) та \ Magento \ Framework \ Api \ Search \ FilterGroupBuilder :: setFilters ($ фільтри [])
Алекс Паляруш

Я використовую Magento 2.3, конструктор критеріїв пошуку не фільтрує елемент, якщо елемент "out_of_stock"?
Восьминіг

14
public function __construct(
    ProductRepositoryInterface $productRepository,
    SearchCriteriaBuilder $searchCriteriaBuilder,
    FilterBuilder $filterBuilder,
) {
    $this->productRepository = $productRepository;
    $this->searchCriteriaBuilder = $searchCriteriaBuilder;
    $this->filterBuilder = $filterBuilder;
}

public function getProducts()
{
    $filters[] = $this->filterBuilder
        ->setField('sku')
        ->setConditionType('eq')
        ->setValue('something')
        ->create();
    $this->searchCriteriaBuilder->addFilters($filters);

    $searchCriteria = $this->searchCriteriaBuilder->create();
    $searchResults = $this->productRepository->getList($searchCriteria);
    return $searchResults->getItems();
}

1
Схоже, у вашому прикладі \Magento\Framework\Api\Search\SearchCriteriaBuilderвикористовується (специфічний для пошуку), а я\Magento\Framework\Api\SearchCriteriaBuilder (загальний для всіх служб), дивіться мою відповідь. Також він забезпечує більш простий спосіб додавання фільтра, addFilter()підписи різні.
Олексій Паляруш

Домовились, це дещо інше рішення.
LDusan

може addfilter використовувати лише 1 парам?
Антоніо Педікіні

@LDusan, Скажіть, будь ласка, як я можу використовувати "$ searchCriteriaBuilder" в objectmanager?
Сарфарай Сіпай

2
Я думаю, що ви повинні додати його в конструкторі свого класу, чому б ви хотіли використовувати для цього об’єкт-менеджер?
LDusan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.