Skip to content

Commit

Permalink
Support localized calculated fields in object bricks (#5390)
Browse files Browse the repository at this point in the history
* support localized calculated fields in object bricks

* support localized calculated fields in object bricks

* bugfix: localized calculated field in object class

* set brick container field as ownerName

* calculate value also if no real data fields are in localized field collection

* calculate value also if no real data fields are in localized field collection
  • Loading branch information
BlackbitDevs authored and weisswurstkanone committed Jan 2, 2020
1 parent 6e30f39 commit 6922566
Show file tree
Hide file tree
Showing 7 changed files with 95 additions and 57 deletions.
Expand Up @@ -632,7 +632,7 @@ private function getDataForField($object, $key, $fielddefinition, $objectFromVer

if ($fielddefinition instanceof DataObject\ClassDefinition\Data\CalculatedValue) {
$fieldData = new DataObject\Data\CalculatedValue($fielddefinition->getName());
$fieldData->setContextualData('object', null, null, null);
$fieldData->setContextualData('object', null, null, null, null, null, $fielddefinition);
$value = $fielddefinition->getDataForEditmode($fieldData, $object, ['objectFromVersion' => $objectFromVersion]);
} else {
$value = $fielddefinition->getDataForEditmode($fieldData, $object, ['objectFromVersion' => $objectFromVersion]);
Expand Down
Expand Up @@ -99,6 +99,7 @@ As said before, the richness of the context information depends on the location
| fieldName | the name of the attribute inside the brick |
| index | the name of the brick |
| keyDefinition | the calculated-value field definition |
| position | the language ("en", "de", ...) if calculated field is localized |


#### Fieldcollections
Expand Down
55 changes: 43 additions & 12 deletions models/DataObject/ClassDefinition/Data/CalculatedValue.php
Expand Up @@ -158,16 +158,16 @@ public function getDataForQueryResource($data, $object = null, $params = [])
/**
* @see Data::getDataForEditmode
*
* @param float $data
* @param null|Model\DataObject\AbstractObject $object
* @param mixed $params
* @param Model\DataObject\Data\CalculatedValue $data
* @param DataObject\Concrete $object
* @param array $params
*
* @return float
* @return string|null
*/
public function getDataForEditmode($data, $object = null, $params = [])
{
if ($data instanceof Model\DataObject\Data\CalculatedValue) {
$data = Model\DataObject\Service::getCalculatedFieldValueForEditMode($object, [], $data);
return Model\DataObject\Service::getCalculatedFieldValueForEditMode($object, $params, $data);
}

return $data;
Expand Down Expand Up @@ -303,9 +303,15 @@ public function getGetterCode($class)
$code .= "\t" . '$data' . " = new \\Pimcore\\Model\\DataObject\\Data\\CalculatedValue('" . $key . "');\n";
$code .= "\t" . '$data->setContextualData("object", null, null, null);' . "\n";

$code .= "\t" . '$data = Service::getCalculatedFieldValue($this, $data);' . "\n";
if($class instanceof DataObject\Objectbrick\Definition) {
$code .= "\t" . '$object = $this->getObject();' . "\n";
} else {
$code .= "\t" . '$object = $this;' . "\n";
}

$code .= "\t" . '$data = \\Pimcore\\Model\\DataObject\\Service::getCalculatedFieldValue($object, $data);' . "\n";
$code .= "\treturn " . '$data' . ";\n";
$code .= "\t" . "}\n\n";
$code .= "}\n\n";

return $code;
}
Expand Down Expand Up @@ -338,12 +344,30 @@ public function getGetterCodeLocalizedfields($class)
$code .= "\t\t" . '}' . "\n";
$code .= "\t" . '}' . "\n";

if($class instanceof DataObject\Objectbrick\Definition) {
$ownerType = 'objectbrick';
$index = $class->getKey();

$code .= "\t" . '$object = $this->getObject();' . "\n";
} else {
$ownerType = 'localizedfield';
$index = null;

$code .= "\t" . '$object = $this;' . "\n";
}

if($class instanceof DataObject\Fieldcollection\Definition) {
$code .= "\t" . '$fieldDefinition = $this->getDefinition()->getFieldDefinition("localizedfields")->getFieldDefinition("'.$key.'");' . "\n";
} else {
$code .= "\t" . '$fieldDefinition = $this->getClass()->getFieldDefinition("localizedfields")->getFieldDefinition("'.$key.'");' . "\n";
}

$code .= "\t" . '$data' . " = new \\Pimcore\\Model\\DataObject\\Data\\CalculatedValue('" . $key . "');\n";
$code .= "\t" . '$data->setContextualData("localizedfield", "localizedfields", null, $language);' . "\n";
$code .= "\t" . '$data->setContextualData("'.$ownerType.'", $this->getFieldname(), '.($index===null?'null':'"'.$index.'"').', $language, null, null, $fieldDefinition);' . "\n";

$code .= "\t" . '$data = Service::getCalculatedFieldValue($this, $data);' . "\n";
$code .= "\t" . '$data = \\Pimcore\\Model\\DataObject\\Service::getCalculatedFieldValue($object, $data);' . "\n";
$code .= "\treturn " . '$data' . ";\n";
$code .= "\t" . "}\n\n";
$code .= "}\n\n";

return $code;
}
Expand Down Expand Up @@ -373,7 +397,7 @@ public function getGetterCodeObjectbrick($brickClass)

$code .= "\t" . '$data = DataObject\Service::getCalculatedFieldValue($this->getObject(), $data);' . "\n";
$code .= "\treturn " . '$data' . ";\n";
$code .= "\t" . "}\n\n";
$code .= "}\n\n";

return $code;
}
Expand Down Expand Up @@ -495,11 +519,18 @@ public function getSetterCodeFieldcollection($fieldcollectionDefinition)
public function getSetterCodeLocalizedfields($class)
{
$key = $this->getName();
if ($class instanceof DataObject\Objectbrick\Definition) {
$classname = 'Objectbrick\\Data\\' . ucfirst($class->getKey());
} elseif ($class instanceof DataObject\Fieldcollection\Definition) {
$classname = 'FieldCollection\\Data\\' . ucfirst($class->getKey());
} else {
$classname = $class->getName();
}

$code = '/**' . "\n";
$code .= '* Set ' . str_replace(['/**', '*/', '//'], '', $this->getName()) . ' - ' . str_replace(['/**', '*/', '//'], '', $this->getTitle()) . "\n";
$code .= '* @param ' . $this->getPhpdocType() . ' $' . $key . "\n";
$code .= '* @return \\Pimcore\\Model\\DataObject\\' . ucfirst($class->getName()) . "\n";
$code .= '* @return \\Pimcore\\Model\\DataObject\\' . ucfirst($classname) . "\n";
$code .= '*/' . "\n";
$code .= 'public function set' . ucfirst($key) . ' (' . '$' . $key . ', $language = null) {' . "\n";

Expand Down
13 changes: 8 additions & 5 deletions models/DataObject/ClassDefinition/Data/Localizedfields.php
Expand Up @@ -121,30 +121,33 @@ class Localizedfields extends Data implements CustomResourcePersistingInterface
/**
* @see Data::getDataForEditmode
*
* @param string $data
* @param DataObject\Localizedfield $localizedField
* @param null|Model\DataObject\AbstractObject $object
* @param mixed $params
*
* @return array
*/
public function getDataForEditmode($data, $object = null, $params = [])
public function getDataForEditmode($localizedField, $object = null, $params = [])
{
$fieldData = [];
$metaData = [];

if (!$data instanceof DataObject\Localizedfield) {
if (!$localizedField instanceof DataObject\Localizedfield) {
return [];
}

$result = $this->doGetDataForEditMode($data, $object, $fieldData, $metaData, 1, $params);
$result = $this->doGetDataForEditMode($localizedField, $object, $fieldData, $metaData, 1, $params);

// replace the real data with the data for the editmode
foreach ($result['data'] as $language => &$data) {
foreach ($data as $key => &$value) {
$fieldDefinition = $this->getFielddefinition($key);
if ($fieldDefinition instanceof CalculatedValue) {
$childData = new DataObject\Data\CalculatedValue($fieldDefinition->getName());
$childData->setContextualData('localizedfield', $this->getName(), null, $language);
$ownerType = $params['context']['containerType'] ?? 'localizedfield';
$ownerName = $params['fieldname'] ?? $this->getName();
$index = $params['context']['containerKey'] ?? null;
$childData->setContextualData($ownerType, $ownerName, $index, $language, null, null, $fieldDefinition);
$value = $fieldDefinition->getDataForEditmode($childData, $object, $params);
} else {
$value = $fieldDefinition->getDataForEditmode($value, $object, $params);
Expand Down
32 changes: 14 additions & 18 deletions models/DataObject/ClassDefinition/Data/Objectbricks.php
Expand Up @@ -20,6 +20,7 @@
use Pimcore\Model;
use Pimcore\Model\DataObject;
use Pimcore\Model\DataObject\ClassDefinition\Data;
use Pimcore\Model\DataObject\Objectbrick;
use Pimcore\Model\Webservice;
use Pimcore\Tool;

Expand All @@ -37,7 +38,7 @@ class Objectbricks extends Data implements CustomResourcePersistingInterface
*
* @var string
*/
public $phpdocType = '\\Pimcore\\Model\\DataObject\\Objectbrick';
public $phpdocType = Objectbrick::class;

/**
* @var array
Expand Down Expand Up @@ -110,11 +111,11 @@ public function getDataForEditmode($data, $object = null, $params = [])
$getter = 'get' . ucfirst($allowedBrickType);
$params = [
'objectFromVersion' => $params['objectFromVersion'],
'context' => [
'context' => [
'containerType' => 'objectbrick',
'containerKey' => $allowedBrickType],
'fieldname' => $this->getName()

'containerKey' => $allowedBrickType,
],
'fieldname' => $this->getName(),
];

$editmodeData[] = $this->doGetDataForEditmode($getter, $data, $params, $allowedBrickType);
Expand Down Expand Up @@ -173,13 +174,11 @@ private function doGetDataForEditmode($getter, $data, $params, $allowedBrickType
$calculatedChilds = [];
self::collectCalculatedValueItems($collectionDef->getFieldDefinitions(), $calculatedChilds);

if ($calculatedChilds) {
foreach ($calculatedChilds as $fd) {
$fieldData = new DataObject\Data\CalculatedValue($fd->getName());
$fieldData->setContextualData('objectbrick', $this->getName(), $allowedBrickType, $fd->getName(), null, null, $fd);
$fieldData = $fd->getDataForEditmode($fieldData, $data->getObject(), $params);
$brickData[$fd->getName()] = $fieldData;
}
foreach ($calculatedChilds as $fd) {
$fieldData = new DataObject\Data\CalculatedValue($fd->getName());
$fieldData->setContextualData('objectbrick', $this->getName(), $allowedBrickType, $fd->getName(), null, null, $fd);
$fieldData = $fd->getDataForEditmode($fieldData, $data->getObject(), $params);
$brickData[$fd->getName()] = $fieldData;
}

$brickDefinition = DataObject\Objectbrick\Definition::getByKey($allowedBrickType);
Expand Down Expand Up @@ -244,7 +243,7 @@ private function getDataForField($item, $key, $fielddefinition, $level, $baseObj
}
$data = [];

if ($fielddefinition instanceof DataObject\ClassDefinition\Data\Href) {
if ($fielddefinition instanceof ManyToOneRelation) {
$data = $relations[0];
} else {
foreach ($relations as $rel) {
Expand Down Expand Up @@ -1046,18 +1045,15 @@ public function classSaved($class, $params = [])

/**
* @param DataObject\ClassDefinition\Data[] $container
* @param DataObject\ClassDefinition\Data[] $list
* @param CalculatedValue[] $list
*/
public static function collectCalculatedValueItems($container, &$list = [])
{
if (is_array($container)) {
/** @var $childDef DataObject\ClassDefinition\Data */
foreach ($container as $childDef) {
if ($childDef instanceof Model\DataObject\ClassDefinition\Data\CalculatedValue) {
$list[] = $childDef;
} else {
if (method_exists($childDef, 'getFieldDefinitions')) {
self::collectCalculatedValueItems($childDef->getFieldDefinitions(), $list);
}
}
}
}
Expand Down
10 changes: 9 additions & 1 deletion models/DataObject/Localizedfield.php
Expand Up @@ -190,6 +190,14 @@ public function getInternalData($loadLazyFields = false)
$this->_loadedAllLazyData = true;
}

foreach($this->getFieldDefinitions($this->getContext(), ['suppressEnrichment' => true]) as $fieldDefinition) {
if($fieldDefinition instanceof Model\DataObject\ClassDefinition\Data\CalculatedValue) {
foreach (Tool::getValidLanguages() as $language) {
$this->setLocalizedValue($fieldDefinition->getName(), null, $language, false);
}
}
}

return $this->items;
}

Expand Down Expand Up @@ -387,7 +395,7 @@ public function getLocalizedValue($name, $language = null, $ignoreFallbackLangua

if ($fieldDefinition instanceof Model\DataObject\ClassDefinition\Data\CalculatedValue) {
$valueData = new Model\DataObject\Data\CalculatedValue($fieldDefinition->getName());
$valueData->setContextualData('localizedfield', 'localizedfields', null, $language);
$valueData->setContextualData('localizedfield', 'localizedfields', null, $language, null, null, $fieldDefinition);
$data = Service::getCalculatedFieldValue($this->getObject(), $valueData);

return $data;
Expand Down
39 changes: 19 additions & 20 deletions models/DataObject/Service.php
Expand Up @@ -1428,28 +1428,28 @@ public static function enrichLayoutPermissions(&$layout, $allowedView, $allowedE
}

/**
* @param $object
* @param Concrete $object
* @param array $params
* @param $data Model\DataObject\Data\CalculatedValue
*
* @return mixed|null
* @return string|null
*/
public static function getCalculatedFieldValueForEditMode($object, $params = [], $data)
{
if (!$data) {
return;
}

$fieldname = $data->getFieldname();
$ownerType = $data->getOwnerType();
$fd = null;
if ($ownerType === 'object') {
$fd = $object->getClass()->getFieldDefinition($fieldname);
} elseif ($ownerType === 'localizedfield') {
$fd = $object->getClass()->getFieldDefinition('localizedfields')->getFieldDefinition($fieldname);
} elseif ($ownerType === 'classificationstore') {
$fd = $data->getKeyDefinition();
} elseif ($ownerType === 'fieldcollection' || $ownerType === 'objectbrick') {
$fd = $data->getKeyDefinition();
$fd = $data->getKeyDefinition();

if($fd === null) {
if ($ownerType === 'object') {
$fd = $object->getClass()->getFieldDefinition($fieldname);
} elseif ($ownerType === 'localizedfield') {
$fd = $object->getClass()->getFieldDefinition('localizedfields')->getFieldDefinition($fieldname);
}
}

if (!$fd instanceof Model\DataObject\ClassDefinition\Data\CalculatedValue) {
Expand Down Expand Up @@ -1493,15 +1493,14 @@ public static function getCalculatedFieldValue($object, $data)
}
$fieldname = $data->getFieldname();
$ownerType = $data->getOwnerType();
$fd = null;
if ($ownerType === 'object') {
$fd = $object->getClass()->getFieldDefinition($fieldname);
} elseif ($ownerType === 'localizedfield') {
$fd = $object->getClass()->getFieldDefinition('localizedfields')->getFieldDefinition($fieldname);
} elseif ($ownerType === 'classificationstore') {
$fd = $data->getKeyDefinition();
} elseif ($ownerType === 'fieldcollection' || $ownerType === 'objectbrick') {
$fd = $data->getKeyDefinition();

$fd = $data->getKeyDefinition();
if($fd === null) {
if ($ownerType === 'object') {
$fd = $object->getClass()->getFieldDefinition($fieldname);
} elseif ($ownerType === 'localizedfield') {
$fd = $object->getClass()->getFieldDefinition('localizedfields')->getFieldDefinition($fieldname);
}
}

if (!$fd instanceof Model\DataObject\ClassDefinition\Data\CalculatedValue) {
Expand Down

0 comments on commit 6922566

Please sign in to comment.