Bonjour,

J'ai créer un formulaire sur lequel les utilisateurs peuvent ajouter autant de champs que necessaire, le problème c'est que côté php je ne sais pas trop comment gérer ça pour sauvegarder dans la base, pour le moment je stocke les données dans un tableau pour ensuite le stocker dans une table, jusque là pas trop de souci, bien que je me demande si il n'y a pas plus simple ?

Voici mon formulaire :

<div class="delete input text">
<input type="text" name="feature_bis]" id="'+i+'" ><a class="suppr'+i+'" href="#" title="">
<img src="../../img/button-remove.png" alt=""></a></div>

Je stocke chaque données dans le tableau feature_bis et ensuite côté contrôller :

public function admin_edit($id = null){
        // J'ai des données
        if (!empty($this->request->data)){
            // Je peux sauvegarder les infos
            $this->Offer->save(array(
                'name' => $this->request->data'Offer']'name'],
                'price' => $this->request->data'Offer']'price'],
                'submenu_id' => $this->request->data'Offer']'submenu_id'],
                'feature' => $this->request->data'Offer']'feature']
            ));
            $this->Session->setFlash("Votre offre a bien été édité", "flash");
            return $this->redirect($this->referer());
        }else if($id){
            $this->request->data = $this->Offer->findById($id);
            debug($this->request->data'Offer']'feature']);
        }
        $submenus = $this->Offer->Submenu->find('list');
        $this->set(compact("submenus"));
    }

Après un debug de $this->request->data j'obtien deux tableaux :

array(
    'feature_bis' => array(
        (int) 0 => 'mysql',
        (int) 1 => 'mysql'
    ),
    'Offer' => array(
        'name' => 'Pro',
        'id' => '',
        'price' => '50',
        'submenu_id' => '34',
        'feature' => 'PHP5'
    )
)

j'ai rajouter avant le save :

$this->Offer->create(array(
                'feature_bis' => $this->request->data'feature_bis'])
            );

Ensuite j'ai créer le beforeSave() et fait un debug($this->data); et cette fois j'obtiens :

array(
    'Offer' => array(
        'feature_bis' => array(
            (int) 0 => 'mysql',
            (int) 1 => 'cloud'
        ),
        'name' => 'Pro',
        'price' => '50',
        'submenu_id' => '34',
        'feature' => 'PHP5'
    )
)

Je pense que c'est par là qu'il faut aller, mais comment dans un seul champs je vais pouvoir stocker les valeurs de feature_bis ?
Le problème est que je ne vois pas comment je peux sauvegarder feature_bis en base

Merci d'avance !

4 réponses


Maenhyr
Réponse acceptée

Salut, tu vas devoir encoder ton tableau en json pour l'enregistrer en base. Après il te faudra décoder ta String json. A mon sens c'est une solution plutôt simple pour une base de données relationelle.

TuxBoyBzh
Auteur
Réponse acceptée

En fait j'ai trouvé, ça fonctionne nickel :) Je ne sais pas si c'est la meilleur façon de faire la façon dite "propre", j'aimerai votre avis :

Après la saisie des données via l'utilisateur, donc il peut ajouter autant de champs qu'il le souhaite,
dans le controller edit je fais les vérification basic le voici :

public function admin_edit($id = null){
        // Récupère l'offre
        if ($id){
            $offre = $this->Offer->find('first', array(
                'conditions' => array('Offer.id' => $id)
            ));
        }
        // Des données ont été postées
        if (!empty($this->request->data)){
            $this->request->data'Offer']'id'] = null;
            if (isset($offre)) $this->request->data'Offer']'id'] = $id;
            // Je peux sauvegarder les infos
            $this->Offer->create(array(
                'feature_bis' => $this->request->data'feature_bis'],
                'id' => $this->request->data'Offer']'id'],
                'name' => $this->request->data'Offer']'name'],
                'price' => $this->request->data'Offer']'price'],
                'submenu_id' => $this->request->data'Offer']'submenu_id'],
                'feature' => $this->request->data'Offer']'feature']
            ));
            // Je sauvegarde les données
            $this->Offer->save();
            $this->Session->setFlash("Votre offre a bien été édité", "flash");
            return $this->redirect($this->referer());
        }else if($id){
            $this->request->data = $this->Offer->findById($id);
            $this->request->data'Offer']'feature_bis'] = json_decode($this->request->data'Offer']'feature_bis']);
            //debug($this->request->data); die();
        }
        $submenus = $this->Offer->Submenu->find('list');
        $this->set(compact("submenus"));
    }

Ensuite avant la sauvegarde dans le beforeSave() j'encode le champs feature_bis afin de le sauvegarder en base comme suggéré par
prbaron :

public function beforeSave($options = array()){
        // J'ai des données dans le champs, je peux encoder
        if (
            isset($this->data'Offer']'feature_bis']) &&
            !empty($this->data'Offer']'feature_bis'])
        ){
            $this->data'Offer']'feature_bis'] = json_encode($this->data'Offer']'feature_bis']);
        }
        return true;
    }

Ensuite pour l'édition je vérifie dans la vu si $this->request->data n'est pas vide, si pas vide alors c'est une édition et je récupère les données du champs feature_bis après un json_decode et je les affiche :

<?= $this->Form->input('feature', array('label' => 'Caractéristique')); ?>
        <?php if (!empty($this->request->data)): ?>
            <?php foreach ($this->request->data'Offer']'feature_bis'] as $key => $v): ?>
                <div class="delete input text">
                    <input type="text" name="feature_bis]" value="<?= $v; ?>">
                </div>
            <?php endforeach ?>
        <?php endif; ?>

Voilà, je veux juste savoir si c'est la bonne méthode!

Merci d'avance !

D'accord merci pour ta reponse. Je vais essayer ça ;)

Bonjour,

Dans ta fonction add appelé par le jquery, tu fais un return ou un exit ou même un json_encode() ?