CakePHP-Fr.Org

Forum francophone du Framework CakePHP

Vous n'êtes pas identifié.

#1 17-09-2016 15:57:37

nvalyfofana
Eclair café
Date d'inscription: 15-06-2016
Messages: 43

Enregistrer un multiple select dans une BD

Bonjour, j'aimerais enregistrer dans une table une sélection multiple de ma liste déroulante dynamique.
Pour ce faire, j'utilise Cakephp 3.2 et voici mon code de sélection multiple:

<div class="form-group">
  <label class="form-label">Destination *<span  style="color: red">(obligation)</span></label>
      <?= $this->Form->select("communes_id", $communes, $options = ['empty'=> true, 'multiple' => true]) ?>
</div>


En effet, j'arrive à sélectionner plusieurs éléments de ma liste déroulante mais le problème se situe au niveau de l'enregistrement dans la BD.

Voici mon controller d'ajout:


  public function add()
    {
        $mission = $this->Missions->newEntity();
        if ($this->request->is('post')) {
            $mission = ($this->Missions->patchEntity($mission, $this->request->data));
            if ($this->Missions->save($mission)) {
                $this->Flash->success(__('The mission has been saved.'));
                return $this->redirect(['action' => 'index']);
            } else {
                $this->Flash->error(__('The mission could not be saved. Please, try again.'));
            }
        }


        $vehicule = $this->Missions->Vehicules
            ->find()
            ->where(['id' => $this->request->data['vehicules_id']])
            ->first();

        $miss = $this->Missions
            ->find()
            ->where(['vehicules_id' => $this->request->data['vehicules_id']])
            ->order(['created' => 'DESC'])
            ->first();

        $missd = $this->Missions
            ->find()
            ->where(['vehicules_id' => $this->request->data['vehicules_id']])
            ->order(['created' => 'DESC'])
            ->first();


  /**      $personnels = $this->Missions->Personnels->find('list', [
             'keyField' => 'name',
             'valueField' => 'prenompersonnel'
           //  'valueField' => 'CONCAT(name, " ", prenompersonnel)'
           //  'valueField' => 'name'
             ], ['limit' => 200]);  **/

//       $mission->dateheuresortie = $mission->dateheuresortie->format('Y-m-d H:i');
  //      $mission->dateheureretour = $mission->dateheureretour->format('Y-m-d H:i');
  //        $time1 = new Time($mission->dateheureretour);

        $personnels = $this->Missions->Personnels->find('list', ['limit' => 2000]);
        $chauffeurs = $this->Missions->Chauffeurs->find('list', ['limit' => 2000]);
       
        $typemissions = $this->Missions->Typemissions->find('list', ['limit' => 2000]);
        $communes = $this->Missions->Communes->find('list', ['limit' => 2000]);
        $this->set(compact('mission', 'vehicule', 'personnels', 'typemissions', 'communes', 'chauffeurs'));
        $this->set(compact('mission', 'miss'));
        $this->set(compact('mission', 'missd'));
        $this->set('_serialize', ['mission']);


        $query = $this->Missions->find('all', ['conditions'  => ['vehicules_id' => '1'] ]);
        $number = $query->count();
   // ->where(['id =' => 1]);
  //  ->contain(['missions', 'Vehicules'])
   // ->limit(10);
    }

Merci d'avance

Hors ligne

 

#2 19-09-2016 12:04:22

nvalyfofana
Eclair café
Date d'inscription: 15-06-2016
Messages: 43

Re: Enregistrer un multiple select dans une BD

Aidez-moi svp

Hors ligne

 

#3 19-09-2016 12:14:20

6120
The Big Cake
Date d'inscription: 06-11-2009
Messages: 379

Re: Enregistrer un multiple select dans une BD

