如何在网格视图中显示表单
how to show a form in a grid view
我正在尝试使用网格视图。我显示不同的内容,以便用户可以拥有类似仪表板的东西。
请看截图:
通知区域应该是一个搜索表单。
这是我的控制器动作的一部分:
$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>
当我发布这篇文章时,我认为我需要使用搜索脚本重定向到控制器操作。现在我将它复制到同一个控制器动作。所以它有效,对我来说没问题。
对于有相同理解问题的任何人,这里是更改控制器操作的一部分:
$form = new SearchForm(NULL);
$form->get('submit')->setValue('suche');
return new ViewModel([
'wvs' => $this->wvTable->fetchAll(),
'form' => $form,
'aps' => $this->ansprechpartnerTable->getGeburtstage()
]);
你真的应该学会 create partials。你现在所做的是混合关注。
你在控制器中所做的事情会给你带来巨大的混乱if/when你必须重构。
使用偏音你会做这样的事情。
文件: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',
],
],
确保根据您的情况更正路径!!!
对每个 "container" 数据处理(wvs
、aps
等)重复上述操作。
接下来,执行一个操作return您需要查看的数据:
// ... create/get data
return [
'wvs' => $this->wvTable->fetchAll(),
'notizen' => $this->notizenTable->fetchAll(),
'aps' => $this->ansprechpartnerTable->getGeburtstage(),
];
这转到 "action-view.phtml",或其他任何内容。此文件处理 "place data where it needs to be".
根据您的屏幕截图,视图的布局将是这样的(我假设您使用 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!)
- 将我们之前在配置中设置的部分名称传递给它
- 传递 key/value 对。键将是变量名,值将是它们的值(您可以添加任意多个 like/need)
将此调用放在您的操作视图中,如下所示:
<div class="row">
<div class="col-12">
<!-- That top row - full width -->
<?= $this->partial('partial/notizen-partial, ['notizen' => $notizen]) ?>
</div>
</div>
大功告成。
您现在拥有:
- 显示数据集合的单个部分
- 使用 ViewHelpers,因此您可以在整个应用程序的不同位置回收相同的视图
- 分离代码的关注点(继续在 phtml 模板文件中显示,在 Controller 中保留数据收集/处理,在 Repositories/Models/Entities 中保留逻辑)
我故意忽略了你粘贴的表格。其原理是相同的,您可以将 $form
传递给一个部分,并让该部分包含表单的显示。创建可重复使用的东西。
如果您想了解有关自定义 Form ViewHelper(例如 FormRow、FormElement、FormNumber 等)的更多信息,请参阅 answers I've given others, such as 。
我正在尝试使用网格视图。我显示不同的内容,以便用户可以拥有类似仪表板的东西。
请看截图:
通知区域应该是一个搜索表单。
这是我的控制器动作的一部分:
$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>
当我发布这篇文章时,我认为我需要使用搜索脚本重定向到控制器操作。现在我将它复制到同一个控制器动作。所以它有效,对我来说没问题。 对于有相同理解问题的任何人,这里是更改控制器操作的一部分:
$form = new SearchForm(NULL);
$form->get('submit')->setValue('suche');
return new ViewModel([
'wvs' => $this->wvTable->fetchAll(),
'form' => $form,
'aps' => $this->ansprechpartnerTable->getGeburtstage()
]);
你真的应该学会 create partials。你现在所做的是混合关注。
你在控制器中所做的事情会给你带来巨大的混乱if/when你必须重构。
使用偏音你会做这样的事情。
文件: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',
],
],
确保根据您的情况更正路径!!!
对每个 "container" 数据处理(wvs
、aps
等)重复上述操作。
接下来,执行一个操作return您需要查看的数据:
// ... create/get data
return [
'wvs' => $this->wvTable->fetchAll(),
'notizen' => $this->notizenTable->fetchAll(),
'aps' => $this->ansprechpartnerTable->getGeburtstage(),
];
这转到 "action-view.phtml",或其他任何内容。此文件处理 "place data where it needs to be".
根据您的屏幕截图,视图的布局将是这样的(我假设您使用 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!) - 将我们之前在配置中设置的部分名称传递给它
- 传递 key/value 对。键将是变量名,值将是它们的值(您可以添加任意多个 like/need)
将此调用放在您的操作视图中,如下所示:
<div class="row">
<div class="col-12">
<!-- That top row - full width -->
<?= $this->partial('partial/notizen-partial, ['notizen' => $notizen]) ?>
</div>
</div>
大功告成。
您现在拥有:
- 显示数据集合的单个部分
- 使用 ViewHelpers,因此您可以在整个应用程序的不同位置回收相同的视图
- 分离代码的关注点(继续在 phtml 模板文件中显示,在 Controller 中保留数据收集/处理,在 Repositories/Models/Entities 中保留逻辑)
我故意忽略了你粘贴的表格。其原理是相同的,您可以将 $form
传递给一个部分,并让该部分包含表单的显示。创建可重复使用的东西。
如果您想了解有关自定义 Form ViewHelper(例如 FormRow、FormElement、FormNumber 等)的更多信息,请参阅 answers I've given others, such as