public function prepareRules(IMetaModelFilter $objFilter, $arrFilterUrl)
 {
     if ($this->get('items')) {
         $arrItems = explode(',', (string) $this->get('items'));
     } else {
         $arrItems = array();
     }
     $objFilter->addFilterRule(new MetaModelFilterRuleStaticIdList($arrItems));
 }
 /**
  * Generates the filter rules based upon the given filter url.
  *
  * @param IMetaModelFilter $objFilter    The filter to append the rules to.
  *
  * @param string[string]   $arrFilterUrl The parameters to evaluate.
  *
  * @return void
  */
 public function prepareRules(IMetaModelFilter $objFilter, $arrFilterUrl)
 {
     $objFilterRule = new MetaModelFilterRuleOR($this->get('stop_after_match'));
     foreach ($this->arrChilds as $objChildSetting) {
         $objSubFilter = new MetaModelFilter($this->getMetaModel());
         $objChildSetting->prepareRules($objSubFilter, $arrFilterUrl);
         $objFilterRule->addChild($objSubFilter);
     }
     $objFilter->addFilterRule($objFilterRule);
 }
 public function prepareRules(IMetaModelFilter $objFilter, $arrFilterUrl)
 {
     $strSQL = $this->get('customsql');
     $arrParams = array();
     $strSQL = $this->parseTable($strSQL, $arrParams);
     $strSQL = $this->parseRequestVars($strSQL, $arrParams, $arrFilterUrl);
     $strSQL = $this->parseSecureInsertTags($strSQL, $arrParams);
     $strSQL = $this->parseInsertTags($strSQL, $arrParams);
     if (!strlen($strSQL)) {
         return;
     }
     $objFilterRule = new MetaModelFilterRuleSimpleQuery($strSQL, $arrParams);
     $objFilter->addFilterRule($objFilterRule);
 }
 /**
  * {@inheritdoc}
  */
 public function prepareRules(IMetaModelFilter $objFilter, $arrFilterUrl)
 {
     $objMetaModel = $this->getMetaModel();
     $objAttribute = $objMetaModel->getAttributeById($this->get('attr_id'));
     $strParam = $this->getParamName();
     if ($objAttribute && $strParam) {
         $arrFilterValue = $arrFilterUrl[$strParam];
         if (!$arrFilterValue && $this->get('defaultid')) {
             $arrFilterValue = $this->get('defaultid');
         }
         if ($arrFilterValue) {
             $arrLanguages = $objMetaModel->isTranslated() && $this->get('all_langs') ? $objMetaModel->getAvailableLanguages() : array($objMetaModel->getActiveLanguage());
             $objFilterRule = new MetaModelFilterRuleSearchAttribute($objAttribute, $arrFilterValue, $arrLanguages);
             $objFilter->addFilterRule($objFilterRule);
             return;
         }
         //we found an attribute but no match in URL. So ignore this filtersetting if allow_empty is set
         if ($this->allowEmpty()) {
             $objFilter->addFilterRule(new MetaModelFilterRuleStaticIdList(NULL));
             return;
         }
     }
     // either no attribute found or no match in url, do not return anyting.
     $objFilter->addFilterRule(new MetaModelFilterRuleStaticIdList(array()));
 }
 /**
  * prepare the filter rule
  * @param IMetaModelFilter $objFilter
  * @param $arrFilterUrl
  */
 public function prepareRules(IMetaModelFilter $objFilter, $arrFilterUrl)
 {
     $objMetaModel = $this->getMetaModel();
     $strParamName = $this->getParamName();
     $strParamValue = $arrFilterUrl[$strParamName];
     $strTextsearch = $this->get('textsearch');
     $arrAttributes = deserialize($this->get('textcombine_attributes'));
     // react on wildcard, overriding the search type
     if (strpos($strParamValue, '*') !== false) {
         $strTextsearch = 'exact';
     }
     // type of search
     switch ($strTextsearch) {
         case 'beginswith':
             $strWhat = $strParamValue . '%';
             break;
         case 'endswith':
             $strWhat = '%' . $strParamValue;
             break;
         case 'exact':
             $strWhat = $strParamValue;
             break;
         default:
             $strWhat = '%' . $strParamValue . '%';
             break;
     }
     if ($strParamName && $strParamValue) {
         if ($this->get('textcombine_operator') == 'and') {
             $objParentRule = new MetaModelFilterRuleAND();
         }
         if ($this->get('textcombine_operator') == 'or') {
             $objParentRule = new MetaModelFilterRuleOR();
         }
         foreach ($arrAttributes as $intAttribute) {
             $objAttribute = $objMetaModel->getAttributeById($intAttribute);
             if ($objAttribute) {
                 $objSubFilter = new MetaModelFilter($objMetaModel);
                 $objSubFilter->addFilterRule(new MetaModelFilterRuleSearchAttribute($objAttribute, $strWhat));
                 $objParentRule->addChild($objSubFilter);
             }
         }
         $objFilter->addFilterRule($objParentRule);
         return;
     }
     $objFilter->addFilterRule(new MetaModelFilterRuleStaticIdList(NULL));
 }
 /**
  * Combine a filter in standard filter array notation.
  * Supported operations are:
  * operation      needed arguments     argument type.
  * AND
  *                'childs'             array
  * OR
  *                'childs'             array
  * =
  *                'property'           string (the name of a property)
  *                'value'              literal
  * >
  *                'property'           string (the name of a property)
  *                'value'              literal
  * <
  *                'property'           string (the name of a property)
  *                'value'              literal
  * IN
  *                'property'           string (the name of a property)
  *                'values'             array of literal
  *
  * @param array            $arrFilter The filter to be combined into the passed filter object.
  *
  * @param IMetaModelFilter $objFilter The filter object where the rules shall get appended to.
  *
  * @return void.
  *
  * @throws Exception When an improper filter condition is encountered, an exception is thrown.
  */
 protected function calculateSubfilter($arrFilter, IMetaModelFilter $objFilter)
 {
     if (!is_array($arrFilter)) {
         throw new Exception('Error Processing subfilter: ' . var_export($arrFilter, true), 1);
     }
     $objAttribute = null;
     if ($arrFilter['property']) {
         $objAttribute = $this->objMetaModel->getAttribute($arrFilter['property']);
     }
     switch ($arrFilter['operation']) {
         case 'AND':
         case 'OR':
             if ($arrFilter['operation'] == 'AND') {
                 $objFilterRule = new MetaModelFilterRuleAND();
             } else {
                 $objFilterRule = new MetaModelFilterRuleOR();
             }
             $objFilter->addFilterRule($objFilterRule);
             $objSubFilter = new MetaModelFilter($this->objMetaModel);
             $objFilterRule->addChild($objSubFilter);
             foreach ($arrFilter['childs'] as $arrChild) {
                 $this->calculateSubfilter($arrChild, $objSubFilter);
             }
             break;
         case '=':
         case '>':
         case '<':
             $objFilterRule = null;
             if ($objAttribute) {
                 switch ($arrFilter['operation']) {
                     case '=':
                         $objFilterRule = new MetaModelFilterRuleSearchAttribute($objAttribute, $arrFilter['value'], $this->objMetaModel->getAvailableLanguages());
                         break;
                     case '>':
                         $objFilterRule = new MetaModelFilterRuleFilterAttributeGreaterThan($objAttribute, $arrFilter['value']);
                         break;
                     case '<':
                         $objFilterRule = new MetaModelFilterRuleFilterAttributeLessThan($objAttribute, $arrFilter['value']);
                         break;
                 }
             } else {
                 if (Database::getInstance()->fieldExists($arrFilter['property'], $this->objMetaModel->getTableName())) {
                     // system column?
                     $objFilterRule = new MetaModelFilterRuleSimpleQuery(sprintf('SELECT id FROM %s WHERE %s %s %s', $this->objMetaModel->getTableName(), $arrFilter['property'], $arrFilter['operation'], $arrFilter['value']));
                 }
             }
             if (!$objFilterRule) {
                 throw new Exception('Error processing filter array - unknown property ' . var_export($arrFilter['property'], true), 1);
             }
             $objFilter->addFilterRule($objFilterRule);
             break;
         case 'IN':
             // rewrite the IN operation to a rephrased term: "(x=a) OR (x=b) OR ..."
             $arrSubRules = array();
             foreach ($arrFilter['value'] as $varValue) {
                 $arrSubRules[] = array('property' => $arrFilter['property'], 'operation' => '=', 'value' => $varValue);
             }
             $this->calculateSubfilter(array('operation' => 'OR', 'childs' => $arrSubRules), $objFilter);
             break;
         case 'LIKE':
             $objFilterRule = null;
             if ($objAttribute) {
                 $objFilterRule = new MetaModelFilterRuleSearchAttribute($objAttribute, $arrFilter['value'], $this->objMetaModel->getAvailableLanguages());
             } else {
                 if (Database::getInstance()->fieldExists($arrFilter['property'], $this->objMetaModel->getTableName())) {
                     // system column?
                     $objFilterRule = new MetaModelFilterRuleSimpleQuery(sprintf('SELECT id FROM %s WHERE %s LIKE ?', $this->objMetaModel->getTableName(), $arrFilter['property']), array($arrFilter['value']));
                 }
             }
             if (!$objFilterRule) {
                 throw new Exception('Error processing filter array - unknown property ' . var_export($arrFilter['property'], true), 1);
             }
             $objFilter->addFilterRule($objFilterRule);
             break;
         default:
             throw new Exception('Error processing filter array - unknown operation ' . var_export($arrFilter, true), 1);
     }
 }
Пример #7
0
 /**
  * Add additional filter rules to the list on the fly.
  *
  * @param IMetaModelFilterRule $objFilterRule
  *
  * @return MetaModelList
  */
 public function addFilterRule($objFilterRule)
 {
     if (!$this->objFilter) {
         $this->objFilter = $this->objMetaModel->getEmptyFilter();
     }
     $this->objFilter->addFilterRule($objFilterRule);
     return $this;
 }
Пример #8
0
 /**
  * Narrow down the list of Ids that match the given filter.
  *
  * @param IMetaModelFilter $objFilter
  *
  * @return array all matching Ids.
  */
 protected function getMatchingIds($objFilter)
 {
     if ($objFilter) {
         $arrFilteredIds = $objFilter->getMatchingIds();
         if ($arrFilteredIds !== NULL) {
             return $arrFilteredIds;
         }
     }
     // either no filter object or all ids allowed => return all ids.
     // if no id filter is passed, we assume all ids are provided.
     $objDB = Database::getInstance();
     $objRow = $objDB->execute('SELECT id FROM ' . $this->getTableName());
     return $objRow->fetchEach('id');
 }