Чтобы распечатать части Элементов отдельно, в ZF предопределено несколько функций. Вы можете найти их все в \Zend\Form\ConfigProvider->getViewHelperConfig()
, см. здесь, на Github .
В вашем случае вы уже используете formLabel
, formElement
и formElementErrors
.
Это удобно для отдельного использования, если у вас есть что-то вроде Currency, где вы хотите, чтобы пользователь одновременно вводил сумму и выбирал валюту, но использовал только одну метку, например ::
$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'));
Вся «строка формы» состоит из:
- Метка (необязательно)
- Элемент
- 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
ViewHelper. Это можно использовать для печати всей формы за один раз, например:
file: add-foo.phtml
<?= $this->form($form) ?>
И это все. Он печатает всю форму. Конечно, он использует ViewHelpers, определенный ZF, как таковой, также с этим макетом и применяемыми классами.
Если хотите, можете взять этот конфиг и переопределить его в ваших собственных проектах.
Например, ваш код вопроса показывает, что вы добавляете <div class="form-group"></div>
вокруг каждой строки. Предположительно для Bootstrap 4. Чтобы сделать это волшебным образом, вам не нужно делать:
<div class="form-group">
<?= $this->formRow($form->get('foo')) ?>
</div>
Мы можем настроить formRow
ViewHelper. Просто выполните следующие действия:
- Создайте
FormRow.php
в своем собственном проекте, например module/Foo/src/View/Helper/FormRow.phtml
- Убедитесь, что он расширен из FormFow ZF и скопирован в оригинальную (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,
);
- Зарегистрируйте новый ViewHelper, используя те же псевдонимы, что и ZF, чтобы перезаписать значения:
'view_helpers' => [
'aliases' => [
'formrow' => FormRow::class,
'form_row' => FormRow::class,
'formRow' => FormRow::class,
'FormRow' => FormRow::class,
],
'factories' => [
FormRow::class => InvokableFactory::class,
],
],
Готово.
Теперь, когда вы делаете $this->form($form)
, FormElement
ViewHelper от ZendFramework получит ваш пользовательский formRow
ViewHelper, когда он его Factory сделает ->get('formRow')
, так как конфигурация перезаписывается на вашу собственную. Таким образом, все строки теперь будут автоматически иметь окружающий элемент div.
Чуть больше, чем ты просил, но повеселись;) Я перестану избегать работы сейчас O:)