zenify / modular-form-renderer
此包已被 废弃 并不再维护。没有建议的替代包。
关于此包最新版本(v0.0.2)的许可证信息不可用。
v0.0.2
2015-10-16 13:21 UTC
Requires
- nette/forms: ^2.3
- nextras/forms: ^1.6
This package is not auto-updated.
Last update: 2015-12-31 22:29:09 UTC
README
当你需要 多个表单渲染器 而不想将它们变成意大利面时。
安装
通过 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。