diff --git a/ChillMainBundle.php b/ChillMainBundle.php index ca6e60751..2b4b4649b 100644 --- a/ChillMainBundle.php +++ b/ChillMainBundle.php @@ -14,6 +14,7 @@ use Chill\MainBundle\DependencyInjection\CompilerPass\NotificationCounterCompile use Chill\MainBundle\DependencyInjection\CompilerPass\MenuCompilerPass; use Chill\MainBundle\DependencyInjection\CompilerPass\ACLFlagsCompilerPass; use Chill\MainBundle\DependencyInjection\CompilerPass\GroupingCenterCompilerPass; +use Chill\MainBundle\Templating\Entity\CompilerPass as RenderEntityCompilerPass; class ChillMainBundle extends Bundle @@ -31,5 +32,6 @@ class ChillMainBundle extends Bundle $container->addCompilerPass(new MenuCompilerPass()); $container->addCompilerPass(new ACLFlagsCompilerPass()); $container->addCompilerPass(new GroupingCenterCompilerPass()); + $container->addCompilerPass(new RenderEntityCompilerPass()); } } diff --git a/Resources/config/services/templating.yml b/Resources/config/services/templating.yml index 99dfbe574..8791c10b1 100644 --- a/Resources/config/services/templating.yml +++ b/Resources/config/services/templating.yml @@ -7,5 +7,9 @@ services: arguments: $requestStack: '@Symfony\Component\HttpFoundation\RequestStack' $originalExtension: '@twig.extension.routing' + tags: + - { name: twig.extension } + + Chill\MainBundle\Templating\Entity\ChillEntityRenderExtension: tags: - { name: twig.extension } \ No newline at end of file diff --git a/Templating/Entity/AbstractChillEntityRender.php b/Templating/Entity/AbstractChillEntityRender.php new file mode 100644 index 000000000..d88c4b86f --- /dev/null +++ b/Templating/Entity/AbstractChillEntityRender.php @@ -0,0 +1,38 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +namespace Chill\MainBundle\Templating\Entity; + +/** + * + * + */ +abstract class AbstractChillEntityRender implements ChillEntityRenderInterface +{ + protected function getDefaultOpeningBox($classSuffix): string + { + return ''; + } + + protected function getDefaultClosingBox(): string + { + return ''; + } +} diff --git a/Templating/Entity/ChillEntityRender.php b/Templating/Entity/ChillEntityRender.php new file mode 100644 index 000000000..fec14a594 --- /dev/null +++ b/Templating/Entity/ChillEntityRender.php @@ -0,0 +1,43 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +namespace Chill\MainBundle\Templating\Entity; + +/** + * Render an entity using `__toString()` + */ +class ChillEntityRender extends AbstractChillEntityRender +{ + public function renderBox($entity, array $options): string + { + return $this->getDefaultOpeningBox('default').$entity + .$this->getDefaultClosingBox(); + } + + public function renderString($entity, array $options): string + { + return $entity; + } + + public function supports($entity, array $options): bool + { + return true; + } +} diff --git a/Templating/Entity/ChillEntityRenderExtension.php b/Templating/Entity/ChillEntityRenderExtension.php new file mode 100644 index 000000000..98cb90ee5 --- /dev/null +++ b/Templating/Entity/ChillEntityRenderExtension.php @@ -0,0 +1,83 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +namespace Chill\MainBundle\Templating\Entity; + +use Twig\Extension\AbstractExtension; +use Twig\TwigFilter; + +/** + * + * + */ +class ChillEntityRenderExtension extends AbstractExtension +{ + /** + * + * @var ChillEntityRenderInterface + */ + protected $renders = []; + + /** + * + * @var ChillEntityRender + */ + protected $defaultRender; + + public function getFilters() + { + return [ + new TwigFilter('chill_entity_render_string', [$this, 'renderString'], [ + 'is_safe' => [ 'html' ] + ]), + new TwigFilter('chill_entity_render_box', [$this, 'renderBox'], [ + 'is_safe' => [ 'html' ] + ]) + ]; + } + + public function renderString($entity, array $options = []): string + { + return $this->getRender($entity, $options) + ->renderString($entity, $options); + } + + public function renderBox($entity, array $options = []): string + { + return $this->getRender($entity, $options) + ->renderBox($entity, $options); + } + + public function addRender(ChillEntityRenderInterface $render) + { + $this->renders[] = $render; + } + + protected function getRender($entity, $options): ChillEntityRenderInterface + { + foreach ($this->renders as $render) { + if ($render->supports($entity, $options)) { + return $render; + } + } + + return $this->defaultRender; + } +} diff --git a/Templating/Entity/ChillEntityRenderInterface.php b/Templating/Entity/ChillEntityRenderInterface.php new file mode 100644 index 000000000..d43ac3e52 --- /dev/null +++ b/Templating/Entity/ChillEntityRenderInterface.php @@ -0,0 +1,66 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +namespace Chill\MainBundle\Templating\Entity; + +/** + * Interface to implement which will render an entity in template on a custom + * manner. + */ +interface ChillEntityRenderInterface +{ + /** + * Return true if the class support this object for the given options + * + * @param type $entity + * @param array $options + * @return bool + */ + public function supports($entity, array $options): bool; + + /** + * Return the entity as a string. + * + * Example: returning the name of a person. + * + * @param object $entity + * @param array $options + * @return string + */ + public function renderString($entity, array $options): string; + + /** + * Return the entity in a box + * + * Example: return a person inside a box: + * + * ```html + * + * Roger + * Dupont + * + * ``` + * + * @param type $entity + * @param array $options + * @return string + */ + public function renderBox($entity, array $options): string; +} diff --git a/Templating/Entity/CompilerPass.php b/Templating/Entity/CompilerPass.php new file mode 100644 index 000000000..7c25d2423 --- /dev/null +++ b/Templating/Entity/CompilerPass.php @@ -0,0 +1,41 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +namespace Chill\MainBundle\Templating\Entity; + +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\Reference; + +/** + * Add service tagged with `chill.render_entity` to appropriate service + * + */ +class CompilerPass implements CompilerPassInterface +{ + public function process(ContainerBuilder $container) + { + $extension = $container->getDefinition(ChillEntityRenderExtension::class); + + foreach ($container->findTaggedServiceIds('chill.render_entity') as $id => $tags) { + $extension->addMethodCall('addRender', [new Reference($id)]); + } + } +}