Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Cake][CakePHP] Formularz wyboru modelu auta dopiero po wybraniu marki auta?
Forum PHP.pl > Forum > PHP > Frameworki
kleus
Witam...
mam w bazie tabele:
1. Makes -> id, name
2. Modeles -> id, make_id, name
3. Cars -> id, make_id, modele_id, motor...

Mam kontroller CarsController i w nim funkcje
  1. function add(){
  2. $Make = $this -> Makes -> find('list');
  3. $this -> set('Make', $Make);
  4.  
  5. $Model = $this -> Modeles -> find('list');
  6. $this -> set('Model', $Model);
  7. }


w widoku ładnie mi tworze pola wyboru marki i modelu auta, ale chciałbym żeby opcja wybory modelu auta była dostępna dopiero po wybraniu marki auta tak jak na otomoto.pl

Proszę o naprowadzenie jak utworzyć odwołanie z widoku do kontrolera aby ten pobrał właściwe dane i zwrócił do widoku...

kicaj
To zadanie dla AJAX'a lub samego JS
kleus
zdaję sobie z tego sprawę. Moje pytanie brzmi jak zrobić odwołanie z widoku do controllera aby odpowiednie dane pobrać?
karolrynio
Masz 2 rozwiązania jak napisał kicaj:
1. Używając JS:
Pobierasz w kontrolerze:
  1. function add(){
  2. $Make = $this -> Makes -> find('list');
  3. $this -> set('Make', $Make);
  4.  
  5. // ustawiasz żeby sortowanie było po make_id ( jeśli tak nazywa się kolumna w bazie )
  6. $params = array( 'order' => 'Modeles.make_id' );
  7.  
  8. // pobierasz wszystko żeby rozbić sobie na inne tablice
  9. $Models = $this -> Modeles -> find('all', $params);
  10.  
  11. $modelsGroups = array();
  12.  
  13.  
  14. // usupełniasz tablice według grup, żeby później łatwiej nimi maniouować
  15. foreach( $Models as $model ) {
  16. $name = $model['Modeles']['name'];
  17. $key = $model['Modeles']['id'];
  18. $modelsGroups[ $model['Modeles']['make_id'] ][ $key ] = $name;
  19. }
  20.  
  21. $this->set( compact('modelsGroups') );
  22.  
  23. }



I i widoku masz coś takiego:

  1. foreach( $Make as $make ) {
  2. $options = $modelsGroups[ $make['Makes']['make_id'] ];
  3. // echo $form->select z opcjami $options i odpowiednim id
  4. }


I teraz za pomocą JA po zmianie na pierwszym selekcie wywołujesz akcje która:
- ukrywa selekty
- pokazuje selekt z id który pasuje do zaznaczonej opcji

2. Używając ajaxa musisz:
- stworzyć metodę która zwraca listę opcji przy danym id
- po zmianie na selekcie musisz wywołać ajaxa który pobierze listę opcji
- usunąć wszystkie opcje z drugiego selekta
- dodać te które zwróci ajax.

Oczywiście musisz zmienić nazwy kolumn na takie jak masz w bazie.
kleus
wstawiam rozwiązanie może komuś się przyda. Bardzo dzięki za naprowadzenie jak rozwiązać 'zagadkę' ;D btw. Manual Cake jest naprawdę bardzo dobrze opisany.
W default.ctp dodajmy
  1. <?php echo $javascript->link(array('jquery-1.6.2.min', 'prototype', 'scriptaculous')); ?>

  1. CarsController.php
  2. <?php
  3. class CarsController extends AppController{
  4. var $name = 'Cars';
  5. var $helpers = array('Html','Form','Ajax');
  6. var $components = array('RequestHandler');
  7. var $uses = array('Modeles','Makes', 'Cars');
  8.  
  9. function add(){
  10. $Makes = $this -> Makes -> find('list');
  11. $conditions = array( 'order' => 'Modeles.make_id' );
  12. $this -> set('Make', $Makes);
  13. }
  14. function update_select(){
  15. $Modele = $this -> Modeles -> find('list', array('conditions' => array('make_id' => $this -> data['Cars']['Make_id'])));
  16. $this -> set('Modele', $Modele);
  17. }
  18. }
  19.  
  20. ?>
WIDOK ADD.CTP
  1. <h2>New Car</h2>
  2. <?php echo $this->Form->create('Cars'); ?>
  3. <?php echo $this->Form->input('Make_id', array('options' => $Make, 'empty' => ''), null, array('id' => 'make_id', 'label' => 'Marka'));?>
  4. <?php $options = array('url' => 'update_select','update' => 'CarsModeleId');?>
  5. <?php echo $ajax->observeField('CarsMakeId', $options);?>
  6. <?php echo $this->Form->input('Modele_id', array('options' => '', 'empty' => ' '), null, array('id' => 'modele', 'label' => 'Model'));?>
  7. <?php echo $this->Form->end(); ?>
WIDOK UPDATE_SELECT.CTP
  1. <?php
  2. echo "<option value=\"\"> </option>\n";
  3. foreach($Modele as $k => $v) {
  4. echo "<option value=\"$k\">$v</option>\n";
  5. }
  6. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.