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

#zend-framework #zend-form #zend-framework3 #zend-view

#zend-framework #zend-форма #zend-framework3 #zend-view

Вопрос:

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

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

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

  <?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 для этого случая?

Комментарии:

1. $this->formRow вместо ->formLabel amp; ->formElement

2.Учебные пособия по Zend Form от ZF3. Мое собственное дополнение к нему и пример расширения репозитория к этому.

3. Кроме того, если вы определите все эти классы и тому подобное в *Form классе, тогда вы могли бы (технически) просто <?= $this->form($form) ?> напечатать всю форму в 1 строку 😉

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

Ответ №1:

Для печати частей элементов по отдельности в ZF предварительно определено несколько функций. Вы можете найти их все в ZendFormConfigProvider->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'));
  

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

  • Метка (необязательно)
  • Элемент
  • Ошибки элементов (если присутствуют после проверки на стороне сервера)

Итак, поскольку в этом примере вам нужен весь бит «amount», вы могли бы сократить приведенный выше до:

 $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. Обязательно расширьте ее из FormRow ZF и скопируйте в исходную функцию (ZF) render , вот так:
     use ZendFormViewHelperFormRow as ZendFormRow;

    class FormRow extends ZendFormRow
    {
        public function render(ElementInterface $element, $labelPosition = null)
        {
            // its content
        }
    }
  
  1. Мы хотим добавить оболочку ( form-group класс 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, как это делает его фабрика ->get('formRow') , поскольку конфигурация перезаписывается на вашу собственную. Таким образом, все строки теперь автоматически будут иметь окружающий div.


Немного больше, чем вы просили, но получайте удовольствие 😉 Теперь я собираюсь прекратить избегать работы O:)