Skip to content

Commit

Permalink
+ added object bricks and extended embed mechanism
Browse files Browse the repository at this point in the history
  • Loading branch information
daves-weblab committed Mar 13, 2018
1 parent ec64295 commit 5d21d28
Show file tree
Hide file tree
Showing 22 changed files with 428 additions and 40 deletions.
13 changes: 12 additions & 1 deletion src/RestBundle/Config/Config.php
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,18 @@ public function getViewDefinitionForObject(string $name, string $view = "default
*/
public function getViewDefinitionForFieldCollection(string $name, string $view = "default")
{
return $this->getViewDefinition("fieldCollections", $name, $view);
return $this->getViewDefinition("fieldcollections", $name, $view);
}

/**
* @param string $name
* @param string $view
*
* @return ViewDefinition|null
*/
public function getViewDefinitionForObjectbrick(string $name, string $view = "default")
{
return $this->getViewDefinition("objectbrick", $name, $view);
}

/**
Expand Down
3 changes: 1 addition & 2 deletions src/RestBundle/Data/DataType.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,7 @@ public function __construct(Config $config)
"hotspotimage",
"video",
"user",
"fieldcollections",
"objectbricks"
"fieldcollections"
], $dataType->get("relationTypes", []));
}

Expand Down
19 changes: 14 additions & 5 deletions src/RestBundle/DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ public function getConfigTreeBuilder()
$this->addComputeds($rootNode);

$this->addObjects($rootNode);
$this->addFieldCollections($rootNode);
// todo $this->addObjectBricks($rootNode);
$this->addFieldcollections($rootNode);
$this->addObjectbricks($rootNode);
$this->addAssets($rootNode);
// todo $this->addDocuments($rootNode);

Expand Down Expand Up @@ -111,12 +111,21 @@ protected function addObjects(ArrayNodeDefinition $node)
->end();
}

protected function addFieldCollections(ArrayNodeDefinition $node)
protected function addFieldcollections(ArrayNodeDefinition $node)
{
$node
->children()
->booleanNode("embedFieldcollections")->defaultFalse()->end()
->variableNode("fieldCollections")->end()
->booleanNode("embedFieldcollections")->defaultFalse()->end()
->variableNode("fieldcollections")->end()
->end();
}

protected function addObjectbricks(ArrayNodeDefinition $node)
{
$node
->children()
->booleanNode("embedObjectbricks")->defaultFalse()->end()
->variableNode("objectbricks")->end()
->end();
}

Expand Down
12 changes: 10 additions & 2 deletions src/RestBundle/Factory/Factory.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,14 @@
use DavesWeblab\RestBundle\Normalizer\AssetNormalizer;
use DavesWeblab\RestBundle\Normalizer\FieldCollectionNormalizer;
use DavesWeblab\RestBundle\Normalizer\NormalizerInterface;
use DavesWeblab\RestBundle\Normalizer\ObjectbrickFieldNormalizer;
use DavesWeblab\RestBundle\Normalizer\ObjectbrickNormalizer;
use DavesWeblab\RestBundle\Normalizer\ObjectNormalizer;
use DavesWeblab\RestBundle\Normalizer\Transformer\DateTransformer;
use DavesWeblab\RestBundle\Normalizer\Transformer\FieldCollectionAsIdTransformer;
use DavesWeblab\RestBundle\Normalizer\Transformer\MultiselectTransformer;
use DavesWeblab\RestBundle\Normalizer\Transformer\ObjectBrickAsIdTransformer;
use DavesWeblab\RestBundle\Normalizer\Transformer\ObjectbrickTransformer;
use DavesWeblab\RestBundle\Normalizer\Transformer\RelationAsIdTransformer;
use DavesWeblab\RestBundle\Normalizer\Transformer\Transformer;
use DavesWeblab\RestBundle\Property\Computed;
Expand Down Expand Up @@ -71,6 +75,8 @@ public function __construct(DataType $dataType, Config $config)
$normalizers = array_merge([
ObjectNormalizer::class,
FieldCollectionNormalizer::class,
ObjectbrickFieldNormalizer::class,
ObjectbrickNormalizer::class,
AssetNormalizer::class
], $normalization->get("normalizer", []));

Expand All @@ -82,10 +88,12 @@ public function __construct(DataType $dataType, Config $config)
* build normalizer transformers
*/
$normalizeTransformers = array_merge([
RelationAsIdTransformer::class,
FieldCollectionAsIdTransformer::class,
ObjectbrickTransformer::class,
ObjectBrickAsIdTransformer::class,
DateTransformer::class,
MultiselectTransformer::class
MultiselectTransformer::class,
RelationAsIdTransformer::class
], $normalization->get("transformer", []));

foreach ($normalizeTransformers as $transformer) {
Expand Down
9 changes: 9 additions & 0 deletions src/RestBundle/Normalizer/AssetNormalizer.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,15 @@ public function getSupportedAttributes($data, ContextInterface $context)
return array_merge($defaultAttributes, $viewConfig->getSupportedAttributes());
}

/**
* @param array $attributes
* @return array|string[]
*/
public function removeUnsupportedAttributes(array $attributes)
{
return $attributes;
}

/**
* @param Asset $data
* @param array $config
Expand Down
9 changes: 9 additions & 0 deletions src/RestBundle/Normalizer/FieldCollectionNormalizer.php
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,15 @@ public function getSupportedAttributes($data, ContextInterface $context)
return $attributes;
}

/**
* @param array $attributes
* @return array|string[]
*/
public function removeUnsupportedAttributes(array $attributes)
{
return $attributes;
}

/**
* @param AbstractData $data
* @param string $attribute
Expand Down
2 changes: 1 addition & 1 deletion src/RestBundle/Normalizer/NormalizedValue.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public function __construct($value, $transformed, $config = null, $stopNormaliza
$this->config = $config;
$this->stopNormalization = $stopNormalization;
$this->isRelationType = $isRelation;
$this->embed = $isEmbed;
$this->embed = (bool) $isEmbed;
}

/**
Expand Down
7 changes: 7 additions & 0 deletions src/RestBundle/Normalizer/NormalizerInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,13 @@ public function supports($data);
*/
public function getSupportedAttributes($data, ContextInterface $context);

/**
* @param string[] $attributes
*
* @return string[]
*/
public function removeUnsupportedAttributes(array $attributes);

/**
* @param mixed $data
* @param string $attribute
Expand Down
9 changes: 9 additions & 0 deletions src/RestBundle/Normalizer/ObjectNormalizer.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,15 @@ public function getSupportedAttributes($data, ContextInterface $context)
return $attributes;
}

/**
* @param array $attributes
* @return array|string[]
*/
public function removeUnsupportedAttributes(array $attributes)
{
return $attributes;
}

/**
* @param Concrete $data
* @param string $attribute
Expand Down
68 changes: 68 additions & 0 deletions src/RestBundle/Normalizer/ObjectbrickFieldNormalizer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
<?php

namespace DavesWeblab\RestBundle\Normalizer;

use DavesWeblab\RestBundle\Serializer\Context\ContextInterface;
use Pimcore\Model\DataObject\Objectbrick;
use Pimcore\Model\DataObject\Objectbrick\Data\AbstractData;

class ObjectbrickFieldNormalizer implements NormalizerInterface
{
/**
* @param mixed $data
*
* @return bool
*/
public function supports($data)
{
return $data instanceof Objectbrick;
}

/**
* @param Objectbrick $data
* @param ContextInterface $context
*
* @return string[]
*/
public function getSupportedAttributes($data, ContextInterface $context)
{
return $data->getAllowedBrickTypes();
}

/**
* @param array $attributes
* @return array|string[]
*/
public function removeUnsupportedAttributes(array $attributes)
{
$unsupported = ["id"];
return array_filter($attributes, function ($attribute) use ($unsupported) {
return !in_array($attribute, $unsupported);
});
}

/**
* @param AbstractData $data
* @param string $attribute
* @param ContextInterface $context
*
* @param array|null $config
* @return NormalizedValue
*/
public function getAttribute($data, string $attribute, ContextInterface $context, array $config = null)
{
$getter = "get" . ucfirst($attribute);

if (!method_exists($data, $getter)) {
return null;
}

$value = $data->$getter();

return $context->buildNormalizedValueFromFieldDefinition(
$value,
null,
$data
);
}
}
106 changes: 106 additions & 0 deletions src/RestBundle/Normalizer/ObjectbrickNormalizer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
<?php

