Пользовательский класс рендеринга ZF2 при ошибке проверки формы

Как я могу обернуть тег fieldset вокруг строк моей формы и как я могу добавить класс has-danger для набора полей, когда элемент не может быть проверен?

Я думаю, что мне нужно создать помощник по видам, проверить, есть ли у конкретного элемента сообщение проверки, и обернуть строку набором полей, но я не уверен, что это правильный подход или как это сделать.

Вывод, который я хочу при ошибке проверки:

<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);

1

Решение

Хорошо, вы должны использовать 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')) ?>

...
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]