Filtrage d'un référentiel d'objets Magento 2


24

Dans Magento 2, pouvez-vous utiliser un référentiel de produits pour filtrer par attributs de produit?

Dans Magento 2, vous pouvez utiliser un objet de critères de recherche

\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria,

et un référentiel

\Magento\Catalog\Api\ProductRepositoryInterface $productRepository,

Pour récupérer une liste d'objets

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

Cependant, l'objet searchCriteria n'a pas (semble-t-il?) Des capacités de filtrage direct. La classe de critères de recherche n'ont des méthodes pour ajouter quelque chose appelé 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);
}    

Mais on ne sait pas exactement ce qu'est un groupe de filtres grâce aux tableaux non typés de PHP.

Comment puis-je utiliser un référentiel Magento 2 pour faire des choses comme

  • Montrez-moi tous les produits avec [cette référence spécifique]
  • Montrez-moi tous les produits créés après [cette date]
  • etc.

2
Il semble que ces groupes soient un tableau de Magento \ Framework \ Api \ Search \ FilterGroup, qui à son tour a des filtres \ Magento \ Framework \ Api \ Filter, des filtres peuvent être créés avec \ Magento \ Framework \ Api \ FilterBuilder et condition_type est dans la forme de 'eq', 'NEQ', 'gt' , etc. Mais n'a pas pu trouver la liste des types de condition pris en charge: \
— Petar Dzhambazov

2
En fait, quelque chose comme une liste peut être trouvée sur Magento / Framework / Api / CriteriaInterface.php: 79
— Petar Dzhambazov

Réponses:


30

Consultez l'exemple de classe suivant. Pour filtrer par SKU, essayez ceci:

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

Pour obtenir des produits créés après une date spécifique, ceci:

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

Exemple de classe:

<?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
Merci, juste ce que je cherchais! Il semble que l'ajout de plusieurs filtres crée des conditions "OU" - existe-t-il un moyen de créer des conditions "ET"?
— Alan Storm

3
- si vous avez un moment. Suis-je en train d'utiliser correctement le groupe de filtres? Ils semblent postuler en tant que OU, pas en tant que ET magento.stackexchange.com/questions/91023/…
— Alan Storm

4
Les filtres sont combinés avec "OU" à l'intérieur d'un groupe de filtres, et chaque groupe est combiné avec "ET" au niveau des critères de recherche. Jetez un œil à: \ Magento \ Framework \ Api \ SearchCriteriaBuilder :: setFilterGroups ($ groups []) et \ Magento \ Framework \ Api \ Search \ FilterGroupBuilder :: setFilters ($ filters [])
— Alex Paliarush

J'utilise Magento 2.3, le générateur de critères de recherche ne filtre pas l'article si un article est "out_of_stock"?
— Octopus

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
On dirait que dans votre exemple \Magento\Framework\Api\Search\SearchCriteriaBuilderest utilisé (spécifique à la recherche), tandis que j'ai utilisé \Magento\Framework\Api\SearchCriteriaBuilder(générique pour tous les services), voir ma réponse. Il fournit également un moyen plus simple d'ajouter un filtre, les addFilter()signatures sont différentes.
— Alex Paliarush

D'accord, c'est une solution légèrement différente.
— LDusan

addfilter peut-il utiliser seulement 1 param?
— Antonio Pedicini

@LDusan, pouvez-vous me dire comment utiliser "$ searchCriteriaBuilder" dans objectmanager?
— Sarfaraj Sipai

2
Je pense que vous devriez l'ajouter dans le constructeur de votre classe, pourquoi voudriez-vous utiliser le gestionnaire d'objets pour cela?
— LDusan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.