'price', 'ProductData' => array('title', 'description'), 'color') * результатом буде наступна умова: * (`Product`.`price` LIKE '%Digitex%' * OR `ProductData`.`title` LIKE '%Digitex%' * OR `ProductData`.`description` LIKE '%Digitex%' * OR `color` LIKE '%Digitex%') * * @param string $filterString * Строка по якій відбувається фільтрування. Строка розбивається на слова, * для групування слів можна використовати символ " (подвійна лапка). Кожне слово * порівнюється з кожним полем для пошуку. * * @param string $equation * Оператор порівняння який буде використовуватись в MySql виразі. По дефолту використовується LIKE. * * @param string $wordRule * Логічний ператор по якому будуть склеюватись всі вирази порівняння слів. По дефолту OR. * * @param string $fieldRule * Логічний ператор по якому будуть склеюватись всі вирази порівняння полів. По дефолту OR. * * @return boolean */ public static function where(Zend_Db_Select $select, array $filterFields, $filterString, $equation = 'LIKE', $wordRule = 'AND', $fieldRule = 'OR') { if (empty($filterFields) || '' == $filterString) { return false; } $wordRule = strtolower($wordRule); $fieldRule = strtolower($fieldRule); $where = array(); foreach (self::getWords($filterString) as $word) { if (false !== stripos($equation, 'LIKE')) { $word = str_replace(array('\\', '_', '%'), array('\\\\', '\_', '\%'), $word); $word = "%{$word}%"; } $whereFields = array(); $word = $select->getAdapter()->quote($word); foreach ($filterFields as $table => $fields) { if (!is_string($table)) { $table = ''; } if($fields instanceof Zend_Db_Expr) { $whereFields[] = $fields->__toString() . " {$equation} {$word}"; } else if (is_string($fields) && strpos($fields, '(') !== false && strpos($fields, ')') !== false) { $whereFields[] = "{$fields} {$equation} {$word}"; } else { $fields = (array) $fields; foreach ($fields as $field) { if($field instanceof Zend_Db_Expr) { $whereFields[] = $field->__toString() . " {$equation} {$word}"; } else if (is_string($field) && strpos($field, '(') !== false && strpos($field, ')') !== false) { $whereFields[] = "{$field} {$equation} {$word}"; } else { $whereFields[] = (($table) ? "`{$table}`." : '') . "`{$field}` {$equation} {$word}"; } } } } $where[] = '(' . implode((($fieldRule == 'and') ? ' AND ' : ' OR '), $whereFields) . ')'; } if (empty($where)) { return false; } $sql = implode((($wordRule == 'and') ? ' AND ' : ' OR '), $where); $select->where($sql); return true; } /** * Метод розбиває строку на слова. Для групування слів можна використовати символ " (подвійна лапка) * * @param string $string * Вхідна строка. * * @return array * Повертає масив слів. Якщо передана порожня строка - то повертається порожній масив. */ public static function getWords($string) { $string = ' ' . $string . ' '; preg_match_all('/(?<= )"([^"]*)"(?= )/', $string, $result); if ($result) { $string = str_replace($result[0], '', $string); } $words = explode(' ', $string); if ($result) { $words = array_merge($words, $result[1]); } $words = array_unique($words); $words = array_filter($words, function ($var) { return ('' != $var); }); return $words; } }