Как переместить товары «нет в наличии» в конец списков после поиска? - PullRequest
0 голосов
/ 03 июля 2011

Я новичок в magento, и мне нужна ваша помощь.Мне нужно переместить продукты «нет в наличии» в конец списков в результатах поиска.Как я могу это сделать?

Я обнаружил, что модуль catalogsearch используется для поиска.Также я видел, что есть поле cataloginventory_stock_item и is_in_stock.Правильный ли это флаг проверки товара на складе или нет.И я думаю, что я должен добавить также условие заказа, когда данные поступают из БД.Но я не могу найти, где (файл) эти данные получают из таблиц catalogsearch_query и catalogsearch_result и где (и как) я должен добавить условие заказа.Можете привести пример?

Ответы [ 2 ]

1 голос
/ 05 июля 2011

Я сделал это. И я хотел бы поделиться с вами своим методом. Может быть, это очень легко сделать для парня, который уже работал с magento, но не для новичка.

Модуль 'CatalogSearch' отвечает за поиск по каталогу продукции. Путь к модулю: «DOC_ROOT / app / code / core / Mage / CatalogSearch».

Прежде всего, мы не должны редактировать основные файлы (файлы в папке 'Mage') и должны переопределять основные классы и функции. Чтобы достичь нашей цели (вопрос моей темы), мы должны отредактировать некоторые функции в разных классах, поэтому нам нужно переопределить эти функции.

В Magento есть два вида каталога поисковых продуктов: простой и расширенный (может быть, и больше, но я не знаю другого), и мы будем влиять на эти 2 типа.

Шаг 1: Мы должны сообщить движку Magento, что мы хотели бы переопределить некоторые его основные классы. Следовательно, мы создаем собственный модуль. Перейдите в «/ app / etc / modules /» и создайте файл «YourCompany_YourModuleName.xml» со ​​следующим содержимым:

<?xml version="1.0"?>
<config>
    <modules>
        <YourCompany_YourModuleName>
            <active>true</active>
            <codePool>local</codePool>
        </YourCompany_YourModuleName>
    </modules>
</config>

Шаг 2: Теперь мы должны создать наш модуль. Перейдите в '/ app / code / local / YourCompany / YourModuleName /' и создайте папки 'etc'. Поместите файл config.xml в эту папку и т. Д., Мы должны указать magetno, какие файлы / классы мы хотим переопределить.

config.xml content:

<?xml version="1.0"?>
<config>
    <modules>
        <yourcompany_yourmodulename>
            <version>0.1.0</version>
        </yourcompany_yourmodulename>
    </modules>
    <global>
        <models>
            <catalogsearch>
                <rewrite>
                    <layer>YourCompany_YourModuleName_Model_CatalogSearch_Layer</layer>
                    <advanced>YourCompany_YourModuleName_CatalogSearch_Advanced</advanced>
                </rewrite>
            </catalogsearch>
            <catalogsearch_mysql4>
                <rewrite>
                    <fulltext_collection>YourCompany_YourModuleName_Model_CatalogSearch_Mysql4_Fulltext_Collection</fulltext_collection>
                    <advanced_collection>YourCompany_YourModuleName_Model_CatalogSearch_Mysql4_Advanced_Collection</advanced_collection>
                </rewrite>
            </catalogsearch_mysql4>     
        </models>
    </global>
</config>

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

