如何在网格视图中显示表单

时间:2019-03-26 14:38:50

标签: zend-framework zend-form zend-framework3 zend-view

我正在尝试一些网格视图。我显示了不同的内容,以便用户可以使用仪表板之类的东西。

请看一下屏幕截图:

enter image description here

通知区域应该是搜索表单。

这是我的控制器动作的一部分:

 $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();

我的问题是如何更改通知区域,使其与表格一起使用? 我尝试了不同的可能性,但得出的结论是我不了解这种情况下的逻辑。 任何帮助或解释表示赞赏。

解决方案:

好吧,在我想尝试使用所描述的概念以了解与局部变量的区别之前,我更改为局部变量。我以前使用过分片,我的挑战实际上只是表格,现在希望很清楚。但是无论哪种方式,带有分部的概念都更加方便和可读。

所以,我像建议的那样更改了视图脚本,为完成这一点,请使用以下格式:

<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>

发布此邮件时,我想我需要使用搜索脚本重定向到控制器Action。现在,我将其复制到相同的控制器操作中。这样就可以了,对我来说还可以。 对于有相同理解问题的任何人,此处更改了控制器操作的一部分:

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

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

1 个答案:

答案 0 :(得分:2)

您应该真正学会create partials。您现在正在做的事情令人担忧。

如果/当您需要重构时,您在控制器中执行的操作会给您带来极大混乱。

对于局部函数,您将执行以下操作。

文件: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(在PHP的顶部)。您可以添加一些验证,以确认数组实际存在,包含值等,但这取决于您。

现在,使用以下配置在模块的配置中注册此部分:

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

请确保您根据自己的情况改正了路径!!!

对数据处理的每个小“容器”(wvsaps等)重复以上操作。


下一步,执行一个操作,将所需的数据返回到视图:

// ... 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(在此文件的文件夹中查找,以查看其他可用的ViewHelper!)
  • 传递它的名称,这是我们在前面的配置中设置的。
  • 传递键/值对。键将是变量名,值将是它们的值(您可以根据需要添加任意数量)

将此呼叫放置在您的操作视图中,如下所示:

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

您已完成。


您现在拥有:

  • 单个局部以显示数据集合
  • 使用ViewHelpers,因此您可以在整个应用程序的不同位置回收相同的视图
  • 您对代码的关注(保留在phtml模板文件中显示,在Controller中保留了数据收集/处理,在Repository / Models / Entities中保留了逻辑)

我故意忽略了您粘贴的表单。其原理是相同的,您可以将$form传递给部分内容,并让该部分内容包含表格的显示。创建一些可重用的东西。

如果您想了解有关自定义Form ViewHelpers(例如FormRow,FormElement,FormNumber等)的更多信息,请参阅answers I've given others,例如this one