Я сделал это. И я хотел бы поделиться с вами своим методом. Может быть, это очень легко сделать для парня, который уже работал с 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 новых файла в нашем модуле со следующим содержанием:
/ приложение / код / местные / 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;
}
}
/ приложение / код / местные / 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;
}
}
/ приложение / код / местные / 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;
}
}
/ приложение / код / местные / 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. если кто-то может предложить лучший способ сделать это - милости просим. Тем не менее я не мог найти подходящий учебник для этого.