В
предыдущем посте мы улучшили функционал поиска товаров в Magento Global Records Search. Теперь товары находятся не только по точному запросу, но и используя свободный порядок ключевых слов.
В этом посте, мы покажем, как можно еще улучшить Global Records Search с тем, чтобы при его помощи можно было искать заказчиков не только по имени и фамилии, но и по названию компании, либо мейлу. При этом порядок ключевых слов также может быть свободным.
Делаем локальный рерайт в папку app\code\local\Mage\Adminhtml\Model\Search\
файла Customer.php
В этом файле находим класс Mage_Adminhtml_Model_Search_Customer
В нем добавляем следующий приватный метод:
/**
* Get OR combined SQL
*
* @return string
*/
private function getCombinedLikeSql($x,$fieldName)
{
$sql = "";
$termsArr = preg_split('/\s+/',(string)$x);
foreach ($termsArr as $term){
$term = preg_replace('/%/','',$term);
$term = preg_replace("/'/",'',$term);
if (empty($sql)){
$sql = ' ('.$fieldName.' LIKE "%'.$term.'%")';
}else{
$sql .= ' OR ('.$fieldName.' LIKE "%'.$term.'%")';
}
}
return $sql;
}
Далее, заменяем метод load() на:
public function load()
{
$arr = array();
if (!$this->hasStart() || !$this->hasLimit() || !$this->hasQuery()) {
$this->setResults($arr);
return $this;
}
$collection = Mage::getResourceModel('customer/customer_collection')
->addNameToSelect()
->joinAttribute('company', 'customer_address/company', 'default_billing', null, 'left')
->setPage(1, 10);
//Add filter for firstname attribute
$sql_f = $this->getCombinedLikeSql($this->getQuery(),"`at_firstname`.`value`");
//Add filter for lastname attribute
$sql_l = $this->getCombinedLikeSql($this->getQuery(),"`at_lastname`.`value`");
//Add filter for company attribute
$sql_c = $this->getCombinedLikeSql($this->getQuery(),"`at_company`.`value`");
//Add filter for email attribute
$sql_e = $this->getCombinedLikeSql($this->getQuery(),"`e`.`email`");
$collection->getSelect()->where("($sql_f) OR ($sql_l) OR ($sql_c) OR ($sql_e)");
//Load collection
//Mage::log((string)$collection->getSelect());
$collection->load();
foreach ($collection->getItems() as $customer) {
$arr[] = array(
'id' => 'customer/1/'.$customer->getId(),
'type' => Mage::helper('adminhtml')->__('Customer'),
'name' => $customer->getName(),
'description' => $customer->getCompany(),
'url' => Mage::helper('adminhtml')->getUrl('*/customer/edit', array('id'=>$customer->getId())),
);
}
$this->setResults($arr);
return $this;
}
Тестируем.
Теперь поиск работает следующим образом: если поисковая строка состоит из нескольких слов
разделенных пробелами, берется каждое слово и сравнивается со значением поля email, а также значениям
атрибутов firstname, lastname, company. При этом порядок слов в запросе не имеет значения.
В следующем посте мы продолжим исследование проблемы поиска в административной панели Magento и рассмотрим один из вариантов решения для поиска заказов в Global Records Search используя свободный порядок ключевых слов в запросе.