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); } }
/** * 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; }
/** * 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'); }