带有11种不同模型的CakePHP 3.x搜索表单

时间:2018-05-02 08:39:27

标签: cakephp cakephp-3.0

我在CakePHP 3.5.13中有一个应用程序。该应用程序连接到遗留数据库 - 也就是说它没有根据Cake的命名约定编写。

我已经对已生成一些TableEntity类的应用程序进行了烘焙。

部分应用程序允许用户执行搜索。我想要使​​用Form Helper,但我不确定如何命名/配置内容:

搜索表单所在的模板文件有11个文本输入。这些中的每一个都与存储在数据库中的数据有关。为简洁起见,我将考虑前3个字段。这些与Table类相关联:

  • CAS编号 - 与CasTable
  • 相关
  • EC编号 - 与EcsTable
  • 相关
  • 物质名称 - 与SubstancesTable
  • 相关

打开表单标记时,我已完成以下操作:

<?php echo $this->Form->create(null, [
'url' => ['controller' => 'Front', 'action' => 'search'] ]); ?>

我之前null作为第一个参数的原因是因为我不知道我是否应该使用Entity的实例(如Table中所述{3}}),但不确定哪一个,因为有11个输入都与不同的null类相关联。所以我相信cas.value在这里是正确的 - 请有人澄清一下吗?

我也不确定如何命名我的输入。例如,输入搜索&#34; CAS编号&#34;需要在数据库字段echo $this->Form->control('cas.value' ... ); 上进行搜索。那么我会像这样命名输入吗?

INSERT

我希望能够根据适当模型中的规则验证每个字段。因为有11个不同的字段,并且表单不是&#34;添加&#34; (SQL UPDATE)或&#34;编辑&#34; (SQL FrontController::search())函数,我不能按照Cake文档来理解我应该如何编写代码。

总之,我尝试做的是构建一个HTML表单 - 使用Cake的Form Helper语法 - 包含11个字段,所有字段都与相应的模型相关联。我希望能够根据这些模型的规则验证字段。我怎样才能做到这一点?我已经对它进行了研究,但看不到任何这样做的例子 - 大多数都专注于插入/更新数据。我也看过docs,但不要认为这是正确的,因为在这种情况下,我确实有搜索数据的模型。

目前,我只是将表单编写为vanilla HTML,并且可以通过$this->request->data()访问发布到v-if的数据。虽然这是有效的,但我认为这是一个坏主意,因为我必须以某种方式运行验证方法,并且可能导致重新填充表单或稍后使用ORM的问题。我可能在这里错了,但我正在寻找一种使用Cake约定的解决方案,特别注重在这种情况下正确使用Form Helper。

感谢任何帮助或建议。

1 个答案:

答案 0 :(得分:1)

我实际上并不明白为什么你必须验证搜索(我认为如果某个搜索输入由于某种原因不正确,那么查询将只返回零记录)但我猜你有你的理由所以这里是怎么做的。无论如何,这甚至可以用于保存实体:

使用命名约定

首先使用针对您的控件的g cake命名约定,如herehere

所述

即使您的数据库命名不符合蛋糕标准,它仍然有效。

创建验证规则

然后在表格的每个中创建验证集。您可以为不同的使用(保存,更新,搜索)创建不同的验证(请参阅here)。在您的情况下,您想要为搜索创建一个集。

所以在你的表中(在每个表中!)你可以创建一个名为validationSearch

的方法
public function validationSearch($validator)
{
    $validator
        ->add('title', 'notEmpty', [
            'rule' => 'notEmpty',
            'message' => __('You need to provide a title'),
        ]);
    return $validator;
}

修补实体

然后在你FrontController你可以做

$this->loadModel('Substances');
$substance = $this->Substances->newEntity(
    $this->request->getData(),
    [
        'validate' => 'search', // tells cake to use validateSearch
                                // for Substances Table
        'associated' => [
            'Cas' => [
                'validate' => 'search', // you want to use validateSearch
                                        // even for this table
            ],
            'Ecs'=> [
                'validate' => 'search', // and for this table, too
            ],
            // list of other related tables here
            // you can nest the array if you have
            // nested relationships
        ]
    ]
);

这将创建一个包含您数据的实体,但最重要的是它会检查验证问题并将错误存储在$substance实体中。

$this->set('substance', $substance );

以上内容会将您新创建的实体传递给表单

创建表单

最后在视图中

<?php echo $this->Form->create($substance , [ /*... */ ]); ?>

因此表单知道实体,要应用的验证规则以及要显示的验证错误

创建控件

假设您有一个“主”表,这意味着所有其他表都以某种方式与此相关。让我们说它是物质。所以遵循惯例。

<?= $this->Form->control('name', ['label' => 'Substance name') ?> 
//                        ^ No need to prepend the table here
<?= $this->Form->control('cas.number', ['label' => 'Cas number') ?>
<?= $this->Form->control('ecs.number', ['label' => 'Ecs number') ?>

使用插件

并考虑使用FriendsOfCake /搜索插件。有这么多领域来检查它会简化你的生活