/** * * @param string $filterJson * @param ClassDefinition $class * @return string */ public static function getFilterCondition($filterJson, $class) { $systemFields = array("o_path", "o_key", "o_id", "o_published", "o_creationDate", "o_modificationDate", "o_fullpath"); // create filter condition $conditionPartsFilters = array(); if ($filterJson) { $db = \Pimcore\Db::get(); $filters = \Zend_Json::decode($filterJson); foreach ($filters as $filter) { $operator = "="; /** * @extjs */ $filterField = $filter["field"]; $filterOperator = $filter["comparison"]; if (\Pimcore\Tool\Admin::isExtJS6()) { $filterField = $filter["property"]; $filterOperator = $filter["operator"]; } if ($filter["type"] == "string") { $operator = "LIKE"; } else { if ($filter["type"] == "numeric") { if ($filterOperator == "lt") { $operator = "<"; } else { if ($filterOperator == "gt") { $operator = ">"; } else { if ($filterOperator == "eq") { $operator = "="; } } } } else { if ($filter["type"] == "date") { if ($filterOperator == "lt") { $operator = "<"; } else { if ($filterOperator == "gt") { $operator = ">"; } else { if ($filterOperator == "eq") { $operator = "="; } } } $filter["value"] = strtotime($filter["value"]); } else { if ($filter["type"] == "list") { $operator = "="; } else { if ($filter["type"] == "boolean") { $operator = "="; $filter["value"] = (int) $filter["value"]; } } } } } $field = $class->getFieldDefinition($filterField); $brickField = null; $brickType = null; if (!$field) { // if the definition doesn't exist check for a localized field $localized = $class->getFieldDefinition("localizedfields"); if ($localized instanceof ClassDefinition\Data\Localizedfields) { $field = $localized->getFieldDefinition($filterField); } //if the definition doesn't exist check for object brick $keyParts = explode("~", $filterField); if (substr($filterField, 0, 1) == "~") { // not needed for now // $type = $keyParts[1]; // $field = $keyParts[2]; // $keyid = $keyParts[3]; } else { if (count($keyParts) > 1) { $brickType = $keyParts[0]; $brickKey = $keyParts[1]; $key = self::getFieldForBrickType($class, $brickType); $field = $class->getFieldDefinition($key); $brickClass = Objectbrick\Definition::getByKey($brickType); $brickField = $brickClass->getFieldDefinition($brickKey); } } } if ($field instanceof ClassDefinition\Data\Objectbricks) { // custom field $db = \Pimcore\Db::get(); if (is_array($filter["value"])) { $fieldConditions = array(); foreach ($filter["value"] as $filterValue) { $fieldConditions[] = $db->getQuoteIdentifierSymbol() . $brickType . $db->getQuoteIdentifierSymbol() . "." . $brickField->getFilterCondition($filterValue, $operator); } $conditionPartsFilters[] = "(" . implode(" OR ", $fieldConditions) . ")"; } else { $conditionPartsFilters[] = $db->getQuoteIdentifierSymbol() . $brickType . $db->getQuoteIdentifierSymbol() . "." . $brickField->getFilterCondition($filter["value"], $operator); } } else { if ($field instanceof ClassDefinition\Data) { // custom field if (is_array($filter["value"])) { $fieldConditions = array(); foreach ($filter["value"] as $filterValue) { $fieldConditions[] = $field->getFilterCondition($filterValue, $operator); } $conditionPartsFilters[] = "(" . implode(" OR ", $fieldConditions) . ")"; } else { $conditionPartsFilters[] = $field->getFilterCondition($filter["value"], $operator); } } else { if (in_array("o_" . $filterField, $systemFields)) { // system field if ($filterField == "fullpath") { $conditionPartsFilters[] = "concat(o_path, o_key) " . $operator . " " . $db->quote("%" . $filter["value"] . "%"); } else { $conditionPartsFilters[] = "`o_" . $filterField . "` " . $operator . " " . $db->quote($filter["value"]); } } } } } } $conditionFilters = "1 = 1"; if (count($conditionPartsFilters) > 0) { $conditionFilters = "(" . implode(" AND ", $conditionPartsFilters) . ")"; } \Logger::log("ObjectController filter condition:" . $conditionFilters); return $conditionFilters; }