Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[PimcoreBundle] fix dynamic dropdown extensions #1337

Merged
merged 4 commits into from
Apr 3, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
119 changes: 115 additions & 4 deletions src/CoreShop/Bundle/PimcoreBundle/CoreExtension/DynamicDropdown.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,19 @@

namespace CoreShop\Bundle\PimcoreBundle\CoreExtension;

use Pimcore\Model\Asset;
use Pimcore\Model\DataObject;
use Pimcore\Model\DataObject\Service;
use Pimcore\Model\Document;
use Pimcore\Model\Element;

class DynamicDropdown extends DataObject\ClassDefinition\Data\ManyToOneRelation
class DynamicDropdown
extends DataObject\ClassDefinition\Data\Relations\AbstractRelations
implements DataObject\ClassDefinition\Data\QueryResourcePersistenceAwareInterface
{
use DataObject\ClassDefinition\Data\Extension\Relation;
use DataObject\ClassDefinition\Data\Extension\QueryColumnType;
use DataObject\ClassDefinition\Data\Relations\AllowObjectRelationTrait;

/**
* Static type of this element.
*
Expand Down Expand Up @@ -168,9 +175,113 @@ public function setOnlyPublished($onlyPublished)
}

/**
* @return null|int
* @param DataObject\Concrete|DataObject\Localizedfield|DataObject\Objectbrick\Data\AbstractData|DataObject\Fieldcollection\Data\AbstractData $object
* @param array $params
*
* @return null|Element\ElementInterface
*/
public function preGetData($object, $params = [])
{
$data = null;
if ($object instanceof DataObject\Concrete) {
$data = $object->getObjectVar($this->getName());

if (!$object->isLazyKeyLoaded($this->getName())) {
$data = $this->load($object);

$object->setObjectVar($this->getName(), $data);
$this->markLazyloadedFieldAsLoaded($object);
}
} elseif ($object instanceof DataObject\Localizedfield) {
$data = $params['data'];
} elseif ($object instanceof DataObject\Fieldcollection\Data\AbstractData) {
parent::loadLazyFieldcollectionField($object);
$data = $object->getObjectVar($this->getName());
} elseif ($object instanceof DataObject\Objectbrick\Data\AbstractData) {
parent::loadLazyBrickField($object);
$data = $object->getObjectVar($this->getName());
}

if (DataObject\AbstractObject::doHideUnpublished() && ($data instanceof Element\ElementInterface)) {
if (!Element\Service::isPublished($data)) {
return null;
}
}

return $data;
}

/**
* @inheritdoc
*/
public function prepareDataForPersistence($data, $object = null, $params = [])
{
if ($data instanceof Element\ElementInterface) {
$type = Element\Service::getType($data);
$id = $data->getId();

return [[
'dest_id' => $id,
'type' => $type,
'fieldname' => $this->getName()
]];
}

return null;
}

/**
* @see QueryResourcePersistenceAwareInterface::getDataForQueryResource
*
* @param Asset|Document|DataObject\AbstractObject $data
* @param null|DataObject\AbstractObject $object
* @param mixed $params
*
* @return array
*/
public function getDataForQueryResource($data, $object = null, $params = [])
{
$rData = $this->prepareDataForPersistence($data, $object, $params);
$return = [];

$return[$this->getName() . '__id'] = isset($rData[0]['dest_id']) ? $rData[0]['dest_id'] : null;
$return[$this->getName() . '__type'] = isset($rData[0]['type']) ? $rData[0]['type'] : null;

return $return;
}

/**
* @inheritdoc
*/
public function loadData($data, $object = null, $params = [])
{
// data from relation table
$data = is_array($data) ? $data : [];
$data = current($data);

$result = [
'dirty' => false,
'data' => null
];

if (!empty($data['dest_id']) && !empty($data['type'])) {
$element = Element\Service::getElementById($data['type'], $data['dest_id']);
if ($element instanceof Element\ElementInterface) {
$result['data'] = $element;
} else {
$result['dirty'] = true;
}
}

return $result;
}

/**
* {@inheritdoc}
*
* @return int|null
*/
public function getDataForEditmode($data, $object = null, $params = array())
public function getDataForEditmode($data, $object = null, $params = [])
{
if ($data) {
return $data->getId();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,17 @@

namespace CoreShop\Bundle\PimcoreBundle\CoreExtension;

use Pimcore\Model\DataObject\ClassDefinition\Data\ManyToManyObjectRelation;
use Pimcore\Model\DataObject;
use Pimcore\Model\Element\Service;

class DynamicDropdownMultiple extends ManyToManyObjectRelation
class DynamicDropdownMultiple extends
DataObject\ClassDefinition\Data\Relations\AbstractRelations
implements DataObject\ClassDefinition\Data\QueryResourcePersistenceAwareInterface
{
use DataObject\ClassDefinition\Data\Extension\Relation;
use DataObject\ClassDefinition\Data\Extension\QueryColumnType;
use DataObject\ClassDefinition\Data\Relations\AllowObjectRelationTrait;

/**
* Static type of this element.
*
Expand Down Expand Up @@ -143,4 +150,187 @@ public function getObjectsAllowed()
{
return true;
}

/**
* @param DataObject\Concrete|DataObject\Localizedfield|DataObject\Objectbrick\Data\AbstractData|DataObject\Fieldcollection\Data\AbstractData $object
* @param array $params
*
* @return array
*/
public function preGetData($object, $params = [])
{
$data = null;
if ($object instanceof DataObject\Concrete) {
$data = $object->getObjectVar($this->getName());
if (!$object->isLazyKeyLoaded($this->getName())) {
$data = $this->load($object);

$object->setObjectVar($this->getName(), $data);
$this->markLazyloadedFieldAsLoaded($object);
}
} elseif ($object instanceof DataObject\Localizedfield) {
$data = $params['data'];
} elseif ($object instanceof DataObject\Fieldcollection\Data\AbstractData) {
parent::loadLazyFieldcollectionField($object);
$data = $object->getObjectVar($this->getName());
} elseif ($object instanceof DataObject\Objectbrick\Data\AbstractData) {
parent::loadLazyBrickField($object);
$data = $object->getObjectVar($this->getName());
}

if (DataObject\AbstractObject::doHideUnpublished() and is_array($data)) {
$publishedList = [];
foreach ($data as $listElement) {
if (Service::isPublished($listElement)) {
$publishedList[] = $listElement;
}
}

return $publishedList;
}

return is_array($data) ? $data : [];
}

/**
* @see Data::getDataFromEditmode
*
* @param array $data
* @param null|DataObject\AbstractObject $object
* @param mixed $params
*
* @return array
*/
public function getDataFromEditmode($data, $object = null, $params = [])
{
if ($data === null || $data === false) {
return [];
}

$objects = [];
if (is_array($data) && count($data) > 0) {
foreach ($data as $ob) {
$o = DataObject::getById($ob['id']);
if ($o) {
$objects[] = $o;
}
}
}
//must return array if data shall be set
return $objects;
}

/**
* @see Data::getDataForEditmode
*
* @param array $data
* @param null|DataObject\AbstractObject $object
* @param mixed $params
*
* @return array
*/
public function getDataForEditmode($data, $object = null, $params = [])
{
$return = [];

// add data
if (is_array($data) && count($data) > 0) {
foreach ($data as $referencedObject) {
if ($referencedObject instanceof DataObject\Concrete) {
$return[] = $referencedObject->getId();
}
}
}

return $return;
}

/**
* @inheritdoc
*/
public function prepareDataForPersistence($data, $object = null, $params = [])
{
$return = [];

if (is_array($data) && count($data) > 0) {
$counter = 1;
foreach ($data as $object) {
if ($object instanceof DataObject\Concrete) {
$return[] = [
'dest_id' => $object->getId(),
'type' => 'object',
'fieldname' => $this->getName(),
'index' => $counter
];
}
$counter++;
}

return $return;
} elseif (is_array($data) and count($data) === 0) {
//give empty array if data was not null
return [];
} else {
//return null if data was null - this indicates data was not loaded
return null;
}
}

/**
* @see QueryResourcePersistenceAwareInterface::getDataForQueryResource
*
* @param array $data
* @param null|DataObject\AbstractObject $object
* @param mixed $params
*
* @throws \Exception
*
* @return string|null
*/
public function getDataForQueryResource($data, $object = null, $params = [])
{
//return null when data is not set
if (!$data) {
return null;
}

$ids = [];

if (is_array($data) && count($data) > 0) {
foreach ($data as $object) {
if ($object instanceof DataObject\Concrete) {
$ids[] = $object->getId();
}
}

return ',' . implode(',', $ids) . ',';
} elseif (is_array($data) && count($data) === 0) {
return '';
} else {
throw new \Exception('invalid data passed to getDataForQueryResource - must be array and it is: ' . print_r($data, true));
}
}

/**
* @inheritdoc
*/
public function loadData($data, $object = null, $params = [])
{
$objects = [
'dirty' => false,
'data' => []
];
if (is_array($data) && count($data) > 0) {
foreach ($data as $object) {
$o = DataObject::getById($object['dest_id']);
if ($o instanceof DataObject\Concrete) {
$objects['data'][] = $o;
} else {
$objects['dirty'] = true;
}
}
}
//must return array - otherwise this means data is not loaded
return $objects;
}
}
Loading