我尝试了Ron的Partial方法,结果看起来不是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>
...
我们知道,为了使用Bootstrap 3预定义的表单样式,我们需要将样式定义到输入元素的class属性中:form-control,而不是其包装元素。
我的部分方法如下。
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>
...
如何将自定义样式附加到zf2表单中已经提到:要向表单元素添加类属性。
class TeaForm extends Form
{
public function __construct($name = null)
{
parent::__construct('tea');
$this->add(array(
'name' => 'id',
'type' => 'Hidden',
));
$this->add(array(
'name' => 'brand',
'type' => 'Text',
'options' => array(
'label' => 'Brand',
),
'attributes' => array(
'class' => 'form-control',
),
));
....
看起来很简单,但问题是输入元素将被包装到标签元素中,这仍然不是 Bootstrap 3 所期望的。
<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>
...
在我看来,Partial方法仍然是一种灵活且轻量的选择。Tea Box是一个ZF2实践项目,你可以从Gibhub找到上述所有代码和描述。