mirror of
				https://gitlab.com/Chill-Projet/chill-bundles.git
				synced 2025-10-31 17:28:23 +00:00 
			
		
		
		
	create api for adding a render entity function
This commit is contained in:
		| @@ -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()); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -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 } | ||||
							
								
								
									
										38
									
								
								Templating/Entity/AbstractChillEntityRender.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								Templating/Entity/AbstractChillEntityRender.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| <?php | ||||
| /* | ||||
|  * Chill is a software for social workers | ||||
|  * | ||||
|  * Copyright (C) 2014-2019, Champs Libres Cooperative SCRLFS,  | ||||
|  * <http://www.champs-libres.coop> | ||||
|  * | ||||
|  * 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 <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| namespace Chill\MainBundle\Templating\Entity; | ||||
|  | ||||
| /** | ||||
|  *  | ||||
|  * | ||||
|  */ | ||||
| abstract class AbstractChillEntityRender implements ChillEntityRenderInterface | ||||
| { | ||||
|     protected function getDefaultOpeningBox($classSuffix): string | ||||
|     { | ||||
|         return '<span class="chill-entity chill-entity__'.$classSuffix.'">'; | ||||
|     } | ||||
|      | ||||
|     protected function getDefaultClosingBox(): string | ||||
|     { | ||||
|         return '</span>'; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										43
									
								
								Templating/Entity/ChillEntityRender.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								Templating/Entity/ChillEntityRender.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| <?php | ||||
| /* | ||||
|  * Chill is a software for social workers | ||||
|  * | ||||
|  * Copyright (C) 2014-2019, Champs Libres Cooperative SCRLFS,  | ||||
|  * <http://www.champs-libres.coop> | ||||
|  * | ||||
|  * 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 <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 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; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										83
									
								
								Templating/Entity/ChillEntityRenderExtension.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								Templating/Entity/ChillEntityRenderExtension.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,83 @@ | ||||
| <?php | ||||
| /* | ||||
|  * Chill is a software for social workers | ||||
|  * | ||||
|  * Copyright (C) 2014-2019, Champs Libres Cooperative SCRLFS,  | ||||
|  * <http://www.champs-libres.coop> | ||||
|  * | ||||
|  * 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 <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 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; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										66
									
								
								Templating/Entity/ChillEntityRenderInterface.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								Templating/Entity/ChillEntityRenderInterface.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,66 @@ | ||||
| <?php | ||||
| /* | ||||
|  * Chill is a software for social workers | ||||
|  * | ||||
|  * Copyright (C) 2014-2019, Champs Libres Cooperative SCRLFS,  | ||||
|  * <http://www.champs-libres.coop> | ||||
|  * | ||||
|  * 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 <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 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 | ||||
|      * <span class="chill-entity"> | ||||
|      *  <span class="chill-entity__first-name">Roger</span> | ||||
|      *  <span class="chill-entity__last-name">Dupont</span> | ||||
|      * </span> | ||||
|      * ``` | ||||
|      *  | ||||
|      * @param type $entity | ||||
|      * @param array $options | ||||
|      * @return string | ||||
|      */ | ||||
|     public function renderBox($entity, array $options): string; | ||||
| } | ||||
							
								
								
									
										41
									
								
								Templating/Entity/CompilerPass.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								Templating/Entity/CompilerPass.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| <?php | ||||
| /* | ||||
|  * Chill is a software for social workers | ||||
|  * | ||||
|  * Copyright (C) 2014-2019, Champs Libres Cooperative SCRLFS,  | ||||
|  * <http://www.champs-libres.coop> | ||||
|  * | ||||
|  * 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 <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 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)]); | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user