zenify / modular-form-renderer

此包已被 废弃 并不再维护。没有建议的替代包。
关于此包最新版本(v0.0.2)的许可证信息不可用。

v0.0.2 2015-10-16 13:21 UTC

This package is not auto-updated.

Last update: 2015-12-31 22:29:09 UTC


README

Build Status Quality Score Code Coverage Downloads this Month Latest stable

当你需要 多个表单渲染器 而不想将它们变成意大利面时。

安装

通过 Composer

$ composer require zenify/modular-form-renderer

使用

简单创建自己的类,该类将实现 Zenify\ModularFormRenderer\Contract\Forms\Decorator\FormDecoratorInterface

CrazySelectJqueryFormDecorator 将向表单中的每个选择框添加 crazy-select 类。这可能很有用,因为支持一些将选择框转换为丰富选择工具的 JavaScript 扩展。

use Nette\Forms\Controls\SelectBox;
use Nette\Forms\Form;
use Zenify\ModularFormRenderer\Contract\Forms\Decorator\FormDecoratorInterface;


final class CrazySelectJqueryFormDecorator implements FormDecoratorInterface
{

    /**
     * {@inheritdoc}
     */
    public function decorate(Form $form)
    {
        foreach ($form->getControls() as $baseControl) {
            if ($baseControl instanceof SelectBox) {
                $baseControl->setAttribute('class', 'crazy-select');
            }
        }
    }


    /**
     * {@inheritdoc}
     */
    public function getWrappers()
    {
        // we need no custom wrappers
        return [];
    }

}

然后我们需要将此装饰器添加到渲染器中。这样,我们可以添加多个分隔的装饰器,每个装饰器都将被应用。

use Nette\Application\UI\Form;
use Zenify\ModularFormRenderer\Forms\Rendering\FormDecoratorRenderer;


class MyPresenter ...
{

    /**
     * @return Form
     */
    protected function createComponentSelectForm()
    {
        $formDecoratorRenderer = new FormDecoratorRenderer;
        $formDecoratorRenderer->addFormDecorator(new MyOwnFormDecorator);

        $form = new Form;
        $form->addSelect('category', 'Category');
        $form->setRenderer($formDecoratorRenderer);
        return $form;
    }

}

现在所有选择框都将具有我们的类 crazy-select

具有相同设置的多个表单

如果你有很多表单,你将不得不将此渲染器添加到每个表单中。这不是很多工作,对吧?

Simple FormFactory 会帮我们。

use Nette\Forms\Form;
use Nette\Forms\IFormRenderer;
use Zenify\ModularFormRenderer\Forms\Rendering\FormDecoratorRenderer;


final class FormFactory 
{

    /**
     * @returns Form
     */
    public function create()
    {
        $form = new Form;
        $form->setRenderer($this->createFormRenderer());
        return $form;
    }


    /**
     * @return IFormRenderer
     */
    private function createFormRenderer()
    {
        $formDecoratorRenderer = new FormDecoratorRenderer;

        $formDecoratorRenderer->addFormDecorator(new MyOwnFormDecorator);
        // here you can add some other decorators, or use conditions
        // e.g. add Bootstrap3FormDecorator only for admin forms 

        return $formDecoratorRenderer;
    }

}

然后在 config.neon 中注册为服务

services:
    - FormFactory

并在演示者中使用

use FormFactory;
use Nette\Application\UI\Form;
use Zenify\ModularFormRenderer\Forms\Rendering\FormDecoratorRenderer;


class MyPresenter ...
{

    /**
     * @var FormFactory
     */
    private $formFactory;


    public function __construct(FormFactory $formFactory)
    {
        $this->formFactory = $formFactory;
    }

    /**
     * @return Form
     */
    protected function createComponentSelectForm()
    {
        $form = $this->formFactory->create();
        // here we can omit all "setup" code
        $form->addSelect('category', 'Category');

        return $form;
    }

}

测试

$ phpunit

贡献

有关详细信息,请参阅 CONTRIBUTING