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)]);
+ }
+ }
+}