Bonsoir à tous.

Je reprends un de mes précédents message que je viens d'effacer.
J'ai résolu une partie de l'ajax grâce à un tuto sur Gogol.
Les 3 Models dont je me sert:

<?php
// Region model named by Region.php // intervient dans Department.php
App::uses('AppModel', 'Model');
class Region extends AppModel{
    public $name = 'Region';
    public $hasMany = array('Department');
    public $order = 'Region.id ASC';
}

<?php
// Department model named by Department.php
App::uses('AppModel', 'Model');
class Department extends AppModel{
     public $name = 'Department';
     public $belongsTo = array('Region');
}

<?php
// User model named by User.php
App::uses('AppModel', 'Model');
class User extends AppModel{
    public $name = 'User';
}

Les 2 controllers dont j'ai besoin:

<!--app/Controller/UsersController.php-->
<?php
App::uses('AppController','Controller');
class UsersController extends AppController{
    public $name = 'Users';
    public $uses = array('User','Region','Department');
    public $helpers = array('Js');
    public function account(){
        if (!empty($this->request->data)) {
            $this->request->data'User']'id'] = $this->Auth->user('id');
            $this->User->create($this->request->data);
            if($this->User->validates()){
                $this->User->create();
                $this->User->saveAll($this->request->data, array('firstname', 'lastname', 'telephone', 'civilities', 'mail, adresse_1, adresse_2, regions_id, departments_id')); 
                $user = $this->User->read();
                $this->Auth->login($user'User']);
                $this->Session->setFlash("Vos informations ont bien été modifiées","flash", array('class' => 'success'));
            }
        }else{
            $this->User->id = $this->Auth->user('id');
            $this->request->data = $this->User->read();
        }
        $d'civilities']=array(
            ''=>'',
            'Mme' => '       Mme', 
            'Mlle' => '       Mlle',
            'M.' => '       M.');
        $this->set($d);

        $regions = $this->Region->find('list');
        $this->set(compact('regions'));
    }

<!--app/Controller/DepartmentsController.php-->
<?php
App::uses('AppController','Controller');
class DepartmentsController extends AppController{

    public function getByRegion() {
        $regions_id = $this->request->data'User']'regions_id'];
        $departments = $this->Department->find('list', array(
            'conditions' => array('Department.regions_id' => $regions_id),
            'recursive' => -1
            ));
        $this->set('departments',$departments);
        $this->layout = 'ajax';
    }

Les vues:

<!-- file path app/View/Departments/get_by_region.ctp -->
<?php
    if(!empty($departments)){
        foreach ($departments as $key => $value):
?>
        <option value="<?php echo $key; ?>"><?php echo $value; ?></option>
<?php
        endforeach;
    } else {
?>
    <option value="">Choisir une région avant</option>
<?php
    }
?>

<?= $this->Form->create('User'); ?>
<!-- d'autres champs -->
       <?= $this->Form->input('User.regions_id', array(
        'label' => array('text' => "Région", 'class' => 'col-lg-4'),
        'class' => 'col-lg-8'
        'id'=>'PostRegionId',
        'empty' => 'Select'
       )); ?>
       <?= $this -> Form -> input ('User.departments_id',array (
        'label' => array('text' => "Département", 'class' => 'col-lg-4'),
        'class' => 'col-lg-8',
        'id' => 'PostDepartmentId',
        'empty' => 'Choisir une région avant!'
         )); ?>
<?= $this->Form->end("Modifier"); ?>
<?php     
    $this->Js->get('#PostRegionId')->event('change',
    $this->Js->request(array(
        'controller'=>'departments',
        'action'=>'getByRegion'
        ), array(
        'update'=>'#PostDepartmentId',
        'async' => true,
        'method' => 'post',
        'dataExpression'=>true,
        'data'=> $this->Js->serializeForm(array(
            'isForm' => true,
            'inline' => true
            ))
        ))
    );

<!-- En bas du layout/default.ctp -->
<?php
  if (class_exists('JsHelper') && method_exists($this->Js, 'writeBuffer')) echo $this->Js->writeBuffer();
  //Writes cached scripts
?>

Tout marche :) je choisis ma région, la liste déroulante des départements selectionne les départements de la région, tout s'enregistre correctement dans la base de données SAUF QUE:
lorsque je me déconnecte et que je me reconnecte, la région récupérée dans la base réapparait bien mais pas le département?
ça me marque le empty "Choisir une région avant!"

Quelqu'un pourrait m'aiguiller pour que mon champs département récupère bien la valeur de ma base de données?
Merci d'avance !

1 réponse


mimosa21
Auteur
Réponse acceptée

Une bonne nuit de sommeil mets les idées au clair. Pour visualiser le département même après une déconnexion, il faut dans UsersController.php changer çà:

$regions = $this->Region->find('list');
$this->set(compact('regions'));

Par çà:

$regions = $this->Region->find('list');
$departments = $this->Department->find('list');
$this->set(compact('regions', 'departments'));

Au passage le layout "ajax" c'est juste une ligne:

<?php echo $this->fetch('content'); ?>