понимание макета сетки в zend

Я немного запутался в проектировании форм в zend. Я понял, что у меня есть поля в моем классе формы, и внешний вид должен выполняться в представлениях.

В представлении индекса, которое представляет собой почти простой html, у меня нет проблем, но в представлениях добавления и редактирования, которые показывают мою форму, у меня есть проблемы с изменением внешнего вида.

У меня есть сценарий просмотра, подобный следующему:

 <?php
$title = 'AVB ändern';        
$this->headTitle($title);
?>
<h1><?= $this->escapeHtml($title) ?></h1>
<?php

$id= $form->get('id');
$id->setAttribute('class', 'form-control');
$id->setAttribute('placeholder', 'id');

$avbname= $form->get('avbname');
$avbname->setAttribute('class', 'form-control');
$avbname->setAttribute('placeholder', 'avbname');

$vbedingungen= $form->get('vbedingungen');
$vbedingungen->setAttribute('class', 'form-control');
$vbedingungen->setAttribute('placeholder', 'vbedingungen');

$versichererid= $form->get('versichererid');
$versichererid->setAttribute('class', 'form-control');
$versichererid->setAttribute('placeholder', 'versichererid');

$aktiv= $form->get('aktiv');
$aktiv->setAttribute('class', 'form-control');
$aktiv->setAttribute('placeholder', 'aktiv');

$submit = $form->get('submit');
$submit->setAttribute('class', 'btn btn-primary');


$form->prepare();

echo $this->form()->openTag($form);
?>
<div class="form-group">
    <?= $this->formElement($id) ?>
    <?= $this->formElementErrors()->render($id, ['class' => 'help-block']) ?>
</div>

<div class="form-group">
    <?= $this->formLabel($avbname) ?>
    <?= $this->formElement($avbname) ?>
    <?= $this->formElementErrors()->render($avbname, ['class' => 'help-block']) ?>
</div>

<div class="form-group">
    <?= $this->formLabel($vbedingungen) ?>
    <?= $this->formElement($vbedingungen) ?>
    <?= $this->formElementErrors()->render($vbedingungen, ['class' => 'help-block']) ?>
</div>

<div class="form-group">
    <?= $this->formLabel($versichererid) ?>
    <?= $this->formElement($versichererid) ?>
    <?= $this->formElementErrors()->render($versichererid, ['class' => 'help-block']) ?>
</div>

<div class="form-group">
    <?= $this->formLabel($aktiv) ?>
    <?= $this->formElement($aktiv) ?>
    <?= $this->formElementErrors()->render($aktiv, s['class' => 'help-block']) ?>
</div>

<?php
echo $this->formSubmit($submit);
echo $this->formHidden($form->get('id'));      
$form->setAttribute('action', $this->url('typavb', ['action' => 'edit']));    
echo $this->form()->closeTag();

Конечно, одно поле отображается под другим. Как я могу показать два поля подряд (с ярлыками)? Я действительно был бы признателен за пример или совет к хорошему руководству, в котором показано, как это правильно делать с этой концепцией zend3.

Это вообще подходящее место для этого в представлении или мне нужен новый layout.phtml для этого случая?


person pia-sophie    schedule 14.03.2019    source источник
comment
$this->formRow вместо ->formLabel & ->formElement   -  person rkeet    schedule 14.03.2019
comment
Кроме того, если вы определите все эти классы и тому подобное в классе *Form, тогда вы можете (технически) просто сделать <?= $this->form($form) ?>, чтобы распечатать всю форму в одной строке;)   -  person rkeet    schedule 14.03.2019
comment
Пожалуйста, напишите в ответ свои действительно полезные комментарии, чтобы я мог их принять!   -  person pia-sophie    schedule 15.03.2019


Ответы (1)


Чтобы распечатать части Elements по отдельности, в ZF предопределено несколько функций. Вы можете найти их все в \Zend\Form\ConfigProvider->getViewHelperConfig(), см. здесь. Github.

В вашем случае вы уже используете formLabel, formElement и 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'));

Вся «строка формы» состоит из:

  • Ярлык (необязательно)
  • Элемент
  • 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. Это можно использовать для печати всей формы за один раз, например:

файл: 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 ViewHelper. Просто выполните следующие действия:

  1. Создайте FormRow.php в своем собственном проекте, например module/Foo/src/View/Helper/FormRow.phtml
  2. Обязательно расширьте его из 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
        }
    }
  1. Мы хотим добавить оболочку (form-group class div), поэтому определите ее в классе, например:
    class FormRow extends ZendFormRow
    {
        protected $inputRow = '<div class="form-group">%s</div>';
        // the other stuff
    }
  1. Внизу функции render вы найдете следующий код (перед else):
    if ($this->renderErrors) {
        $markup .= $elementErrors;
    }

Поместите после вышеуказанного:

    $markup = sprintf(
        $this->inputRow,
        $markup,
    );
  1. Зарегистрируйте свой новый 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 :)

person rkeet    schedule 16.03.2019