Могу ли я переопределить функцию getLoadedProductCollection() до ее загрузки?


Я пытаюсь переопределить коллекцию продуктов, поступающую из $this->getloadedproductcollection(), поэтому я попытался переопределить метод

class **_**_Model_Rewrite_Layer extends Mage_Catalog_Model_Layer {
  public function prepareProductCollection($collection) {
  ...
  $collection->addAttributeToFilter('my_attribute', array('in' => array(67)));
  ...
}

Но, похоже, это не работает. Когда я добавляю

echo ( $collection->getSelect() );

Запрос даже не включает фильтры многоуровневой навигации, поэтому я не могу перезаписать их логику.

Что я пытаюсь сделать, так это изменить способ работы одного многоуровневого навигационного фильтра.

На правильном ли я пути, чтобы переопределить prepareProductCollection() или мне следует переопределить метод, который вызывается позже в процессе?

Буду признателен за любую помощь.

Author: Aasim Goriya, 2013-04-19

2 answers

Я решил эту проблему, переписав метод apply() класса Mage_Catalog_Model_Layer_Filter_Attribute.

В этом месте фильтр атрибутов добавляется в коллекцию, затем он выполняется, и вы можете делать все, что захотите. Т.е. для фильтрации

$oAttributeModel = $this->getAttributeModel();
$this->getLayer()->getProductCollection()->addAttributeToFilter(
                    $oAttributeModel,
                        array(
                            'lteq'  => $sFilterValue,
                        )
                );
 1
Author: Tobias, 2013-04-19 15:54:08

Хорошо, благодаря Тобиасу Зандеру мне удалось решить свою проблему. Не знаю, стоит ли так поступать, но он делает то, что должен для меня, так что вот мое решение по этому поводу:

1. В вашем существующем модуле config.xml файл добавьте следующее в область <global>:

<models>
    <catalog_resource>
        <rewrite>
            <layer_filter_attribute>YourCompany_YourModule_Catalog_Model_Resource_Layer_Filter_Attribute</layer_filter_attribute>
        </rewrite>
    </catalog_resource>
</models>

2. Создайте файл в /app/code/local/YourCompany/YourModule/Catalog/Model/Resource/Layer/Filter/Attribute.php

3. Добавьте следующее во вновь созданный файл Attribute.php:

<?php
class YourCompany_YourModule_Catalog_Model_Resource_Layer_Filter_Attribute extends Mage_Catalog_Model_Resource_Layer_Filter_Attribute {
public function applyFilterToCollection($filter, $value) {
    $collection = $filter->getLayer()->getProductCollection();
    $attribute  = $filter->getAttributeModel();
    $connection = $this->_getReadAdapter();
    $tableAlias = $attribute->getAttributeCode() . '_idx';

    $conditions = array(
        "{$tableAlias}.entity_id = e.entity_id",
        $connection->quoteInto("{$tableAlias}.attribute_id = ?", $attribute->getAttributeId()),
        $connection->quoteInto("{$tableAlias}.store_id = ?", $collection->getStoreId()),
        $connection->quoteInto("{$tableAlias}.value = ?", $value)
    );

    if( $attribute->getAttributeCode() == 'my_attribute' ) { // Use another logic for your attribute only
        $value = 'x,y,z'; // Your logic goes here to add multiple values for the SQL IN() statement below
        $conditions[3] = $connection->quoteInto("{$tableAlias}.value IN($value)", $value);
    }

    $collection->getSelect()->join(
        array($tableAlias => $this->getMainTable()),
        implode(' AND ', $conditions),
        array()
    );

    return $this;
    }
}
?>

Единственная разница в моем случае заключается в использовании

$connection->quoteInto("{$tableAlias}.value IN($value)", $value)

Вместо этого из

$connection->quoteInto("{$tableAlias}.value = ?", $value)
 0
Author: oschloebe, 2013-04-20 15:04:41