CakePHP 3.x 具有 11 种不同模型的搜索表单
CakePHP 3.x search form with 11 different models
我在 CakePHP 3.5.13 中有一个应用程序。该应用程序连接到遗留数据库 - 也就是说它没有根据 Cake 的命名约定编写。
我已经烘焙了生成一些 Table
和 Entity
类.
的应用程序
应用程序的一部分允许用户执行搜索。我想使用 Form Helper 但不确定如何 name/configure 事情:
搜索表单所在的模板文件有 11 个文本输入。其中每一个都与存储在数据库中的数据有关。为简洁起见,我将考虑前 3 个字段。这些与 Table
类:
- CAS 编号 - 与
CasTable
有关
- EC 编号 - 与
EcsTable
有关
- 物质名称 - 与
SubstancesTable
相关
打开表单标签时,我做了以下操作:
<?php echo $this->Form->create(null, [
'url' => ['controller' => 'Front', 'action' => 'search'] ]); ?>
我将 null
作为第一个参数传递的原因是因为我不知道我是否应该使用 Entity
的实例(如 docs),但不确定是哪一个,因为有 11 个输入,所有这些输入都与不同的 Table
类 相关联。所以我相信 null
在这里是正确的 - 请有人能澄清一下吗?
我也不确定如何命名我的输入。例如搜索 "CAS Number" 的输入需要在数据库字段 cas.value
上进行搜索。那么我会这样命名输入吗?
echo $this->Form->control('cas.value' ... );
我希望能够根据适当模型中的规则验证每个字段。因为有 11 个不同的字段,并且表单既不充当 "add" (SQL INSERT
) 也不充当 "edit" (SQL UPDATE
) 函数,我无法按照 Cake 文档来理解我应该如何对此进行编码。
总而言之,我想做的是构建一个 HTML 表单 - 使用 Cake 的表单助手语法 - 具有 11 个字段,所有这些字段都与适当的模型相关联。我希望能够根据这些模型的规则验证字段。我怎样才能做到这一点?我已经对此进行了研究,但看不到任何这样做的例子 - 大多数都集中在 inserting/updating 数据上。我还查看了 Modeless Forms,但我认为这不对,因为在这种情况下我确实有搜索数据的模型。
目前,我只是将表单编写为 vanilla HTML,并且可以通过 $this->request->data()
访问发布到 FrontController::search()
的数据。虽然这可行,但我认为这是一个坏主意,因为我必须以某种方式 运行 验证方法,并且它可能会导致重新填充表单或稍后使用 ORM 时出现问题。我在这里可能是错的,但我正在寻找一种使用 Cake 约定的解决方案,特别是关注在这种情况下正确使用 Form Helper。
我实际上不明白为什么你必须验证搜索(我认为如果由于某种原因其中一个搜索输入不正确,那么查询将简单地 return 零记录)但我猜你有你的理由,所以这里是如何做到这一点。无论如何,这甚至适用于保存实体所以:
使用命名约定
为您的控件使用 g cake 命名约定
即使您的数据库命名不符合蛋糕标准,它也能正常工作。
创建验证规则
然后在 table 的 each 中创建验证集。您可以为不同的用途(保存、更新、搜索)创建不同的验证(参见 here)。在您的情况下,您想为搜索创建一个集合。
因此在您的 table 中(在每个 table 中)您可以创建一个名为 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 , [ /*... */ ]); ?>
因此表单知道实体、要应用的验证规则和要显示的验证错误
创建控件
假设您有一个 "main" table,这意味着所有其他 table 都与此相关。假设它是物质。所以遵循约定。
<?= $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/search 插件。有这么多领域要检查,它将简化您的生活
我在 CakePHP 3.5.13 中有一个应用程序。该应用程序连接到遗留数据库 - 也就是说它没有根据 Cake 的命名约定编写。
我已经烘焙了生成一些 Table
和 Entity
类.
应用程序的一部分允许用户执行搜索。我想使用 Form Helper 但不确定如何 name/configure 事情:
搜索表单所在的模板文件有 11 个文本输入。其中每一个都与存储在数据库中的数据有关。为简洁起见,我将考虑前 3 个字段。这些与 Table
类:
- CAS 编号 - 与
CasTable
有关
- EC 编号 - 与
EcsTable
有关
- 物质名称 - 与
SubstancesTable
相关
打开表单标签时,我做了以下操作:
<?php echo $this->Form->create(null, [
'url' => ['controller' => 'Front', 'action' => 'search'] ]); ?>
我将 null
作为第一个参数传递的原因是因为我不知道我是否应该使用 Entity
的实例(如 docs),但不确定是哪一个,因为有 11 个输入,所有这些输入都与不同的 Table
类 相关联。所以我相信 null
在这里是正确的 - 请有人能澄清一下吗?
我也不确定如何命名我的输入。例如搜索 "CAS Number" 的输入需要在数据库字段 cas.value
上进行搜索。那么我会这样命名输入吗?
echo $this->Form->control('cas.value' ... );
我希望能够根据适当模型中的规则验证每个字段。因为有 11 个不同的字段,并且表单既不充当 "add" (SQL INSERT
) 也不充当 "edit" (SQL UPDATE
) 函数,我无法按照 Cake 文档来理解我应该如何对此进行编码。
总而言之,我想做的是构建一个 HTML 表单 - 使用 Cake 的表单助手语法 - 具有 11 个字段,所有这些字段都与适当的模型相关联。我希望能够根据这些模型的规则验证字段。我怎样才能做到这一点?我已经对此进行了研究,但看不到任何这样做的例子 - 大多数都集中在 inserting/updating 数据上。我还查看了 Modeless Forms,但我认为这不对,因为在这种情况下我确实有搜索数据的模型。
目前,我只是将表单编写为 vanilla HTML,并且可以通过 $this->request->data()
访问发布到 FrontController::search()
的数据。虽然这可行,但我认为这是一个坏主意,因为我必须以某种方式 运行 验证方法,并且它可能会导致重新填充表单或稍后使用 ORM 时出现问题。我在这里可能是错的,但我正在寻找一种使用 Cake 约定的解决方案,特别是关注在这种情况下正确使用 Form Helper。
我实际上不明白为什么你必须验证搜索(我认为如果由于某种原因其中一个搜索输入不正确,那么查询将简单地 return 零记录)但我猜你有你的理由,所以这里是如何做到这一点。无论如何,这甚至适用于保存实体所以:
使用命名约定
为您的控件使用 g cake 命名约定即使您的数据库命名不符合蛋糕标准,它也能正常工作。
创建验证规则
然后在 table 的 each 中创建验证集。您可以为不同的用途(保存、更新、搜索)创建不同的验证(参见 here)。在您的情况下,您想为搜索创建一个集合。
因此在您的 table 中(在每个 table 中)您可以创建一个名为 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 , [ /*... */ ]); ?>
因此表单知道实体、要应用的验证规则和要显示的验证错误
创建控件
假设您有一个 "main" table,这意味着所有其他 table 都与此相关。假设它是物质。所以遵循约定。
<?= $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/search 插件。有这么多领域要检查,它将简化您的生活