Шаг 3: Создайте 4 новых файла в нашем модуле со следующим содержанием:

  1. / приложение / код / ​​местные / YourCompany / YourModuleName / Модель / CatalogSearch / Advanced.php '

    class YourCompany_YourModuleName_Model_CatalogSearch_Advanced extends Mage_CatalogSearch_Model_Advanced
    {
        /**
         * Retrieve advanced search product collection
         *
         * @return Mage_CatalogSearch_Model_Mysql4_Advanced_Collection
         */
        public function getProductCollection(){
            if (is_null($this->_productCollection)) {
                $this->_productCollection = Mage::getResourceModel('catalogsearch/advanced_collection')
                    ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
                    ->addMinimalPrice()
                    ->addTaxPercents()
                    ->addStoreFilter();
    
                $this->_productCollection->getSelect()->joinLeft(
                    array('_inventory_table'=>'cataloginventory_stock_item'),
                    "_inventory_table.product_id = e.entity_id",
                    array('is_in_stock', 'manage_stock')
                );
    
                $this->_productCollection->addExpressionAttributeToSelect('on_top',
                    '(CASE WHEN (((_inventory_table.use_config_manage_stock = 1) AND (_inventory_table.is_in_stock = 1)) OR  ((_inventory_table.use_config_manage_stock = 0) AND (1 - _inventory_table.manage_stock + _inventory_table.is_in_stock >= 1))) THEN 1 ELSE 0 END)',
                array());
    
                Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($this->_productCollection);
                Mage::getSingleton('catalog/product_visibility')->addVisibleInSearchFilterToCollection($this->_productCollection);
            }
            return $this->_productCollection;
        }
    }
    
  2. / приложение / код / ​​местные / YourCompany / YourModuleName / Модель / CatalogSearch / Layer.php '

    class YourCompany_YourModuleName_Model_CatalogSearch_Layer extends Mage_CatalogSearch_Model_Layer
    {
        public function prepareProductCollection($collection)
        {
            $collection->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
                ->addSearchFilter(Mage::helper('catalogsearch')->getQuery()->getQueryText())
                ->setStore(Mage::app()->getStore())
                ->addMinimalPrice()
                ->addFinalPrice()
                ->addTaxPercents()
                ->addStoreFilter()
                ->addUrlRewrite();
            $collection->getSelect()->joinLeft(
                    array('_inventory_table'=>'cataloginventory_stock_item'),
                    "_inventory_table.product_id = e.entity_id",
                    array('is_in_stock', 'manage_stock')
                );
            $collection->addExpressionAttributeToSelect('on_top',
                '(CASE WHEN (((_inventory_table.use_config_manage_stock = 1)
                AND (_inventory_table.is_in_stock = 1)) OR  ((_inventory_table.use_config_manage_stock = 0)
                AND (1 - _inventory_table.manage_stock + _inventory_table.is_in_stock >= 1)))
                THEN 1 ELSE 0 END)',
            array());
            Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);
            Mage::getSingleton('catalog/product_visibility')->addVisibleInSearchFilterToCollection($collection);
            return $this;
        }
    }
    
  3. / приложение / код / ​​местные / YourCompany / YourModuleName / Модель / CatalogSearch / mysql4 / Дополнительно / Collection.php '

    class YourCompany_YourModuleName_Model_CatalogSearch_Mysql4_Advanced_Collection extends
        Mage_CatalogSearch_Model_Mysql4_Advanced_Collection
    {
        public function setOrder($attribute, $dir='desc')
        {
        $this->addAttributeToSort('on_top', 'desc');
            parent::setOrder($attribute, $dir);
            return $this;
        }
    }
    
  4. / приложение / код / ​​местные / YourCompany / YourModuleName / Модель / CatalogSearch / mysql4 / Полный текст / Collection.php '

    class YourCompany_YourModuleName_Model_CatalogSearch_Mysql4_Fulltext_Collection
        extends Mage_CatalogSearch_Model_Mysql4_Fulltext_Collection
    {
       public function setOrder($attribute, $dir = 'desc')
        {
            if ($attribute == 'relevance') {
                $this->getSelect()->order("on_top DESC")->order("relevance {$dir}");
            }
            else {
                parent::setOrder('on_top', 'DESC');
                parent::setOrder($attribute, $dir);
            }
            return $this;
        }
    }
    

Вот и все. Как вы можете видеть, мы должны просто подключиться к таблице «cataloginventory_stock_item», одновременно получая данные для поиска, чтобы определить, какого продукта нет в наличии, и добавить дополнительный заказ для продуктов.
Ничего особенного, но у меня была проблема, где и что мне делать, чтобы достичь своей цели.

p.s. если кто-то может предложить лучший способ сделать это - милости просим. Тем не менее я не мог найти подходящий учебник для этого.

0 голосов
/ 03 июля 2011

Эта тема может вам помочь: http://www.magentocommerce.com/boards/viewthread/31680/

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

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