Проверка формы HABTM с CakePHP 2.x

У меня есть отношение HABTM, как: Post <-> Tag (сообщение может иметь несколько тегов, и то же самое с другой стороны).

Эта работа с множественным выбором флажка, созданного Cakephp. Но я хочу иметь хотя бы один тег для каждого поста и выдавать ошибку, если кто-то попытается вставить сироту.

Я ищу самый чистый / самый CakePHP похожий способ сделать это.


Это более или менее обновление этого Проверка формы HABTM в CakePHP вопрос, так как я получаю ту же проблему на моем CakePHP 2.7 (последний CakePHP 2.x на данный момент с поддержкой PHP 5.3 на дату 2016 года) и не могу найти хороший способ сделать это.

-2

Решение

Вот то, что я считаю лучшим на данный момент. Он использует поведение CakePHP 3.x для проверки HABTM.

Я предпочитаю работать только в модели с наиболее общим кодом.

В вашем AppModel.phpустановите это beforeValidate() а также afterValidate()

class AppModel extends Model {
/** @var array set the behaviour to `Containable` */
public $actsAs = array('Containable');

/**
* copy the HABTM post value in the data validation scope
* from data[distantModel][distantModel] to data[model][distantModel]
* @return bool true
*/
public function beforeValidate($options = array()){
foreach (array_keys($this->hasAndBelongsToMany) as $model){
if(isset($this->data[$model][$model]))
$this->data[$this->name][$model] = $this->data[$model][$model];
}

return true;
}

/**
* delete the HABTM value of the data validation scope (undo beforeValidate())
* and add the error returned by main model in the distant HABTM model scope
* @return bool true
*/
public function afterValidate($options = array()){
foreach (array_keys($this->hasAndBelongsToMany) as $model){
unset($this->data[$this->name][$model]);
if(isset($this->validationErrors[$model]))
$this->$model->validationErrors[$model] = $this->validationErrors[$model];
}

return true;
}
}

После этого вы можете использовать свою проверку в вашей модели следующим образом:

class Post extends AppModel {

public $validate = array(
// [...]
'Tag' => array(
// here we ask for min 1 tag
'rule' => array('multiple', array('min' => 1)),
'required' => true,
'message' => 'Please select at least one Tag for this Post.'
)
);

/** @var array many Post belong to many Tag */
public $hasAndBelongsToMany = array(
'Tag' => array(
// [...]
)
);
}

Этот ответ используют:

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]