Exemplo n.º 1
0
 /**
  * Разбор фильтров
  * 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;
 }