From ab8e5e37bedc4128b465fbcc2a2c24759b068f12 Mon Sep 17 00:00:00 2001 From: Maciej Kobus Date: Wed, 22 Mar 2017 11:12:21 +0100 Subject: [PATCH] EZS-1431: Landing Page not editable after deleting embedded content --- src/Controller/BlockController.php | 139 ++++++++++++++++++++++++------------- 1 file changed, 89 insertions(+), 50 deletions(-) diff --git a/src/Controller/BlockController.php b/src/Controller/BlockController.php index 7684e78..46561b2 100644 --- a/src/Controller/BlockController.php +++ b/src/Controller/BlockController.php @@ -8,10 +8,12 @@ use DateTime; use eZ\Publish\API\Repository\ContentService; use eZ\Publish\API\Repository\ContentTypeService; +use eZ\Publish\Core\Base\Exceptions\NotFoundException; use EzSystems\LandingPageFieldTypeBundle\Enum\BlockCategory; use EzSystems\LandingPageFieldTypeBundle\Exception\BlockNotFoundException; use EzSystems\LandingPageFieldTypeBundle\Exception\BlockRenderException; use EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Converter\JSONConverter; +use EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Model\BlockType; use EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Model\BlockValue; use EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Model\PageService; use EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Type; @@ -20,50 +22,51 @@ use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; class BlockController { - /** @var BlockTypeRegistry */ + /** @var \EzSystems\LandingPageFieldTypeBundle\Registry\BlockTypeRegistry */ private $blockTypeRegistry; - /** @var EngineInterface */ + /** @var \Symfony\Bundle\FrameworkBundle\Templating\EngineInterface */ private $templating; - /** @var Logger */ + /** @var \Monolog\Logger */ private $logger; - /** @var ContentService */ + /** @var \eZ\Publish\API\Repository\ContentService */ private $contentService; - /** @var ContentTypeService */ + /** @var \eZ\Publish\API\Repository\ContentTypeService */ private $contentTypeService; /** @var string */ private $landingPageFieldTypeIdentifier = 'ezlandingpage'; - /** @var JSONConverter */ + /** @var \EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Converter\JSONConverter */ private $jsonConverter; - /** @var PageService */ + /** @var \EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Model\PageService */ private $pageService; /** @var array */ private $languages; - /** @var Type */ + /** @var \EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Type */ private $landingPageType; /** - * @param BlockTypeRegistry $blockTypeRegistry - * @param EngineInterface $templating - * @param Logger $logger - * @param ContentService $contentService - * @param ContentTypeService $contentTypeService - * @param JSONConverter $jsonConverter - * @param PageService $pageService - * @param array $languages - * @param Type $landingPageType + * @param \EzSystems\LandingPageFieldTypeBundle\Registry\BlockTypeRegistry $blockTypeRegistry + * @param \Symfony\Bundle\FrameworkBundle\Templating\EngineInterface $templating + * @param \Monolog\Logger $logger + * @param \eZ\Publish\API\Repository\ContentService $contentService + * @param \eZ\Publish\API\Repository\ContentTypeService $contentTypeService + * @param \EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Converter\JSONConverter $jsonConverter + * @param \EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Model\PageService $pageService + * @param array $languages + * @param \EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Type $landingPageType */ public function __construct( BlockTypeRegistry $blockTypeRegistry, @@ -88,7 +91,7 @@ public function __construct( } /** - * @param Request $request + * @param \Symfony\Component\HttpFoundation\Request $request * * @return \Symfony\Component\HttpFoundation\JsonResponse * @@ -129,28 +132,8 @@ public function previewBlockAction(Request $request) $view = $definition->getView($blockValue->getView()); $attributes = $blockValue->getAttributes(); - try { - $template = 'EzSystemsLandingPageFieldTypeBundle::block_preview.html.twig'; - $templateParameters = [ - 'type' => $blockValue->getType(), - 'view' => $view, - 'parameters' => array_merge( - ['lp_preview' => true], - $blockType->getTemplateParameters($blockValue) - ), - ]; - } catch (BlockRenderException $e) { - $this->logger->warning($blockValue->getType() . ' block preview rendering error: ' . $e->getMessage()); - - $template = 'EzSystemsLandingPageFieldTypeBundle::block_error.html.twig'; - $templateParameters = [ - 'type' => $blockValue->getType(), - 'error' => 'There was an error during rendering of the block', - ]; - } - $responseData['blocks'][$blockValue->getId()] = [ - 'html' => $this->templating->render($template, $templateParameters), + 'html' => $this->renderBlock($blockValue, $blockType, $view), 'json' => $this->jsonConverter->blocksToArray( [ $blockValue, @@ -160,7 +143,6 @@ public function previewBlockAction(Request $request) // For Schedule Block check if it overflows to another block. // If so, than we need to prepare preview for it aswell. - $definition = $blockType->getBlockDefinition(); if (BlockCategory::SCHEDULE_CATEGORY === $definition->getCategory()) { $nextBlockId = isset($attributes['overflow']) ? $attributes['overflow'] : false; if ($nextBlockId && isset($responseData['blocks'][$nextBlockId])) { @@ -176,6 +158,68 @@ public function previewBlockAction(Request $request) } /** + * @param \EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Model\BlockValue $blockValue + * @param \EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Model\BlockType $blockType + * @param array $view + * + * @return string + */ + private function renderBlock( + BlockValue $blockValue, + BlockType $blockType, + array $view + ) { + try { + $template = 'EzSystemsLandingPageFieldTypeBundle::block_preview.html.twig'; + $templateParameters = [ + 'type' => $blockValue->getType(), + 'view' => $view, + 'parameters' => array_merge( + ['lp_preview' => true], + $blockType->getTemplateParameters($blockValue) + ), + ]; + } catch (BlockRenderException $e) { + return $this->renderErrorTemplate( + $blockValue, + 'Rendering cannot be finished due to invalid block configuration.' + ); + } catch (NotFoundException $e) { + return $this->renderErrorTemplate( + $blockValue, + 'One of the related Content items has been removed.' + ); + } catch (\Exception $e) { + return $this->renderErrorTemplate($blockValue); + } finally { + if (isset($e)) { + $this->logger->warning( + $blockValue->getType() . ' block preview rendering error: ' . $e->getMessage() + ); + } + } + + return $this->templating->render($template, $templateParameters); + } + + /** + * @param \EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Model\BlockValue $blockValue + * @param string $issue + * + * @return string + */ + private function renderErrorTemplate(BlockValue $blockValue, $issue = '') + { + return $this->templating->render( + 'EzSystemsLandingPageFieldTypeBundle::block_error.html.twig', + [ + 'type' => $blockValue->getType(), + 'error' => 'There was an error during rendering of the block. ' . $issue, + ] + ); + } + + /** * @todo: performance * * @param int $contentId @@ -225,20 +269,15 @@ public function renderBlockAction($contentId, $blockId, $versionNo = null) public function blockView(BlockValue $blockValue) { $blockType = $this->blockTypeRegistry->getBlockType($blockValue->getType()); + $definition = $blockType->getBlockDefinition(); + $view = $definition->getView($blockValue->getView()); try { - $templateParameters = $blockType->getTemplateParameters($blockValue); - $view = $definition->getView($blockValue->getView()); $template = $view['template']; - } catch (BlockRenderException $e) { - $this->logger->warning($blockValue->getType() . ' block rendering error: ' . $e->getMessage()); - - $template = 'EzSystemsLandingPageFieldTypeBundle::block_error.html.twig'; - $templateParameters = [ - 'type' => $blockValue->getType(), - 'error' => 'There was an error during rendering of the block', - ]; + $templateParameters = $blockType->getTemplateParameters($blockValue); + } catch (\Exception $e) { + return new Response(); } $response = $this->templating->renderResponse($template, $templateParameters);