Skip to content

Commit

Permalink
Add DimensionContentQueryEnhancer service (#190)
Browse files Browse the repository at this point in the history
* Add DimensionContentQueryEnhancer service

* Fix DimensionContentQueryEnhancer

* Fix php-cs

* Add dimension content query enhancer

* Update dimension content query enhancer

* Fix PHP CS

* Adjustements for dimesion content query enhancer

* Update Content/Domain/Model/DimensionContentCollection.php

* Fix example repository select constants

Co-authored-by: nnatter <niklas.natter@gmail.com>
  • Loading branch information
alexander-schranz and niklasnatter committed Oct 4, 2021
1 parent 8d958cc commit 9fa38cb
Show file tree
Hide file tree
Showing 18 changed files with 1,579 additions and 89 deletions.
30 changes: 6 additions & 24 deletions Content/Domain/Model/DimensionContentCollection.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Criteria;
use Sulu\Component\Util\SortUtils;

/**
* @implements \IteratorAggregate<DimensionContentInterface>
Expand All @@ -26,16 +27,6 @@ class DimensionContentCollection implements \IteratorAggregate, DimensionContent
*/
private $dimensionContents;

/**
* @var DimensionContentInterface|null
*/
private $unlocalizedDimensionContent;

/**
* @var DimensionContentInterface|null
*/
private $localizedDimensionContent;

/**
* @var mixed[]
*/
Expand Down Expand Up @@ -63,23 +54,14 @@ public function __construct(
array $dimensionAttributes,
string $dimensionContentClass
) {
$this->dimensionContents = new ArrayCollection($dimensionContents);
$this->dimensionContentClass = $dimensionContentClass;
$this->defaultDimensionAttributes = $dimensionContentClass::getDefaultDimensionAttributes();
$this->dimensionAttributes = $dimensionContentClass::getEffectiveDimensionAttributes($dimensionAttributes);

$this->unlocalizedDimensionContent = $this->dimensionContents->filter(
function(DimensionContentInterface $dimensionContent) {
return null === $dimensionContent->getLocale();
}
)->first() ?: null;

$this->localizedDimensionContent = $this->dimensionContents->filter(
function(DimensionContentInterface $dimensionContent) {
return null !== $dimensionContent->getLocale();
}
)->first() ?: null;

$this->dimensionAttributes = $dimensionAttributes;
$this->dimensionContents = new ArrayCollection(
// dimension contents need to be sorted from most specific to least specific when they are merged
SortUtils::multisort($dimensionContents, \array_keys($this->dimensionAttributes), 'asc')
);
}

public function getDimensionContentClass(): string
Expand Down
7 changes: 7 additions & 0 deletions Content/Domain/Model/DimensionContentInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,11 @@ public function markAsMerged(): void;
* @return mixed[]
*/
public static function getDefaultDimensionAttributes(): array;

/**
* @param mixed[] $dimensionAttributes
*
* @return mixed[]
*/
public static function getEffectiveDimensionAttributes(array $dimensionAttributes): array;
}
15 changes: 15 additions & 0 deletions Content/Domain/Model/DimensionContentTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -67,4 +67,19 @@ public static function getDefaultDimensionAttributes(): array
'stage' => DimensionContentInterface::STAGE_DRAFT,
];
}

public static function getEffectiveDimensionAttributes(array $dimensionAttributes): array
{
$defaultValues = static::getDefaultDimensionAttributes();

// Ignore keys that are not part of the default attributes
$dimensionAttributes = \array_intersect_key($dimensionAttributes, $defaultValues);

$dimensionAttributes = \array_merge(
$defaultValues,
$dimensionAttributes
);

return $dimensionAttributes;
}
}

0 comments on commit 9fa38cb

Please sign in to comment.