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