Skip to content

Commit

Permalink
Add snippet_selection Resolver (#32)
Browse files Browse the repository at this point in the history
  • Loading branch information
TheCadien authored Jul 23, 2020
1 parent 621d9f8 commit f556be6
Show file tree
Hide file tree
Showing 5 changed files with 483 additions and 8 deletions.
114 changes: 114 additions & 0 deletions Content/ContentTypeResolver/SnippetSelectionResolver.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
<?php

declare(strict_types=1);

/*
* This file is part of Sulu.
*
* (c) Sulu GmbH
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/

namespace Sulu\Bundle\HeadlessBundle\Content\ContentTypeResolver;

use Sulu\Bundle\HeadlessBundle\Content\ContentView;
use Sulu\Bundle\HeadlessBundle\Content\StructureResolverInterface;
use Sulu\Bundle\SnippetBundle\Document\SnippetDocument;
use Sulu\Bundle\SnippetBundle\Snippet\DefaultSnippetManagerInterface;
use Sulu\Bundle\SnippetBundle\Snippet\WrongSnippetTypeException;
use Sulu\Component\Content\Compat\PropertyInterface;
use Sulu\Component\Content\Compat\Structure\SnippetBridge;
use Sulu\Component\Content\Compat\Structure\StructureBridge;
use Sulu\Component\Content\Mapper\ContentMapperInterface;

class SnippetSelectionResolver implements ContentTypeResolverInterface
{
/**
* @var StructureResolverInterface
*/
private $structureResolver;

/**
* @var ContentMapperInterface
*/
private $contentMapper;

/**
* @var DefaultSnippetManagerInterface
*/
private $defaultSnippetManager;

public function __construct(
ContentMapperInterface $contentMapper,
StructureResolverInterface $structureResolver,
DefaultSnippetManagerInterface $defaultSnippetManager
) {
$this->contentMapper = $contentMapper;
$this->structureResolver = $structureResolver;
$this->defaultSnippetManager = $defaultSnippetManager;
}

public static function getContentType(): string
{
return 'snippet_selection';
}

/**
* {@inheritdoc}
*/
public function resolve($data, PropertyInterface $property, string $locale, array $attributes = []): ContentView
{
/** @var StructureBridge $structure */
$structure = $property->getStructure();
$webspaceKey = $structure->getWebspaceKey();
$shadowLocale = $structure->getIsShadow() ? $structure->getShadowBaseLanguage() : null;

$params = $property->getParams();
/** @var bool $loadExcerpt */
$loadExcerpt = isset($params['loadExcerpt']) ? $params['loadExcerpt']->getValue() : false;
/** @var string $defaultArea */
$defaultArea = isset($params['default']) ? $params['default']->getValue() : null;

$snippetIds = $data ?? [];
if (empty($snippetIds) && $defaultArea) {
$defaultSnippetId = $this->getDefaultSnippetId($webspaceKey, $defaultArea, $locale);
$snippetIds = $defaultSnippetId ? [$defaultSnippetId] : [];
}

$snippets = [];
foreach ($snippetIds as $snippetId) {
/** @var SnippetBridge $snippet */
$snippet = $this->contentMapper->load($snippetId, $webspaceKey, $locale);

if (!$snippet->getHasTranslation() && null !== $shadowLocale) {
/** @var SnippetBridge $snippet */
$snippet = $this->contentMapper->load($snippetId, $webspaceKey, $shadowLocale);
}

$snippet->setIsShadow(null !== $shadowLocale);
$snippet->setShadowBaseLanguage($shadowLocale);

$snippets[] = $this->structureResolver->resolve($snippet, $locale, $loadExcerpt);
}

return new ContentView($snippets, $data ?? []);
}

private function getDefaultSnippetId(string $webspaceKey, string $snippetArea, string $locale): ?string
{
try {
/** @var SnippetDocument|null $snippet */
$snippet = $this->defaultSnippetManager->load($webspaceKey, $snippetArea, $locale);
} catch (WrongSnippetTypeException $exception) {
return null;
}

if (!$snippet) {
return null;
}

return $snippet->getUuid();
}
}
20 changes: 13 additions & 7 deletions Content/StructureResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,20 @@ public function __construct(
/**
* @param StructureBridge $structure
*/
public function resolve(StructureInterface $structure, string $locale): array
{
public function resolve(
StructureInterface $structure,
string $locale,
bool $includeExtension = true
): array {
$data = $this->getStructureData($structure);
$data['extension'] = $this->resolveExtensionData(
$this->getExtensionData($structure),
$locale,
['webspaceKey' => $structure->getWebspaceKey()]
);

if ($includeExtension) {
$data['extension'] = $this->resolveExtensionData(
$this->getExtensionData($structure),
$locale,
['webspaceKey' => $structure->getWebspaceKey()]
);
}

foreach ($structure->getProperties(true) as $property) {
$contentView = $this->contentResolver->resolve(
Expand Down
6 changes: 5 additions & 1 deletion Content/StructureResolverInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,11 @@ interface StructureResolverInterface
/**
* @return mixed[]
*/
public function resolve(StructureInterface $structure, string $locale): array;
public function resolve(
StructureInterface $structure,
string $locale,
bool $includeExtension = true
): array;

/**
* @param string[] $propertyMap
Expand Down
12 changes: 12 additions & 0 deletions Resources/config/content-type-resolvers.xml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,18 @@
<tag name="sulu_headless.content_type_resolver"/>
</service>

<service
id="sulu_headless.content_resolver.snippet_selection"
class="Sulu\Bundle\HeadlessBundle\Content\ContentTypeResolver\SnippetSelectionResolver"
lazy="true"
>
<argument type="service" id="sulu.content.mapper"/>
<argument type="service" id="sulu_headless.structure_resolver"/>
<argument type="service" id="sulu_snippet.default_snippet.manager"/>

<tag name="sulu_headless.content_type_resolver"/>
</service>

<service
id="sulu_headless.content_resolver.single_contact_selection"
class="Sulu\Bundle\HeadlessBundle\Content\ContentTypeResolver\SingleContactSelectionResolver"
Expand Down
Loading

0 comments on commit f556be6

Please sign in to comment.