ZF2 在表单验证错误时呈现自定义 Class
ZF2 Render Custom Class on Form Validation Error
如何将字段集标记包裹在我的表单行周围,以及如何在元素验证失败时向字段集添加 has-danger class?
我想我需要创建一个 viewhelper,检查特定的表单元素是否有验证消息并用字段集包装行,但我不确定这是否是正确的方法或如何做。
验证错误时我想要的输出:
<fieldset class="has-danger"><label for="username">Username</label>
<input type="text" name="username" id="username" class="form-control
input-error" value="f"><ul><li>Needs to be 5-20 characters long</li>
</ul></fieldset>
register.phtml:
<?php
$form = $this->registerForm;
$form->prepare();
echo $this->form()->openTag($form);
echo $this->formHidden($form->get('secret'));
echo $this->formRow($form->get('username'));
echo $this->formRow($form->get('password'));
echo $this->formRow($form->get('email'));
echo $this->formRow($form->get('confirm-email'));
echo $this->formSubmit($form->get('submit'));
echo $this->form()->closeTag($form);
好的,您应该使用 formLabel()
、formElement()
和 formElementErrors()
视图助手而不是 formRow()
。
据我对 ZF2 的了解,formRow()
视图助手不会让您轻松控制 HTML 输出。它在一行代码中显示完整的输入HTML(标签+输入+错误)。
为了简单地实现您的目标,一个输入的 phtml 结构必须如下所示:
// NAME_OF_YOUR_FILE.phtml
<?php
$userNameInput = $form->get('username');
$userNameInputErrors = $this->formElementErrors($userNameInput);
?>
<fieldset class="<?= $userNameInputErrors ? 'has-danger' : '' ?>" >
<?= $this->formLabel($userNameInput) ?>
<?= $this->formElement($userNameInput) ?>
<?= $userNameInputErrors ?>
</fieldset>
对表单中的每个字段执行此操作是一项艰巨的工作,因此我建议您将此逻辑放在视图助手中。
// MyFormRow.php
<?php
namespace Your\Namespace;
use Zend\View\Helper\AbstractHelper;
class MyFormRow extends AbstractHelper
{
protected $formLabelViewHelper;
protected $formElementViewHelper;
protected $formElementErrorsViewHelper;
public function __construct($formLabelViewHelper, $formElementViewHelper, $formElementErrorsViewHelper)
{
$this->formLabelViewHelper = $formLabelViewHelper;
$this->formElementViewHelper = $formElementViewHelper;
$this->formElementErrorsViewHelper = $formElementErrorsViewHelper;
}
public function __invoke($formElement)
{
$html = '';
$errors = $this->formElementErrorsViewHelper->__invoke($formElement);
$html .= '<fieldset class=" . ($errors ? 'has-danger' : '') . ">';
$html .= $this->formLabelViewHelper->__invoke($formElement);
$html .= $this->formElementViewHelper->__invoke($formElement);
$html .= $errors;
$html .= '</fieldset>';
return $html;
}
}
?>
在您的 Module.php
中声明它。
// In your Module.php
<?php
...
public function getViewHelperConfig()
{
return [
'factories' => [
'myFormRow' => function (HelperPluginManager $helperPluginManager) {
$formLabelViewHelper = $helperPluginManager->get('formLabel');
$formElementViewHelper = $helperPluginManager->get('formElement');
$formElementErrorsViewHelper = $helperPluginManager->get('formElementErrors');
return new MyFormRow($formLabelViewHelper, $formElementViewHelper, $formElementErrorsViewHelper);
},
],
];
}
?>
现在在您的 phtml 文件中,只需:
// NAME_OF_YOUR_FILE.phtml
...
<?= echo $this->myFormRow($form->get('username')) ?>
...
如何将字段集标记包裹在我的表单行周围,以及如何在元素验证失败时向字段集添加 has-danger class?
我想我需要创建一个 viewhelper,检查特定的表单元素是否有验证消息并用字段集包装行,但我不确定这是否是正确的方法或如何做。
验证错误时我想要的输出:
<fieldset class="has-danger"><label for="username">Username</label>
<input type="text" name="username" id="username" class="form-control
input-error" value="f"><ul><li>Needs to be 5-20 characters long</li>
</ul></fieldset>
register.phtml:
<?php
$form = $this->registerForm;
$form->prepare();
echo $this->form()->openTag($form);
echo $this->formHidden($form->get('secret'));
echo $this->formRow($form->get('username'));
echo $this->formRow($form->get('password'));
echo $this->formRow($form->get('email'));
echo $this->formRow($form->get('confirm-email'));
echo $this->formSubmit($form->get('submit'));
echo $this->form()->closeTag($form);
好的,您应该使用 formLabel()
、formElement()
和 formElementErrors()
视图助手而不是 formRow()
。
据我对 ZF2 的了解,formRow()
视图助手不会让您轻松控制 HTML 输出。它在一行代码中显示完整的输入HTML(标签+输入+错误)。
为了简单地实现您的目标,一个输入的 phtml 结构必须如下所示:
// NAME_OF_YOUR_FILE.phtml
<?php
$userNameInput = $form->get('username');
$userNameInputErrors = $this->formElementErrors($userNameInput);
?>
<fieldset class="<?= $userNameInputErrors ? 'has-danger' : '' ?>" >
<?= $this->formLabel($userNameInput) ?>
<?= $this->formElement($userNameInput) ?>
<?= $userNameInputErrors ?>
</fieldset>
对表单中的每个字段执行此操作是一项艰巨的工作,因此我建议您将此逻辑放在视图助手中。
// MyFormRow.php
<?php
namespace Your\Namespace;
use Zend\View\Helper\AbstractHelper;
class MyFormRow extends AbstractHelper
{
protected $formLabelViewHelper;
protected $formElementViewHelper;
protected $formElementErrorsViewHelper;
public function __construct($formLabelViewHelper, $formElementViewHelper, $formElementErrorsViewHelper)
{
$this->formLabelViewHelper = $formLabelViewHelper;
$this->formElementViewHelper = $formElementViewHelper;
$this->formElementErrorsViewHelper = $formElementErrorsViewHelper;
}
public function __invoke($formElement)
{
$html = '';
$errors = $this->formElementErrorsViewHelper->__invoke($formElement);
$html .= '<fieldset class=" . ($errors ? 'has-danger' : '') . ">';
$html .= $this->formLabelViewHelper->__invoke($formElement);
$html .= $this->formElementViewHelper->__invoke($formElement);
$html .= $errors;
$html .= '</fieldset>';
return $html;
}
}
?>
在您的 Module.php
中声明它。
// In your Module.php
<?php
...
public function getViewHelperConfig()
{
return [
'factories' => [
'myFormRow' => function (HelperPluginManager $helperPluginManager) {
$formLabelViewHelper = $helperPluginManager->get('formLabel');
$formElementViewHelper = $helperPluginManager->get('formElement');
$formElementErrorsViewHelper = $helperPluginManager->get('formElementErrors');
return new MyFormRow($formLabelViewHelper, $formElementViewHelper, $formElementErrorsViewHelper);
},
],
];
}
?>
现在在您的 phtml 文件中,只需:
// NAME_OF_YOUR_FILE.phtml
...
<?= echo $this->myFormRow($form->get('username')) ?>
...