namespace DavesWeblab\RestBundle\Normalizer;

use DavesWeblab\RestBundle\Normalizer\Transformer\ObjectBrickAsIdTransformer;
use DavesWeblab\RestBundle\Serializer\Context\ContextInterface;
use Pimcore\Model\DataObject\ClassDefinition\Data;
use Pimcore\Model\DataObject\Objectbrick\Data\AbstractData;
use Pimcore\Model\DataObject\Objectbrick\Definition;

class ObjectbrickNormalizer implements NormalizerInterface
{
/**
* @param mixed $data
*
* @return bool
*/
public function supports($data)
{
return $data instanceof AbstractData;
}

/**
* @param AbstractData $data
* @param ContextInterface $context
*
* @return string[]
*/
public function getSupportedAttributes($data, ContextInterface $context)
{
$viewDefinition = $context->getConfig()->getViewDefinitionForObjectbrick($data->getType());

if (!$viewDefinition->isEmpty()) {
return $viewDefinition->getSupportedAttributes();
}

$attributes = [];

/**
* @var Definition $definition
*/
$definition = $data->getDefinition();

/**
* @var Data $fieldDefinition
*/
foreach ($definition->getFieldDefinitions() as $fieldDefinition) {
$attributes[] = $fieldDefinition->getName();
}

return $attributes;
}

/**
* @param array $attributes
* @return array|string[]
*/
public function removeUnsupportedAttributes(array $attributes)
{
return $attributes;
}

/**
* @param AbstractData $data
* @param string $attribute
* @param ContextInterface $context
*
* @param array|null $config
* @return NormalizedValue
*/
public function getAttribute($data, string $attribute, ContextInterface $context, array $config = null)
{
if ($attribute == "id") {
$id = ObjectBrickAsIdTransformer::transformObjectbrickId($data);

return new NormalizedValue($id, $id);
}

$viewConfig = $context->getConfig()->getViewDefinitionForFieldCollection($data->getType());

if ($viewConfig->isMappedAttribute($attribute)) {
$attribute = $viewConfig->getMappedAttribute($attribute);
}

/**
* @var Definition $definition
*/
$definition = $data->getDefinition();
$fieldDefinition = $definition->getFieldDefinition($attribute) ?: null;

$getter = "get" . ucfirst($attribute);

if (!method_exists($data, $getter)) {
return null;
}

$value = $data->$getter();

return $context->buildNormalizedValueFromFieldDefinition(
$value,
$fieldDefinition,
$data,
$viewConfig->getAttributeConfig($attribute)
);
}
}
Loading

0 comments on commit 5d21d28

Please sign in to comment.