Улучшаем поиск заказчиков в админке Magento

Feb 01, 2013 23:53

В предыдущем посте мы улучшили функционал поиска товаров в 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 используя свободный порядок ключевых слов в запросе.

mysql, php, magento

Previous post Next post
Up