3 votes

cakephp a de nombreuses données de formulaire

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();
    }
}

1voto

Leo Points 1058

Dans votre formulaire, itérez le nombre d'éléments que vous souhaitez afficher en suivant le modèle suivant

for/while/do()
{       
    $counter++
    $this->Form->text('Product.'.$counter.'.price');
    $this->Form->text('Product.'.$counter.'.description');

}

0voto

DavidYell Points 6500

J'utiliserais saveAll() pour cela, car il est conçu pour sauvegarder automatiquement un enregistrement et tous les enregistrements qui lui sont liés, en supposant que vos identifiants figurent dans les données et que celles-ci sont correctement formatées.

http://book.cakephp.org/2.0/en/models/saving-your-data.html#model-saveall-array-data-null-array-options-array

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X