gos/widget

此包已被废弃,不再维护。未建议替代包。

让小部件更容易和可重用!

dev-master / 1.0.x-dev 2014-10-01 15:40 UTC

This package is auto-updated.

Last update: 2020-08-17 22:04:38 UTC


README

#Gos Widget 组件#

此项目目前正在开发中,请小心使用。

安装

您需要安装 composer 来安装依赖项。

{
    "require": {
        "gos/widget": "{last stable version}"
    }
}

然后在您的项目根目录下运行命令composer update

如何使用

首先创建一个组件类,例如

<?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';
    }
}

将您的函数注册到 Twig。

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));

然后在 twig 模板内部

{{ widget('locale_switcher') }}

手动检索您的组件 $widgetRegistry->getWidget('locale_switcher'); 这将返回您的 LocaleSwitcherWidget 实例

Symfony2 集成

创建一个编译器过程,例如 Acme\DemoBundle\DependencyInjection\Compiler\WidgetCompilerPass

<?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),
            ));
        }
    }
}

在您的包类中注册编译器过程。

<?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());
    }
}

从现在开始,只需将您的组件注册到 twig 作为服务即可

acme.demo_bundle.locale_switcher.widget:
    class: Acme\DemoBundle\Widget\LocaleSwitcherWidget
    arguments:
        - @request_stack
        - @gos.i18n_bundle.locale_entity.manager
    tags:
        - { name: twig.widget }

现在它可以从模板中访问。

运行测试

需要 PHPUnit 3.5 或更高版本以及 Mock_Object 包。要设置和运行测试,请按照以下步骤操作

  • 转到 fixture 的根目录
  • 运行: composer install --dev
  • 运行: phpunit

许可证

该项目受 MIT 许可证保护,有关更多信息,请参阅项目中的 LICENSE 文件。