/** * Разбор фильтров * OR(AND(filter:field:operator:value;filter2:field:oerpator:value);(...)), etc. * * @param string $filter_string строка со всеми фильтрами * @return mixed результат разбора фильтров */ protected function getFilters($filter_string) { $this->debug->debug("getFilters: " . $this->debug->dumpData($filter_string), 'getFilter', 1); // the filter parameter tells us, which filters can be used in this query $filter_string = trim($filter_string, ' ;'); if (!$filter_string) { return; } $output = array('join' => '', 'where' => ''); $logic_op_found = false; $joins = $wheres = array(); foreach ($this->_logic_ops as $op => $sql) { if (strpos($filter_string, $op) === 0) { $logic_op_found = true; $subfilters = mb_substr($filter_string, strlen($op) + 1, mb_strlen($filter_string, "UTF-8"), "UTF-8"); $subfilters = $this->smartSplit($subfilters); foreach ($subfilters as $subfilter) { $subfilter = $this->getFilters(trim($subfilter)); if (!$subfilter) { continue; } if ($subfilter['join']) { $joins[] = $subfilter['join']; } if ($subfilter['where']) { $wheres[] = $subfilter['where']; } } $output['join'] = !empty($joins) ? implode(' ', $joins) : ''; $output['where'] = !empty($wheres) ? '(' . implode($sql, $wheres) . ')' : ''; } } if (!$logic_op_found) { $filter = $this->loadFilter($filter_string); if (!$filter) { $this->debug->warning('Error while loading DocLister filter "' . $this->debug->dumpData($filter_string) . '": check syntax!'); $output = false; } else { $output['join'] = $filter->get_join(); $output['where'] = $filter->get_where(); } } $this->debug->debug('getFilter'); return $output; }