public function gridProxyAction()
{
if ($this->getParam("language")) {
$this->setLanguage($this->getParam("language"), true);
}
if ($this->getParam("data")) {
if ($this->getParam("xaction") == "update") {
try {
$data = \Zend_Json::decode($this->getParam("data"));
// save
$object = Object::getById($data["id"]);
/** @var Object\ClassDefinition $class */
$class = $object->getClass();
if (!$object->isAllowed("publish")) {
throw new \Exception("Permission denied. You don't have the rights to save this object.");
}
$user = Tool\Admin::getCurrentUser();
if (!$user->isAdmin()) {
$languagePermissions = $object->getPermissions("lEdit", $user);
$languagePermissions = explode(",", $languagePermissions["lEdit"]);
}
$objectData = array();
foreach ($data as $key => $value) {
$parts = explode("~", $key);
if (substr($key, 0, 1) == "~") {
$type = $parts[1];
$field = $parts[2];
$keyid = $parts[3];
$getter = "get" . ucfirst($field);
$setter = "set" . ucfirst($field);
$keyValuePairs = $object->{$getter}();
if (!$keyValuePairs) {
$keyValuePairs = new Object\Data\KeyValue();
$keyValuePairs->setObjectId($object->getId());
$keyValuePairs->setClass($object->getClass());
}
$keyValuePairs->setPropertyWithId($keyid, $value, true);
$object->{$setter}($keyValuePairs);
} elseif (count($parts) > 1) {
$brickType = $parts[0];
$brickKey = $parts[1];
$brickField = Object\Service::getFieldForBrickType($object->getClass(), $brickType);
$fieldGetter = "get" . ucfirst($brickField);
$brickGetter = "get" . ucfirst($brickType);
$valueSetter = "set" . ucfirst($brickKey);
$brick = $object->{$fieldGetter}()->{$brickGetter}();
if (empty($brick)) {
$classname = "\\Pimcore\\Model\\Object\\Objectbrick\\Data\\" . ucfirst($brickType);
$brickSetter = "set" . ucfirst($brickType);
$brick = new $classname($object);
$object->{$fieldGetter}()->{$brickSetter}($brick);
}
$brick->{$valueSetter}($value);
} else {
if (!$user->isAdmin() && $languagePermissions) {
$fd = $class->getFieldDefinition($key);
if (!$fd) {
// try to get via localized fields
$localized = $class->getFieldDefinition("localizedfields");
if ($localized instanceof Object\ClassDefinition\Data\Localizedfields) {
$field = $localized->getFieldDefinition($key);
if ($field) {
$currentLocale = (string) \Zend_Registry::get("Zend_Locale");
if (!in_array($currentLocale, $languagePermissions)) {
continue;
}
}
}
}
}
$objectData[$key] = $value;
}
}
$object->setValues($objectData);
$object->save();
$this->_helper->json(array("data" => Object\Service::gridObjectData($object, $this->getParam("fields")), "success" => true));
} catch (\Exception $e) {
$this->_helper->json(array("success" => false, "message" => $e->getMessage()));
}
}
} else {
// get list of objects
$folder = Object::getById($this->getParam("folderId"));
$class = Object\ClassDefinition::getById($this->getParam("classId"));
$className = $class->getName();
$colMappings = array("filename" => "o_key", "fullpath" => array("o_path", "o_key"), "id" => "o_id", "published" => "o_published", "modificationDate" => "o_modificationDate", "creationDate" => "o_creationDate");
$start = 0;
$limit = 20;
$orderKey = "o_id";
$order = "ASC";
$fields = array();
$bricks = array();
if ($this->getParam("fields")) {
$fields = $this->getParam("fields");
foreach ($fields as $f) {
$parts = explode("~", $f);
$sub = substr($f, 0, 1);
if (substr($f, 0, 1) == "~") {
// $type = $parts[1];
// $field = $parts[2];
// $keyid = $parts[3];
// key value, ignore for now
} elseif (count($parts) > 1) {
$bricks[$parts[0]] = $parts[0];
}
}
}
if ($this->getParam("limit")) {
$limit = $this->getParam("limit");
}
if ($this->getParam("start")) {
$start = $this->getParam("start");
}
$sortingSettings = \Pimcore\Admin\Helper\QueryParams::extractSortingSettings($this->getAllParams());
if ($sortingSettings['order']) {
$order = $sortingSettings['order'];
}
if (strlen($sortingSettings['orderKey']) > 0) {
$orderKey = $sortingSettings['orderKey'];
if (!(substr($orderKey, 0, 1) == "~")) {
if (array_key_exists($orderKey, $colMappings)) {
$orderKey = $colMappings[$orderKey];
}
}
}
$listClass = "\\Pimcore\\Model\\Object\\" . ucfirst($className) . "\\Listing";
$conditionFilters = array();
if ($this->getParam("only_direct_children") == "true") {
$conditionFilters[] = "o_parentId = " . $folder->getId();
} else {
$conditionFilters[] = "(o_path = '" . $folder->getFullPath() . "' OR o_path LIKE '" . str_replace("//", "/", $folder->getFullPath() . "/") . "%')";
}
// create filter condition
if ($this->getParam("filter")) {
$conditionFilters[] = Object\Service::getFilterCondition($this->getParam("filter"), $class);
}
if ($this->getParam("condition")) {
$conditionFilters[] = "(" . $this->getParam("condition") . ")";
}
$list = new $listClass();
if (!empty($bricks)) {
foreach ($bricks as $b) {
$list->addObjectbrick($b);
}
}
$list->setCondition(implode(" AND ", $conditionFilters));
$list->setLimit($limit);
$list->setOffset($start);
$list->setOrder($order);
$list->setOrderKey($orderKey);
if ($class->getShowVariants()) {
$list->setObjectTypes([Object\AbstractObject::OBJECT_TYPE_OBJECT, Object\AbstractObject::OBJECT_TYPE_VARIANT]);
}
$list->load();
$objects = array();
foreach ($list->getObjects() as $object) {
$o = Object\Service::gridObjectData($object, $fields);
$objects[] = $o;
}
$this->_helper->json(array("data" => $objects, "success" => true, "total" => $list->getTotalCount()));
}
}