Bir Magento 2 Nesne Deposunu Filtreleme


24

Magento 2'de ürün özelliklerine göre filtrelemek için bir ürün deposu kullanabilir misiniz?

Magento 2'de bir arama kriteri nesnesi kullanabilirsiniz.

\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria,

ve bir depo

\Magento\Catalog\Api\ProductRepositoryInterface $productRepository,

Nesnelerin listesini almak için

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

Ancak, searchCriteria nesnesi (görünüşte?) Doğrudan filtreleme özelliklerine sahip değildir. Arama kriterleri sınıfı yok bir şey denilen filterGroups eklemek için yöntemleriniz var

#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);
}    

Ancak, bir filtre grubunun PHP'nin yazılmamış dizileri sayesinde tam olarak ne olduğu belli değil.

Magento 2 deposunu gibi şeyler yapmak için nasıl kullanabilirim

  • [Bu özel SKU] ile tüm ürünleri göster
  • [Bu tarihten sonra] sonra oluşturulan tüm ürünleri göster
  • vb.

2
Sözü edilen grupların bir Magento \ Framework \ Api \ Search \ FilterGroup dizisi olduğu anlaşılıyor; sırayla \ Magento \ Framework \ Api \ Filter filtreleri var, filtreler \ Magento \ Framework \ Api \ FilterBuilder ile oluşturulmuş ve koşul_tipi içinde 'eq', 'neq', 'gt' vb. Ancak desteklenen koşul türlerinin listesini bulamadım: \
Petar Dzhambazov

2
Aslında, bir liste gibi bir şey Magento / Framework / Api / CriteriaInterface.php adresinde bulunabilir: 79
Petar Dzhambazov 20:15

Yanıtlar:


30

Aşağıdaki örnek sınıfa göz atın. SKU’ya göre filtrelemek için şunu deneyin:

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

Belirli bir tarihten sonra üretilen ürünleri almak için, bu:

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

Örnek sınıf:

<?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
Teşekkürler, tam olarak neyin peşindeyim! Birden fazla filtre eklemek "VEYA" koşulları yaratıyor gibi görünüyor - "VE" koşulları yaratmanın bir yolu var mı?
Alan Storm,

3
- Bir dakikan varsa. Filtre grubunu doğru kullanıyor muyum? Bir VEYA olarak değil, VEYA olarak başvuruyor gibiler magento.stackexchange.com/questions/91023/…
Alan Storm

4
Filtreler, bir filtre grubunun içinde "OR" ile birleştirilir ve her grup, arama kriterleri düzeyinde "VE" ile birleştirilir. Bir göz atın: \ Magento \ Framework \ Api \ SearchCriteriaBuilder :: setFilterGroups ($ grupları []) ve \ Magento \ Framework \ Api \ Arama \ FilterGroupBuilder :: setFilters ($ filtreleri [])
Alex Paliarush

Magento 2.3 kullanıyorum, arama kriteri oluşturucu öğeyi "out_of_stock" ise öğeye filtrelemiyor mu?
Ahtapot

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
Örnekte \Magento\Framework\Api\Search\SearchCriteriaBuilderkullanılmış gibi görünüyor (aramaya özgü), ben kullanırken \Magento\Framework\Api\SearchCriteriaBuilder(tüm hizmetler için genel), cevabımı gör. Ayrıca, filtre eklemenin daha basit bir yolunu sağlar, addFilter()imzalar farklıdır.
Alex Paliarush 20:15

Kabul, biraz farklı bir çözüm.
LDusan

filtre sadece 1 param kullanabilir miyim?
Antonio Pedicini 24:17

@LDusan, lütfen bana "$ searchCriteriaBuilder" nesnesini nasıl kullanabileceğimi söyleyebilir misiniz?
Sarfaraj Sipai,

2
Bence bunu sınıfınızın yapıcısına eklemelisiniz, neden bunun için nesne yöneticisini kullanmak istersiniz?
LDusan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.