【问题标题】:CakePHP 3 - How to automatically show form errors for multiple new entities?CakePHP 3 - 如何自动显示多个新实体的表单错误?
【发布时间】:2017-01-21 16:37:31
【问题描述】:

我正在尝试利用对使用多个实体的表单的验证和显示错误的任何自动处理。

用户可以通过表单 UI 动态创建多个新实体。数据通过newEntities()进行编组:

$this->MyModel->newEntities($data);

我遇到的问题的第一部分是,为了检查任何实体的验证是否失败,我必须通过检查每个实体来手动完成:

$errors = false;
foreach ($entities as $entity) {
    if ($entity->errors()) {
        $errors = true;
        break;
    }
}
if (!$errors) {
    // Save...

Cake 是否提供开箱即用的功能,可让您检查 newEntities() 是否在其任何实体上验证失败?如果没有,那没关系……

主要问题是我如何从单个实体中获取错误,然后在相关输入旁边的表单中内联显示。

<?= $this->Form->create(); ?>

我可以将什么传递给create() 以将其链接到实体?目前似乎没有任何方法可以知道提交表单后会发生什么,因此不会显示错误。

我的表单输入是使用标准数组表示法创建的,其中$i 来自构建来自所有实体的表单输入的循环。

$this->Form->hidden("MyModel.$i.field");

【问题讨论】:

  • CakePHP 中默认没有“主数组”。您必须在代码中做错事,因为编组器将在创建新实体时触发验证。如果您想了解如何以及在何处查看编组器代码,请查看编组器代码。如果一切正常,Cake 会在您的表单中自动显示错误。请参阅编组器中的 many() 和 one() 方法。 api.cakephp.org/3.3/source-class-Cake.ORM.Marshaller.html 你会看到它在那里验证。不需要在实体上调用 errors() 来触发验证。实体水化是必需的,但默认启用。
  • @burzum 查看更新的问题。我知道编组是如何工作的,这不是真正的问题。更重要的是如何在控制器中检查任何实体无效,以及如何将表单链接到多个实体以便在视图中显示内联错误?
  • 嗯,这个问题听起来不像你。为什么需要在控制器中检查?如果 save() 返回 false,则可能是验证或应用程序规则失败。如果您的表单字段符号是正确的,并且实体传递回表单,它们应该会自动显示。这将有助于显示表单和数据结构,一个完整的示例。
  • @burzum "...实体传递回表单" 对,但我该怎么做呢?使用单个实体可以将其传递给FormHelper::create(),但如何为实体数组执行此操作,以便通过FormHelper 显示错误?那是我不知道的部分。

标签: php validation cakephp cakephp-3.0


【解决方案1】:

使用 newEntity 并将它们添加到数组中。遍历该数组访问 errors()。

$array = [];
$array[] = $TableRegistry->newEntity([
    'hi' => 'hey'
]);

foreach($array as $r){
    var_dump($r->errors());
}

希望这适用于您的用例。我从未使用过 newEntities,但您也可以对其进行迭代?

【讨论】:

  • 框架的编组器正是在内部执行此操作。浏览代码路径,您会看到它。 api.cakephp.org/3.3/…
【解决方案2】:

只需将实体数组传递给您的表单

$this->Form->create($entities);

您也不必在输入名称中指定型号名称。简单的

$this->Form->hidden("$i.field");

而不是

$this->Form->hidden("MyModel.$i.field");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多