Bonjour christoufe8625 et tous!
Merci de m'avoir répondu, mais désolé, je ne vois toujours pas comment je pourrais faire. Le js et ajax sont vraiment pas mes amis.
Je montre ce que j'ai en globalité:
Mes models:
<?php // Announce model named by Announce.php
App::uses('AppModel', 'Model');
class Announce extends AppModel{
public $name = 'Announce';
public $belongsTo = array('Category', 'Subcategory', 'User');
}
?>
<?php
// Category model named by Category.php
App::uses('AppModel', 'Model');
class Category extends AppModel {
public $name = 'Category';
public $hasMany = array('Announce','Subcategory');
}
?>
<?php // Subcategory model named by Subcategory.php
App::uses('AppModel', 'Model');
class Subcategory extends AppModel {
public $name = 'Subcategory';
public $belongsTo = array('Category');
public $hasMany = array('Announce');
}
?>
Mon controller qui englobe tout:
<?php
App::uses('AppController','Controller');
class AnnouncesController extends AppController{
public $helpers = array('Html', 'Form', 'Session');
public $components = array('Session');
public function add() {
if ($this->request->is('post')) {
$this->Announce->create();
$this->request->data'Announce']'user_id'] = $this->Auth->user('id');
if ($this->Announce->save($this->request->data)) {// Si la sauvegarde se passe correctement
$this->Session->setFlash("Votre annonce a bien été enregistrée.","flash");
return $this->redirect(array('action' => 'my'));
}
$this->Session->setFlash("Impossible d'ajouter votre annonce.","flash");
}
$categories = $this->Announce->Category->find('list', array(
'fields' => array('Category.id','Category.name_fr'),
'recursive' => -1,
'order' => array('Category.name_fr ASC')
));
$subcategories = $this->Announce->Subcategory->find('list', array(
'fields' => array('Subcategory.id', 'Subcategory.name_fr')
)); // Renvoie l'id et le name_fr
$this->set(compact('categories', 'subcategories'));
}
Ma vue Announces/add.ctp
<?=
$this->Form->input('category_id', array(
'id' =>"InputCategory_Id",
'label' => array('text' => "Catégorie", 'class' => 'col-lg-5 text-right')
));
?>
<?=
$this->Form->input('subcategory_id', array(
'id' => "InputSubcategory_Id",
'label' => array('text' => "Sous-catégorie", 'class' => 'col-lg-5 text-right')
));
?>
<?php
/* Utilisation d'ajax pour que lorsque je clique sur une catégorie dans ma liste déroulante de catégories, cela me donne bien les sous catégories liées à ma catégorie.*/
$this->Js->get('#InputCategory_Id')->event('change',
$this->Js->request(array(
'controller'=>'subcategories',
'action'=>'getByCategory'
), array(
'update'=>'#InputSubcategory_Id',
'async' => true,
'method' => 'post',
'dataExpression'=>true,
'data'=> $this->Js->serializeForm(array(
'isForm' => true,
'inline' => true
))
))
);
?>
Le code de mon action 'getByCategory' dans mon controler Subcategories
<!--app/Controller/SubcategoriesController.php-->
<?php
App::uses('AppController','Controller');
class SubcategoriesController extends AppController {
public function getByCategory() {
$category_id = $this->request->data'Announce']'category_id'];
$subcategories = $this->Subcategory->find('list', array(
'fields' => array('Subcategory.id', 'Subcategory.name_fr'),
'conditions' => array('Subcategory.category_id' => $category_id),
'recursive' => -1,
'order' => array('Subcategory.name_fr ASC')
));
$this->set('subcategories',$subcategories);
$this->layout = 'ajax';
}
La vue get_by_category.ctp
<!-- file path app/View/Subcategories/get_by_category.ctp -->
<?php
if(!empty($subcategories)){
foreach ($subcategories as $key => $value):
?>
<option value="<?php echo $key; ?>"><?php echo $value; ?></option>
<?php
endforeach;
} else {
?>
<option value="">No Data</option>
<?php
}
?>
En bas de mon layout.ctp
<?php
if (class_exists('JsHelper') && method_exists($this->Js, 'writeBuffer')) echo $this->Js->writeBuffer();
//Writes cached scripts
?>
Mon ajax.ctp
<!-- layout/ajax.ctp -->
<?php echo $this->fetch('content'); ?>
Voilà maintenant sur le même principe que mon ajax pour Subcategories j'aimerais avoir un un model, controller et une vue pour undercategories et qui ...
Je finis à midi car je n'ai pas vu l'heure et je dois aller au boulot