dev-master
9999999-devMake widget easier and reusable !
MIT
The Requires
- twig/twig ~1.13
- php >=5.4
by Johann Saunier
twig widget
Make widget easier and reusable !
This project is currently in development, please take care., (*1)
You need to have composer to install dependencies., (*2)
{ "require": { "gos/widget": "{last stable version}" } }
Then run the command on the root of your projectcomposer update
, (*3)
First create a widget class like, (*4)
<?php namespace Gos\Bundle\I18nBundle\Widget\Locale; use Gos\Component\Widget\Widget; class LocaleSwitcherWidget extends Widget { protected $localeEntityManager; protected $requestStack; /** * Use the constructor to inject your dependencies **/ public function __construct(RequestStack $requestStack, LocaleEntityManager $localeEntityManager) { $this->localeEntityManager = $localeEntityManager; $this->requestStack = $requestStack; } /** * Method imposed by the interface **/ public function build(Array $parameters) { //Here I need the current request (See symfony/HttpFoundation) $request = $this->requestStack->getMasterRequest(); //Set the template to be render $this->setTemplate('widget/locale_switcher.html.twig'); //Data passed to the view $this->setData(array( 'locales' => $this->localeEntityManager->getRepository()->findAllActive(), 'current' => $request->getLocale(), 'route' => array( 'name' => $request->attributes->get('_route'), 'parameters' => $request->attributes->get('_route_params') ) )); } /** * @return mixed|string */ public function getName() { /** * Define the name of the widget to retrieve it in the twig template **/ return 'locale_switcher'; } }
Register your function to Twig., (*5)
use Gos\Component\Widget\WidgetTwigExtension; //Create widget registry instance, who contains your widget $widgetRegistry = new WidgetRegistry(); //Arbitrary depedencies, related to your widget business $localeSwitcherWidget = new LocaleSwitcherWidget($requestStack, $localeEntityManager); //Add your widget on the widgetRegistry $widgetRegistry->addWidget($localeSwitcherWidget); //Add other .... $widgetRegistry->add(...); //Twig engine $twig = new Twig_Environment($loader); //Register the widget twig extension. $twig->addExtension(new WidgetTwigExtension($widgetRegistry));
Then inside twig template, (*6)
{{ widget('locale_switcher') }}
To retrieve manually your widget $widgetRegistry->getWidget('locale_switcher'); this will return your LocaleSwitcherWidget instance, (*7)
Create a compiler pass, for example Acme\DemoBundle\DependencyInjection\Compiler\WidgetCompilerPass
, (*8)
<?php namespace Acme\DemoBundle\DependencyInjection\Compiler; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Reference; class WidgetCompilerPass implements CompilerPassInterface { public function process(ContainerBuilder $container) { $widgetRegistryDefinition = new Definition('Gos\Component\Widget\WidgetRegistry'); $container->setDefinition('gos.core_bundle.widget.registry', $widgetRegistryDefinition); $widgetTwigExtensionDefinition = new Definition('Gos\Component\Widget\WidgetTwigExtension'); $widgetTwigExtensionDefinition->setArguments(array(new Reference('gos.core_bundle.widget.registry'))); $widgetTwigExtensionDefinition->addTag('twig.extension'); $container->setDefinition('gos.core_bundle.widget_twig_extension', $widgetTwigExtensionDefinition); $taggedServices = $container->findTaggedServiceIds('twig.widget'); foreach ($taggedServices as $id => $tagAttributes) { $widgetRegistryDefinition->addMethodCall('addWidget', array( new Reference($id), )); } } }
Register the compiler pass in your bundle class., (*9)
<?php namespace Acme\DemoBundle; use Acme\DemoBundle\DependencyInjection\Compiler\WidgetCompilerPass; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Bundle\Bundle; class AcmeDemoBundle extends Bundle { public function build(ContainerBuilder $container) { parent::build($container); $container->addCompilerPass(new WidgetCompilerPass()); } }
From now, simply registering your widget to twig as service like, (*10)
acme.demo_bundle.locale_switcher.widget: class: Acme\DemoBundle\Widget\LocaleSwitcherWidget arguments: - @request_stack - @gos.i18n_bundle.locale_entity.manager tags: - { name: twig.widget }
And now he is available from your template., (*11)
PHPUnit 3.5 or newer together with Mock_Object package is required. To setup and run tests follow these steps:, (*12)
The project is under MIT lisence, for more information see the LICENSE file inside the project, (*13)
Make widget easier and reusable !
MIT
twig widget