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.