要单独打印 Elements 的各个部分,ZF 中预定义了几个函数。您可以在以下位置找到所有内容\Zend\Form\ConfigProvider->getViewHelperConfig()
, see 在 Github 上.
就你而言,你已经在使用formLabel
, formElement
and formElementErrors
.
如果您有像货币这样的东西,您希望用户填写金额并选择货币但只使用单个标签,那么这些对于单独使用很方便,例如:
$this->formLabel($form->get('amount'));
$this->formElement($form->get('amount'));
$this->formElementErrors($form->get('amount'));
$this->formElement($form->get('currency'));
$this->formElementErrors($form->get('currency'));
整个“表单行”由以下部分组成:
- 标签(可选)
- Element
- ElementErrors(如果在服务器端验证后出现)
因此,在本例中您需要整个“金额”位,您可以将上面的内容缩短为:
$this->formRow($form->get('amount')); // prints all elements for the row
$this->formElement($form->get('currency'));
$this->formElementErrors($form->get('currency'));
如果您仔细查看链接ConfigProvider
的“zendframework/zend-form”,您可能已经注意到还有一个form
查看助手。这可用于一次性打印整个表单,如下所示:
文件:add-foo.phtml
<?= $this->form($form) ?>
就是这样。它打印整个表格。当然,它使用 ZF 定义的 ViewHelpers,同样也应用了该布局和类。
如果您愿意,可以采用该配置并在您自己的项目中覆盖它。
例如,您的问题代码显示您添加<div class="form-group"></div>
每一行周围。大概适用于 Bootstrap 4。要神奇地做到这一点,你不需要这样做:
<div class="form-group">
<?= $this->formRow($form->get('foo')) ?>
</div>
我们可以调整formRow
查看助手。只需按照以下步骤操作:
- 创建一个
FormRow.php
在您自己的项目中,例如module/Foo/src/View/Helper/FormRow.phtml
- 确保从 ZF 的 FormRow 扩展它并复制到原始 (ZF)
render
函数,就像这样:
use Zend\Form\View\Helper\FormRow as ZendFormRow;
class FormRow extends ZendFormRow
{
public function render(ElementInterface $element, $labelPosition = null)
{
// its content
}
}
- 我们想要添加一个包装器(
form-group
class div),因此在类中定义它,如下所示:
class FormRow extends ZendFormRow
{
protected $inputRow = '<div class="form-group">%s</div>';
// the other stuff
}
- 在底部
render
函数,你会发现以下代码(在else
):
if ($this->renderErrors) {
$markup .= $elementErrors;
}
放在上面之后:
$markup = sprintf(
$this->inputRow,
$markup,
);
- 使用与 ZF 相同的别名注册新的 ViewHelper 以覆盖这些值:
'view_helpers' => [
'aliases' => [
'formrow' => FormRow::class,
'form_row' => FormRow::class,
'formRow' => FormRow::class,
'FormRow' => FormRow::class,
],
'factories' => [
FormRow::class => InvokableFactory::class,
],
],
Done.
现在当你这样做时$this->form($form)
the FormElement
ZendFramework 的 ViewHelper 将收到您的自定义formRow
ViewHelper 当它的 Factory 执行时->get('formRow')
,因为配置会被覆盖为您自己的配置。因此,所有行现在都会自动具有周围的 div。
比你要求的多一点,但是玩得开心;)我现在要停止逃避工作了O:)