Magento: Добавление списка фильтруемых атрибутов в файл шаблона - PullRequest
0 голосов
/ 30 сентября 2010

У меня есть магазин для мужчин и женщин под тем же сайтом в Magento.Сайт «Мужчины» работает в категории «Мужчины», а сайт «Женщины» - в категории «Женщины».У меня есть настраиваемая настройка настраиваемого атрибута под названием «конструктор».В настоящее время многоуровневая навигация на странице категории показывает атрибут Designer для продуктов в этом магазине вместе с любыми дизайнерами, которые связаны с продуктом.Я хотел бы показать этот список на другой странице.

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

У меня проблемы с выполнением.Я могу получить список всех дизайнеров, но не могу отфильтровать его по категории магазина.Вот соответствующий код, который я использую в настоящее время - есть ли лучший способ сделать это?Любая помощь приветствуется.

//load the current category
$store_category = Mage::app()->getStore()->getRootCategoryId();

//get all product designers
$product = Mage::getModel('catalog/product');
$attributes = Mage::getResourceModel('eav/entity_attribute_collection')
   ->setEntityTypeFilter($product->getResource()->getTypeId())
   ->addFieldToFilter('attribute_code', 'designer') // This can be changed to any attribute code
   ->load(false);
$attribute = $attributes->getFirstItem()->setEntity($product->getResource());
$designers = $attribute->getSource()->getAllOptions(false);

//get all products
$collection = Mage::getModel('catalog/product')->getCollection();
$new_collection = Mage::getModel('catalog/category')->load($store_category)->getProductCollection();


//filter to only get visible products
$collection->addAttributeToFilter('visibility', Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH);

//filter by category - not working correctly
$collection->addCategoryFilter(Mage::getModel('catalog/category')->load($store_category));

//get products in stock
$collection->joinField('stock_status','cataloginventory/stock_status','stock_status',
      'product_id=entity_id', array(
      'stock_status' => Mage_CatalogInventory_Model_Stock_Status::STATUS_IN_STOCK
   ));

//get all products with the designer attribute
$collection->addAttributeToSelect('designer');

//count the number of designers
$collection->addExpressionAttributeToSelect('designers_count', 'COUNT({{attribute}})', 'designer');

//group by the designer - limits the collection by products that have a designer setup
$collection->groupByAttribute('designer');
echo 'collection count->'.$collection->count();
//loop through collection and add the number of designers and designer id to an array
foreach($collection as $item)
{
   //get the designer id and the designers count
   $designer_id = $item->getDesigner();
   $designers_count = $item->getData('designers_count');

   //skip if the designers count is 0
   if($designers_count == 0)
   {
      continue;
   }// if

   //skip if the designer_id is empty
   if(empty($designer_id))
   {
      continue;
   }// if

   //add information to array
   $designers_in_use[$designer_id] = $designers_count;
}// foreach

Ответы [ 2 ]

1 голос
/ 01 октября 2010

ОК - так что я понял, как это сделать.Сначала я создал каталог designer / view.phtml и файл в каталоге app / design / frontend / my-layout / default / template.Я нашел страницу CMS, к которой хотел добавить конструкторов, и назвал этот блок в содержании: {{block type="catalog/layer_view" template="designers/view.phtml"}}

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

1 голос
/ 30 сентября 2010

Magento использует индексные таблицы для создания многоуровневой навигации: в magento версии 1.3 у вас есть таблица catalogindex_eav (store_id, entity_id, attribute_id, значение) в версии magento 1.4 у вас есть несколько таблиц, но я думаю, что вам нужен только catalog_product_index_eav (entity_id, attribute_id, store_id, value)

Для magento 1.4 взгляните на класс Mage_Catalog_Model_Resource_Eav_Mysql4_Layer_Filter_Attribute - метод getCount:

Основная идея - объединить коллекцию продуктов с таблицей catalog_product_index_eav:

// excerpt from Mage_Catalog_Model_Resource_Eav_Mysql4_Layer_Filter_Attribute getCount()
$conditions = array(
            "{$tableAlias}.entity_id = e.entity_id",
            $connection->quoteInto("{$tableAlias}.attribute_id = ?", $attribute->getAttributeId()),
            $connection->quoteInto("{$tableAlias}.store_id = ?", $filter->getStoreId()),
        );

        $select
            ->join(
                array($tableAlias => $this->getMainTable()),
                join(' AND ', $conditions),
                array('value', 'count' => "COUNT({$tableAlias}.entity_id)"))
            ->group("{$tableAlias}.value");  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...