Magento 2: Bir Ürün Koleksiyonunu Mağaza Kimliğine Göre Filtreleme


11

Bir ürün fabrikası nesnesi kullanarak, bir ürün oluşturabilir, ürün koleksiyonu alabilir ve bu koleksiyonun ilk öğesini getirebilirim

/* var $productFactory \Magento\Catalog\Model\ProductFactory */
$product = $this->productFactory->create()->getCollection()->getFirstItem();

Ancak, koleksiyonun filtresine bir store_id eklemeye çalışırsam

    $product = $this->productFactory
        ->create()
        ->getCollection()
        ->addFieldToFilter('store_id', 1)
        ->getFirstItem();

Aşağıdaki hatayı alıyorum

Invalid attribute name: store_id
#0 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Eav/Model/Entity/Collection/AbstractCollection.php(1434): Magento\Eav\Model\Entity\Collection\AbstractCollection->_addAttributeJoin('store_id', 'inner')
#1 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Eav/Model/Entity/Collection/AbstractCollection.php(359): Magento\Eav\Model\Entity\Collection\AbstractCollection->_getAttributeConditionSql('store_id', 1, 'inner')
#2 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Catalog/Model/Resource/Product/Collection.php(1489): Magento\Eav\Model\Entity\Collection\AbstractCollection->addAttributeToFilter('store_id', 1, 'inner')
#3 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Eav/Model/Entity/Collection/AbstractCollection.php(382): Magento\Catalog\Model\Resource\Product\Collection->addAttributeToFilter('store_id', 1)
...
#63 {main}

Aynı şey store_id'e göre filtrelemek için bir ürün havuzu kullanmaya çalışırsam da olur (depolar başlık altındaki koleksiyonları kullanır).

Bu bir hata mı? Yoksa Magento 2'de mağazalar, web siteleri ve ürünler arasındaki ilişkiler, artık meşru bir sorgu olmayacak şekilde değişti mi? Her ikisi de? Ne? Başka bir şey?



@fnng Bilmek için yöntemi kullanın, ancak "lütfen bana X mağazasının parçası olan tüm ürünlerin bir listesini alın" demek istiyorum. SetStoreId'ın bunu nasıl yapacağından emin değilim.
Alan Storm

Yanıtlar:


5

Bunu yöntemle yapabilirsiniz addStoreFilter(), bkz.Magento\Catalog\Model\ResourceModel\Product\Collection#addStoreFilter()

addStoreFilter()fonksiyon deposu kimliğini veya kabul edecek Storebir parametre olarak bir nesne.

EG, mevcut mağaza için tüm ürünleri almak için :

public function getProducts(){
    return $this->collection->addStoreFilter($this->_storeManager->getStore()); 
}

Umarım bu yardımcı olur.


Teşekkürler @amitbeta! Bir dakikanız varsa - ürün depolarını kullanarak bir mağaza filtresi oluşturmanın mümkün olup olmadığını biliyor musunuz? magento.stackexchange.com/questions/91278/…
Alan Storm

emin .. bakacağım
Amit Bera

@AmitBera, Lütfen ürün koleksiyonuna addStoreFilter () yöntemini nasıl kullanacağınızı biraz açıklayabilirsiniz.

5

Şimdilik bu bir hata gibi görünüyor, çünkü ProductRepository::getList()mağaza kimliğini yöntemle uygulama olasılığı yok , mağaza kimliğini SearchCriteria filtresi olarak geçiriyor .

GetList uygulamasında, aralarından Tüm filtreleri olduğunu bulabilirsiniz SearchCriteria koleksiyonuna uygulanan

    foreach ($searchCriteria->getFilterGroups() as $group) {
        $this->addFilterGroupToCollection($group, $collection);
    }

Burada Kategori filtresiMagento\Catalog\Model\ProductRepository::addFilterGroupToCollection için özel işlem vardır, ancak Mağaza için kimse yoktur.

Bu nedenle, Magento\Catalog\Model\ProductRepository::addFilterGroupToCollectionmağaza filtresinin olup olmadığını ve toplama için mağaza kimliğini ayarlayıp ayarlamadığımızı kontrol eden ek koşul eklenmelidir :

        if ($filter->getField() == \Magento\Catalog\Model\Product::STORE_ID) {
            $collection->setStore($filter->getValue());
            continue;
        }

Bu sorun için dahili hata oluşturuldu, numarası MAGETWO-45950


Bununla ilgili haber var mı? Github'daki bilet numarasına referans bulamıyorum.
Fabian Schmengler

1
Magento 2'de ürünler Mağazalara değil Web Sitelerine atanır. Bu nedenle, Alan tarafından tanımlanan ilk davranış doğrudur, Ürün varlığının Mağaza Kimliği bağlantısı olmadığından, yalnızca Web Sitesi Kimliği'ne bağlantı verin. Ve dahili bilet, ProductWebsiteLinkInterface ile Extension özelliğinin ProductInterface'e tanıtımı ile ilgilidir
Igor Minyaylo

Mağaza / web sitesi ilişkilendirmesinin yanı sıra, setStore()hangi mağazaya özgü özellik değerlerinin getirildiğini de belirtmiyor mu? Yoksa bu şimdi farklı bir şekilde mi yapılıyor?
Fabian Schmengler

Ürün modeli uygulamasında setStoreId / getStoreId yöntemleri vardır, ancak ProductInterface içinde hiç kimse yoktur, bu nedenle iş mantığınızda bunlara güvenmeniz önerilmez.
Igor Minyaylo

Şimdilik, REST API'lerinde StoreID URL bölümü tarafından yapılan StoreView düzey değerlerini (örneğin, niteliklerin yerelleştirilmesi) çözümlemek için
Igor Minyaylo

0

Birkaç tablo ile özel model kullanıyorsanız, aşağıdaki tablo_adı ekleyin: addFieldToFilter('**table_name.**column_name', 1)


Yukarıda belirtildiği gibi, ürün koleksiyonunu
sütunumdan

0

1) Sınıf \Magento\Catalog\Model\ResourceModel\Category\Collection:

/** @var \Magento\Catalog\Model\ResourceModel\Category\Collection $collection */
$collection = $this->categoryFactory->create()->getCollection()
        ->addFieldToSelect('*');

2) Sonra yöntem $collection->setStoreId(0);


PS yerine 0, mağaza kimliği 1, 2, ...
koyabilirsiniz

Meta: Nedense yıldız sembolü buradaki mesajımdan kaldırıldı.
Mart'ta Giedrius Tumelis
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.