Dans ton controller, tu dois avoir (là c'est bon) :

Code: php

  1. $communes = $this->Missions->Communes->find('list', ['limit' => 200]);

et ton select devrait plutôt être :

Code: php

  1. echo $this->Form->input('communes._ids', ['options' => $communes, 'multiple' => 'checkbox']);

Tu dois avoir un problème de configuration dans tes tables.
Normalement, si tes relations sont bien configurées, ça s'enregistre automatiquement.

Dernière modification par 6120 (19-09-2016 14:06:57)

Hors ligne

 

#4 19-09-2016 14:07:58

nvalyfofana
Eclair café
Date d'inscription: 15-06-2016
Messages: 43

Re: Enregistrer un multiple select dans une BD

Au niveau de mon controller, j'ai pas de soucis puisque j'ai cette ligne de code:
communes = $this->Missions->Communes->find('list', ['limit' => 200]);
dans mon controller, mais mon select donne ça:   
<?= $this->Form->select("communes_id", $communes, $options = ['empty'=> true, 'multiple' => true]) ?>,
je ne vois pas encore l'erreur, j'ai fais ce que tu as dit mais toujours la même chose.

Hors ligne

 

#5 19-09-2016 15:41:43

6120
The Big Cake
Date d'inscription: 06-11-2009
Messages: 379

Re: Enregistrer un multiple select dans une BD

Tu quelles relations dans tes tables ?

Hors ligne

 

#6 19-09-2016 16:00:40

nvalyfofana
Eclair café
Date d'inscription: 15-06-2016
Messages: 43

Re: Enregistrer un multiple select dans une BD

Voici mon model:

<?php
namespace App\Model\Table;

use App\Model\Entity\Mission;
use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;
use Cake\I18n\Time;
use Cake\I18n\Date;

/**
* Missions Model
*
* @property \Cake\ORM\Association\BelongsTo $Vehicules
* @property \Cake\ORM\Association\BelongsTo $Personnels
* @property \Cake\ORM\Association\BelongsTo $Typemissions
* @property \Cake\ORM\Association\BelongsTo $Communes
*/
class MissionsTable extends Table
{

    /**
     * Initialize method
     *
     * @param array $config The configuration for the Table.
     * @return void
     */

   /** public function validationComparisonField($check, $other_field) {
    if ($this->data[$this->alias][$other_field] > $check[key($check)]) {
        return true; // passed
    }

    return true; // not passed
    }  **/


    public function initialize(array $config)
    {
        parent::initialize($config);

        $this->table('missions');
        $this->displayField('name');
        $this->primaryKey('id');


        $this->addBehavior('Timestamp');

        $this->belongsTo('Vehicules', [
            'foreignKey' => 'vehicules_id',
            'joinType' => 'INNER'
        ]);
        $this->belongsTo('Personnels', [
            'foreignKey' => 'personnels_id',
            'joinType' => 'INNER'
        //    'conditions'=> array('Personnels.services_id = Service.id')
       //     'joinTable' => 'services',
       //     'associationForeignKey' => 'services_id'
           
        ]);
        $this->belongsTo('Typemissions', [
            'foreignKey' => 'typemissions_id',
            'joinType' => 'INNER'
        ]);
        $this->belongsTo('Communes', [
            'foreignKey' => 'communes_id',
            'joinType' => 'INNER'
        ]);

   $this->belongsTo('Missions2', [
            'foreignKey' => 'missions2_id',
            'joinType' => 'INNER'
        ]);

   $this->belongsTo('Chauffeurs', [
            'foreignKey' => 'chauffeurs_id',
            'joinType' => 'INNER'
        ]);
    }


/**   public $hasMany = array(
    'Personnel' => array(
      'className' => 'Personnel',
      'foreignKey' => 'services_id',
      'dependent' => false,
      'conditions' => '',
      'fields' => '',
      'order' => '',
      'limit' => '',
      'offset' => '',
      'exclusive' => '',
      'finderQuery' => '',
      'counterQuery' => ''
    )
  );   **/


    /**
     * Default validation rules.
     *
     * @param \Cake\Validation\Validator $validator Validator instance.
     * @return \Cake\Validation\Validator
     */
    public function validationDefault(Validator $validator)
    {
        $validator
            ->integer('id')
            ->allowEmpty('id', 'create');

        $validator
            ->allowEmpty('chauffeur');

        $validator
            ->allowEmpty('name');

        $validator
            ->allowEmpty('numordremission');

        $validator
            ->dateTime('dateheuresortie')
            ->allowEmpty('dateheuresortie');

        $validator
            ->integer('kilometragesortie')
            ->allowEmpty('kilometragesortie');

        $validator
            ->dateTime('dateprevueretour')
            ->allowEmpty('dateprevueretour');

        $validator
            ->dateTime('dateheureretour')
            ->allowEmpty('dateheureretour');

        $validator
            ->integer('kilometrageretour')

            ->allowEmpty('kilometrageretour');
          //  ->add('kilometrageretour' => ['rule' => array('equalsTo', 'kilometragesortie')]);
         //   ->add('kilometrageretour', 'no-misspelling', ['rule' => ['compareWith', 'kilometragesortie'],
         //                                                 'message' => 'Les mot de passe ne sont pas égaux',]);

        $validator
            ->integer('statut')
            ->allowEmpty('statut');

/**        $validator
            ->integer('observation')
            ->allowEmpty('observation');  **/

        return $validator;
    }

   
    /**
     * Returns a rules checker object that will be used for validating
     * application integrity.
     *
     * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
     * @return \Cake\ORM\RulesChecker
     */
    public function buildRules(RulesChecker $rules)
    {
        $rules->add($rules->existsIn(['vehicules_id'], 'Vehicules'));
        $rules->add($rules->existsIn(['personnels_id'], 'Personnels'));

        $rules->add($rules->existsIn(['chauffeurs_id'], 'Chauffeurs'));
        $rules->add($rules->existsIn(['typemissions_id'], 'Typemissions'));
        $rules->add($rules->existsIn(['communes_id'], 'Communes'));

         $check = function ($mission) {
        return ($mission->kilometragesortie < $mission->kilometrageretour) OR ($mission->kilometrageretour==0);
    };
    $rules->add($check, [
        'errorField' => 'kilometrageretour',
        'message' => 'Le kilometrage retour ne doit pas etre inferieur au kilometrage de sortie'
    ]);

    $check = function ($mission) {

    $string1 = $mission->dateheuresortie;
    $string2 = $mission->dateheureretour;

    $time1 = new Time($string1);
    $time2 = new Time($string2);

   // pr ($time2 > $time1);
      //  return ($mission->dateheuresortie < $mission->dateheureretour) OR ($mission->dateheureretour==NULL);
    return ($time1 < $time2) OR ($time2==NULL);
    };
    $rules->add($check, [
        'errorField' => 'dateheureretour',
        'message' => 'La date de retour est inferieur à la date de sortie'
    ]);



    $check = function ($mission) {

    $string1 = $mission->dateheuresortie;
    $string3 = $mission->dateprevueretour;

    $time1 = new Time($string1);
    $time3 = new Time($string3);

   // pr ($time2 > $time1);
      //  return ($mission->dateheuresortie < $mission->dateheureretour) OR ($mission->dateheureretour==NULL);
    return ($time1 < $time3) OR ($time3==NULL);
    };
    $rules->add($check, [
        'errorField' => 'dateprevueretour',
        'message' => 'La date de retour est inferieur à la date de sortie'
    ]);


        return $rules;
    }

}

Hors ligne

 

#7 20-09-2016 06:11:01

6120
The Big Cake
Date d'inscription: 06-11-2009
Messages: 379

Re: Enregistrer un multiple select dans une BD

Le problème est bien là.
Dans ton model, tu as :

Code: php

  1. $this->belongsTo('Communes', [
  2.             'foreignKey' => 'communes_id',
  3.             'joinType' => 'INNER'
  4.         ]);

alors que dans ton code tu sembles avoir le contraire.

Ce devrait être (dans Missions) :

Code: php

  1. // soit :
  2. $this->hasMany('Communes', [
  3.             'foreignKey' => 'mission_id',
  4.             'joinType' => 'INNER'
  5.         ]);
  6. // soit
  7. $this->belongsToMany('Communes', [
  8.             'through' => 'CommunesMissions',
  9.         ]);

et dans Communes :

Code: php

  1. // soit :
  2. $this-> belongsTo('Missions', [
  3.             'foreignKey' => 'mission_id',
  4.             'joinType' => 'INNER'
  5.         ]);
  6. // soit
  7. $this->belongsToMany('Missions', [
  8.             'through' => 'CommunesMissions',
  9.         ]);

Tu devrais aussi revoir les conventions de cakephph.
Les foreign keys sont au singulier. Exemple :
"commune_id" et non pas "communes_id"

Dernière modification par 6120 (20-09-2016 06:20:29)

Hors ligne

 

#8 20-09-2016 10:42:39

nvalyfofana
Eclair café
Date d'inscription: 15-06-2016
Messages: 43

Re: Enregistrer un multiple select dans une BD

J'ai essayé d'apporter ses modifications directement dans mes models mais je n'arrive pas à insérer.
Donc je dois reprendre les structures des tables communes et missions et de les bake de nouveau.

Dernière modification par nvalyfofana (20-09-2016 10:43:59)

Hors ligne

 

#9 22-09-2016 12:27:01

nvalyfofana
Eclair café
Date d'inscription: 15-06-2016
Messages: 43

Re: Enregistrer un multiple select dans une BD

Toujours pareil!!!!

Hors ligne

 

#10 30-09-2016 18:45:03

nvalyfofana
Eclair café
Date d'inscription: 15-06-2016
Messages: 43

Re: Enregistrer un multiple select dans une BD

J'ai toujours pas résolu mon problème.
Besoin d'aide

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB
Traduction par FluxBB.fr