Php Zend Framework 2-表单元素装饰器

Php Zend Framework 2-表单元素装饰器,php,zend-form,decorator,zend-framework2,zend-form-element,Php,Zend Form,Decorator,Zend Framework2,Zend Form Element,我想强制Zend表单成为Twitter引导风格。我目前遍历表单字段,并将表单信息写入我的bootstrap div构造中 我在Zend Framework 1(!)中看到有一种方法可以在装饰器中实现这一点。但是由于某些原因,第2版的文档没有涵盖这一点 我想这样做: protected $_format = '<label for="%s">%s</label>' . '<input id="%s" name="%s" type="text"

我想强制Zend表单成为Twitter引导风格。我目前遍历表单字段,并将表单信息写入我的bootstrap div构造中

我在Zend Framework 1(!)中看到有一种方法可以在装饰器中实现这一点。但是由于某些原因,第2版的文档没有涵盖这一点

我想这样做:

protected $_format = '<label for="%s">%s</label>'
             . '<input id="%s" name="%s" type="text" value="%s"/>';

public function render($content)
{
    $element = $this->getElement();
    $name    = htmlentities($element->getFullyQualifiedName());
    $label   = htmlentities($element->getLabel());
    $id      = htmlentities($element->getId());
    $value   = htmlentities($element->getValue());

    $markup  = sprintf($this->_format, $name, $label, $id, $name, $value);
    return $markup;
}
protected$\u格式='%s'
. '';
公共功能渲染($content)
{
$element=$this->getElement();
$name=htmlentities($element->getFullyQualifiedName());
$label=htmlentities($element->getLabel());
$id=htmlentities($element->getId());
$value=htmlentities($element->getValue());
$markup=sprintf($this->_格式,$name,$label,$id,$name,$value);
返回$markup;
}

有什么想法吗?

我现在用的是
partials
。我正在迭代属性,为例如
CSRF
Submit
构建一些异常。。。这项工作相当顺利:

看法

局部的



我是按照@Rufinus提到的方式做的。请参阅本教程,了解如何在ZF2中创建视图辅助对象

在我的例子中,我只是想用列表项包装表单元素,所以我扩展了原始的ZF2视图帮助程序,并让它们执行元素的呈现。我刚刚包装了他们返回的内容:

查看帮助程序FormCollection.php

<?php
// ./src/Application/View/Helper/FormCollection.php
namespace Application\View\Helper;

use Zend\Form\ElementInterface;
use Zend\Form\View\Helper\FormCollection as BaseFormCollection;

class FormCollection extends BaseFormCollection {
    public function render(ElementInterface $element) {
        return '<ul>'.parent::render($element).'</ul>';
    }
}

这将使代码更容易编写


我尝试了Ron的部分方法,结果是这样的,这不是Bootstrap 3想要的

<form id="tea" name="tea" method="POST" action="/tea/add">
    ...
    <div class="form-group">
        <label class="control-label">Brand</label>
        <div class="form-control">
            <input type="text" value="" name="brand">
        </div>
    ...
<form id="tea" role="form" name="tea" method="POST" action="/tea/add">
    <input type="hidden" value="" name="id">
    <label>
        <span>Name</span>
        <input class="form-control" type="text" value="" name="name">
    </label>
...
看起来很简单,但问题是输入元素会被包装到label元素中,这仍然不是bootstrap3想要的

<form id="tea" name="tea" method="POST" action="/tea/add">
    ...
    <div class="form-group">
        <label class="control-label">Brand</label>
        <div class="form-control">
            <input type="text" value="" name="brand">
        </div>
    ...
<form id="tea" role="form" name="tea" method="POST" action="/tea/add">
    <input type="hidden" value="" name="id">
    <label>
        <span>Name</span>
        <input class="form-control" type="text" value="" name="name">
    </label>
...

名称
...

在我看来,部分方法仍然是一种灵活而轻松的选择。Tea Box是ZF2的一种实践,您可以在

中找到上述所有代码和说明。请查看各种twitterbootstrap模块,其中一些模块具有支持大多数/所有选项的自定义视图帮助程序。我检查了其中几个,但他们不会安装,或者每个表单大约需要100万行代码。。。我喜欢我的解决方案,但最好将其包装在一个decorator中……这就是为什么:)Zend\Form没有decorator,但您可以自由地编写视图帮助程序。随便你叫什么都行。并像这样称呼它:echo$this->myviewhelper($form->get('elementname');您好,谢谢您打开我的思维,我是zend的新手,但是如果我尝试您的代码,隐藏字段或按钮将添加到您的循环中。除了隐藏字段和按钮外,如何在循环中仅分隔FormRow?谢谢,我猜如果我发现它让人困惑,就用它吧。这是我的观点:如果你能写得更容易,就用它吧。类似提示:使用AnyClass1、AnyClass2;echo后面的行可以缩进,以便更好地阅读。我查阅了您的个人资料,以帮助您理解这里的类比:这取决于您的代码。正如cout:)但是如果您使用formCollection,就像在本例中一样,我的示例是准确的。要使元素显示在标签之外,元素需要一个
id
属性设置。
<?php 

$form->prepare();
echo 
$this->form()->openTag($form),
$this->formCollection($form),
$this->form()->closeTag($form);
<form id="tea" name="tea" method="POST" action="/tea/add">
    ...
    <div class="form-group">
        <label class="control-label">Brand</label>
        <div class="form-control">
            <input type="text" value="" name="brand">
        </div>
    ...
echo $this->form()->openTag($form);
foreach ($form as $element) :?>
    <div class="form-group">
        <?php 
            if ($element->getOption('required')) { $req = 'required'; }
            $type = $element->getAttribute('type');
            $name = $element->getAttribute('name'); 
            $label = $element->getLabel();
        ?>
        <?php if ($name == 'id') { ?>
            <div class="hidden"><?php echo $this->formElement($element); ?></div>
        <?php } else if ($name == 'submit') { ?>
            <input class='btn' name='submit' type='submit' value='Add'>
        <?php } else if ($label != '') { ?>
            <label class="control-label"><?php echo $label ?></label>
            <input class='form-control' name='<?php echo $name ?>' type='<?php echo $type ?>'>
        <?php } ?> 
    </div>
<?php 
endforeach;
echo $this->form()->closeTag();
<form id="tea" name="tea" method="POST" action="/tea/add">
    ...
    <div class="form-group">
        <label class="control-label">Brand</label>
        <input class="form-control" type="text" name="brand">
    </div>
...
class TeaForm extends Form
{
    public function __construct($name = null)
    {
        // we want to ignore the name passed
        parent::__construct('tea');

        $this->add(array(
            'name' => 'id',
            'type' => 'Hidden',
        ));
        $this->add(array(
            'name' => 'brand',
            'type' => 'Text',
            'options' => array(
                'label' => 'Brand',
            ),
            /** **define class attribute** **/
        'attributes' => array(
            'class' => 'form-control',
        ),
        ));
....
<form id="tea" role="form" name="tea" method="POST" action="/tea/add">
    <input type="hidden" value="" name="id">
    <label>
        <span>Name</span>
        <input class="form-control" type="text" value="" name="name">
    </label>
...