как показать форму в виде сетки - PullRequest
0 голосов
/ 26 марта 2019

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

Пожалуйста, посмотрите на скриншот:

enter image description here

notizen area должна быть формой поиска.

Здесь часть моего действия контроллера:

 $view = new ViewModel();

    $wiedervorlageView = new ViewModel(['wvs' => $this->wvTable->fetchAll()]);
    $wiedervorlageView->setTemplate('layout/template/wiedervorlage');

    $notizenView = new ViewModel(['notizen' => $this->notizenTable->fetchAll()]);
    $notizenView->setTemplate('layout/template/notizen');

    $geburtstageview = new ViewModel();
    $geburtstageview->setTemplate('layout/template/geburtstageview');

    $sidebarBlockView = new ViewModel(['aps' => $this->ansprechpartnerTable->getGeburtstage()]);
    $sidebarBlockView->setTemplate('layout/template/block');

    $geburtstageview->addChild($sidebarBlockView, 'block');

    $view->addChild($wiedervorlageView, 'wiedervorlage')
    ->addChild($notizenView, 'notizen')
    ->addChild($geburtstageview, 'geburtstage');

    return $view;

А вот поисковый скрипт:

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

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

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


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

$form->prepare();

echo $this->form()->openTag($form);
?>

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

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

<?php
echo $this->formSubmit($submit);
echo $this->form()->closeTag();

Мой вопрос, какизменить область notizen, чтобы она работала с формой?Я пробовал разные возможности, но пришел к выводу, что не понял логику в этом случае.Любая помощь или объяснение приветствуются.

Решение:

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

Итак, я изменил сценарии просмотра, как предложено, здесь для завершения один с формой:

<div class="row">
<h2> Suche </h2>
<?php
    $suche= $form->get('suche');
    $suche->setAttribute('class', 'form-control');
    $suche->setAttribute('placeholder', 'suche');

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

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

    $form->prepare();

    echo $this->form()->openTag($form);
    ?>

   <div class="form-group">
        <?= $this->formRow($suche) ?>
        <?= $this->formElementErrors()->render($suche, ['class' => 'help-block']) ?>
        <?= $this->formRow($suchtyp) ?>
        <?= $this->formElementErrors()->render($suchtyp, ['class' => 'help-block']) ?>  

        <?php
        echo $this->formSubmit($submit);
        echo $this->form()->closeTag(); ?>

   </div>
</div>

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

  $form = new SearchForm(NULL);
        $form->get('submit')->setValue('suche');

        return new ViewModel([
            'wvs' => $this->wvTable->fetchAll(),
            'form' => $form,
            'aps' => $this->ansprechpartnerTable->getGeburtstage()
        ]);

1 Ответ

2 голосов
/ 27 марта 2019

Вы действительно должны научиться создавать частичные . То, что вы делаете сейчас, - это смешение проблем.

То, что вы делаете в вашем контроллере, приведет к огромному беспорядку, если / когда вам придется провести рефакторинг.

С частями вы бы сделали что-то вроде этого.

Файл: notizen-partial.phtml

<?php
/** @var array $notizen */
?>

<table>
    <tr>
        <th>datum</th>
        <th>text</th>
    </tr>
    <tr>
        <td><?= $notizen['datum'] ?></td>
        <td><?= $notizen['text'] ?></td>
    </tr>
</table>

Итак, в приведенном выше примере ожидается переменная $notizen типа array (намекает в PHP вверху). Вы можете добавить некоторую проверку того, что массив действительно присутствует, содержит значения и т. Д., Но это зависит от вас.

Теперь зарегистрируйте этот частичный элемент в конфигурации модуля со следующей конфигурацией:

'view_manager'    => [
    'template_map'        => [
        'partial/notizen-partial' => __DIR__ . '/../view/partials/notizen-partial.phtml',
    ],
],

Убедитесь, что вы исправили путь для своей ситуации !!!

Повторите вышеуказанное для каждого маленького «контейнера» обработки ваших данных (wvs, aps и т. Д.).


Затем выполните действие, которое вернет данные, необходимые для просмотра:

// ... create/get data

return [
    'wvs'     => $this->wvTable->fetchAll(),
    'notizen' => $this->notizenTable->fetchAll(),
    'aps'     => $this->ansprechpartnerTable->getGeburtstage(),
];

Это относится к "action-view.phtml" или как угодно. Этот файл обрабатывает «данные о месте, где он должен быть».

Макет представления, основанный на вашем скриншоте, будет выглядеть примерно так (я предполагаю, что вы используете Bootstrap 4. *):

<div class="row">
    <div class="col-12">
        <!-- That top row - full width -->
        <!-- ## notizen here ## -->
    </div>
</div>

<div class="row">
    <div class="col-8">
         <!-- second row - two thirds of width -->
         <!-- Wiedervorlagen here -->
    </div>
    <div class="col-4">
         <!-- second row, second column - one thirds of width -->
         <!-- Geburtstage here -->
    </div>
</div>

Теперь вам нужно использовать дополнительные партиалы для отображения данных в нужных местах. Например, ваши 'notizen' данные теперь являются $notizen переменными в этом представлении. Однако мы не используем его в этом представлении, поэтому давайте передадим его в созданный ранее фрагмент, например, так:

<?= $this->partial('partial/notizen-partial, ['notizen' => $notizen]) ?>

Здесь много чего происходит:

  • Вызов partial ViewHelper (посмотрите в папке этого файла, чтобы увидеть другие ViewHelpers уже доступны!)
  • Передав ему имя партиала, которое мы установили в конфигурации ранее
  • Передача пар ключ / значение. Ключи будут именами переменных, значения будут их значениями (вы можете добавить столько, сколько вам нужно / нужно)

Поместите этот вызов в вашем действии, например:

<div class="row">
    <div class="col-12">
        <!-- That top row - full width -->
        <?= $this->partial('partial/notizen-partial, ['notizen' => $notizen]) ?>
    </div>
</div>

И все готово.


Теперь у вас есть:

  • Отдельные партиалы для отображения наборов данных
  • Использование ViewHelpers, поэтому вы можете перерабатывать одно и то же представление в разных местах вашего приложения
  • Отдельные проблемы вашего кода (отображение в файлах шаблонов phtml, сбор / обработка данных в контроллере, логика в репозиториях / моделях / объектах)

Я старательно игнорировал вашу вставленную форму. Принцип для этого тот же, вы можете передать $form в частичную часть, и эта частичная часть будет содержать отображение формы. Создание чего-то многоразового использования.

Если вы хотите узнать больше о настройке Form ViewHelpers (например, FormRow, FormElement, FormNumber и т. Д.), См. ответов, которые я дал другим , таких как this .

...