Magento - addStoreFilter не работает? - PullRequest
4 голосов
/ 21 февраля 2011

При получении коллекции товаров в Magento я ожидал, что StoreFilter сделает это, отфильтровывает по текущему магазину.Но я не могу заставить его работать.

Скажем, у меня 2 магазина, настроенных так: enter image description here

И оба магазина имеют разные корневые категории.Основной магазин - это образец данных по умолчанию, в Store2 есть только один продукт, который я добавил.Я бы подумал, что при использовании фильтра магазина будут отображаться только товары из корневой категории текущего магазина.Но я получаю каждый продукт, показывающий.Я проверяю это, помещая в свой шаблон представления категории следующее:

$store_id = Mage::app()->getStore()->getId();
$_testproductCollection = Mage::getResourceModel('reports/product_collection')
->setStoreId($storeId)
->addStoreFilter($store_id)
->addAttributeToSelect('*');
$_testproductCollection->load();
foreach($_testproductCollection as $_testproduct){ 
echo $this->htmlEscape($_testproduct->getName()); 
};

Если я повторяю идентификатор магазина, он дает мне правильный номер.У меня есть только один товар в Магазине 2, так почему я получаю каждый товар из всех магазинов?Я могу настроить каждый товар в главном магазине так, чтобы он не отображался в Store2, а затем добавить фильтр видимости, но это заняло бы вечность.

Кроме того, я только что заметил, что если я повторяю идентификатор магазина товаров, я получаю текущийИдентификатор, а не хранилище, которому он присвоен:

echo $_testproduct->getStoreId()

Что происходит?

ОБНОВЛЕНИЕ (8 апреля 2011 г.): ОК, поэтому я попытался объединить поля так,что store_id включен (как предложено ниже), раздел кода {{table}}. store_id = 1 просто устанавливает для всех продуктов значение store_id, равное 1. Как я могу просто получить store_idсвязан с продуктом?

$_testproductCollection = Mage::getResourceModel('catalog/product_collection');
$_testproductCollection->joinField('store_id', 'catalog_category_product_index', 'store_id', 'product_id=entity_id', '{{table}}.store_id = 1', 'left');
$_testproductCollection->getSelect()->distinct(true);
$_testproductCollection->addAttributeToSelect('*')->load();

foreach($_testproductCollection as $_testproduct){  
echo $this->htmlEscape($_testproduct->getName())."<br/>"; 
echo "STORE IS ".$_testproduct->getData('store_id')."<br/>";
};

Если я проверю таблицу catalog_category_product_index моей базы данных, то store_id верны.

Ответы [ 4 ]

4 голосов
/ 22 февраля 2011

$_testproductCollection должно выглядеть следующим образом $_testproductCollection = Mage::getResourceModel('reports/product_collection')->addAttributeToSelect('*')->addStoreFilter().

Если вы напечатаете SELECT из этой коллекции, вы увидите, что нет никакого столбца магазина, поэтому addStoreFilter() не может применяться WHERE.

Вы должны использовать joinField() в своей коллекции и добавить столбец store_id из таблицы catalog_product_entity_varchar.

РЕДАКТИРОВАТЬ

Извинитечтобы заставить Вас ждать;)

$collection = Mage::getResourceModel('catalog/product_collection');
$collection->joinField('store_id', 'catalog_category_product_index', 'store_id', 'product_id=entity_id', '{{table}}.store_id = 1', 'left');
$collection->getSelect()->distinct(true);

Это должно сработать, но просто чтобы быть уверенным, пожалуйста, проверьте, если вы получаете нужные продукты:)

3 голосов
/ 30 января 2014

Это сработало для меня:

Mage::app()->setCurrentStore($storeId); 
$productCollection = Mage::getModel('catalog/product')
            ->getCollection()
            ->addStoreFilter()
            ->addAttributeToSelect(array('sku','price'));
2 голосов
/ 13 декабря 2011

Хорошо, я думаю, что это работает, не слишком много тестировал, но, похоже, добился цели. Сначала вам нужно получить идентификатор корневой категории вашего магазина, затем соединить несколько полей, чтобы иметь доступ к продукту "category_id", а затем отфильтровать, используя это:

$_rootcatID = Mage::app()->getStore()->getRootCategoryId();

$_testproductCollection = Mage::getResourceModel('catalog/product_collection')
->joinField('category_id','catalog/category_product','category_id','product_id=entity_id',null,'left')
->addAttributeToFilter('category_id', array('in' => $_rootcatID))
->addAttributeToSelect('*');
$_testproductCollection->load();

foreach($_testproductCollection as $_testproduct){ 
    echo $this->htmlEscape($_testproduct->getName())."<br/>"; 
};
0 голосов
/ 08 июня 2013

Я думаю

Вам не нужно делать никаких объединений, так как setStoreId () будет работать в magento.

 $collection = Mage::getModel("catalog/product")
->getCollection()
->setStoreId(1) //change store Id according your needs
->addAttributeToSelect(array('name','url','sku'))
->setPageSize(20);                

Это даст максимум 20 товаров из магазина с идентификатором 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...