Je veux enregistrer plusieurs catégories pour un produit.
J'ai les modèles :
Category.php
public $hasAndBelongsToMany = array(
'Product' => array(
'className' => 'Product',
'joinTable' => 'product_categories',
'foreignKey' => 'category_id',
'associationForeignKey' => 'product_id',
'unique' => 'keepExisting',
)
);
Product.php
public $hasMany = array(
'ProductCategory' => array(
'className' => 'ProductCategory',
'foreignKey' => 'product_id',
'dependent' => false,
),
ProductCategory.php
public $belongsTo = array(
'Product' => array(
'className' => 'Product',
'foreignKey' => 'product_id',
),
'Category' => array(
'className' => 'Category',
'foreignKey' => 'category_id',
)
);
Ainsi, dans la vue Produit/Ajout, j'ajoute un ensemble de cases à cocher de la catégorie par :
echo $this->Form->input('ProductCategory.category_id',array(
'label' => __('Category',true),
'type' => 'select',
'multiple' => 'checkbox',
'options' => $categories
));
Mais cela produit un ensemble d'entrées avec les noms de : name="data[ProductCategory][category_id][]"
plutôt que name="data[ProductCategory][0][category_id]"
le zéro étant incrémenté.
S'ils sont dans le format avec la clé entre le modèle et le champ, alors je peux utiliser saveAll() ? Comme elles sont dans le format que je reçois, je devrais manipuler la requête->données pour les mettre dans le format que je veux pour pouvoir utiliser save().
Est-ce que je m'y prends de la bonne manière ? Ou peut-être mes modèles sont-ils mal configurés ?
De même, que se passe-t-il lors de la modification des données hasMany ? Que se passe-t-il si, par exemple, je décoche une option et en ajoute une autre ? Le gâteau supprime-t-il automatiquement tous les enregistrements associés avant d'en ajouter de nouveaux ?
EDIT.
En fait, ce que je demande, c'est s'il existe un moyen meilleur ou plus rapide de faire cela, qui fonctionne actuellement :
if ($this->Product->save($this->request->data)) {
$this->Product->ProductCategory->deleteAll(array('ProductCategory.product_id' => $this->Product->id));
foreach ($this->request->data['ProductCategory']['category_id'] as $cat_id) {
$this->Product->ProductCategory->create();
$this->Product->ProductCategory->set(array(
'product_id' => $this->Product->id,
'category_id' => $cat_id
));
$this->Product->ProductCategory->save();
}
}