2016-10-21 24 views
0

在我ContentsTable,我添加了这样的应用程序规则,并确保至少一个ImageEntity添加到ContentEntity保存时:如何让RulesChecker向关联的模型添加错误?

public function buildRules(RulesChecker $rules) { 
    $rules 
     ->add(function($entity, $options) { 
      return $entity->get('type') !== 'gallery' || count($entity->images) > 0; 
     }, 'validDate', [ 
      'errorField' => 'images.0.image', 
      'message' => 'Lade mindestens ein Bild hoch!' 
     ]); 

    return $rules; 
} 

规则是应用,因为save()失败了,但我本来期望对这种形式的输入出现在Contents/edit.ctp定义的错误消息:

<?php echo $this->Form->input('images.0.image', [ 
    'label' => 'Neues Bild (optional)', 
    'type' => 'file', 
    'required' => false 
]); ?> 

据,但是,不是在所有加入。

如何设置errorField选项将错误添加到此字段?

+0

忽视你的形象是可选的和强制性的同时,你有没有加入这一领域的独特验证?那么规则消息将不会显示。 –

+0

不,我对ImageTable本身没有验证。图像输入是可选的,因为它们有多个(image.0.image,image.1.image,images.2.image等)。它们都不是必需的,但我仍然需要检查以确保至少有一个保存图像。 –

回答

1

指定路径是不可能的,同样在实体上下文中,错误应该出现在实际的实体对象上,所以即使可以指定路径,也不会有实体来设置错误上。

你总是可以自己修改规则中的实体,但是我并不是非常相信这是个好主意。不管怎么说,你所要做的,是包含与在image领域适当的错误一个实体,沿着线的东西的清单,以填补images属性:

->add(function($entity, $options) { 
    if ($entity->get('type') !== 'gallery' || count($entity->images) > 0) { 
     return true; 
    } 

    $image = $this->Images->newEntity(); 
    $image->errors('image', 'Lade mindestens ein Bild hoch!'); 

    $entity->set('images', [ 
     $image 
    ]); 

    return false; 
}); 

另一种选择,这在我感觉有点清洁剂,将设置错误的images财产,并在形式手动评估它,即是这样的:

->add(
    function($entity, $options) { 
     return $entity->get('type') !== 'gallery' || count($entity->images) > 0; 
    }, 
    'imageCount', 
    [ 
     'errorField' => 'images', 
     'message' => 'Lade mindestens ein Bild hoch!' 
    ] 
); 
if ($this->Form->isFieldError('images')) { 
    echo $this->Form->error('images'); 
} 

又见

+0

非常感谢。我不知道我实际上可以修改规则中的实体。无论如何,我选择了第2种方式,效果很好,我甚至可以将错误定位在所有图像输入的上方。 –