2016-10-21 46 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種方式,效果很好,我甚至可以將錯誤定位在所有圖像輸入的上方。 –