понимание расположения сетки в Zend - PullRequest
1 голос
/ 14 марта 2019

Я немного запутался в проектировании форм в 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 для этого случая?

1 Ответ

1 голос
/ 16 марта 2019

Чтобы распечатать части Элементов отдельно, в 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. Просто выполните следующие действия:

  1. Создайте FormRow.php в своем собственном проекте, например module/Foo/src/View/Helper/FormRow.phtml
  2. Убедитесь, что он расширен из 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
        }
    }
  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:)

...