Problem z CJuiTabs

Witajcie!

Pisałam już w wątku angielskojęzycznym, ale mam wątpliwości, czy mój angielski jest wystarczający by wytłumaczyć z czym mam kłopot.

Mam na stronie dropDownList z nazwiskami klientów a pod spodem CJuiTabs gdzie w kolejnych zakładkach mam pogrupowane informacje o kliencie: "Dane adresowe", "Adres korespondencyjny", "Informacje kredytowe" i tak dalej.

plik: pozyczka/_form.php




echo $form->dropDownList($model, 'klient_id', GxHtml::listDataEx(Klient::model()->findAllAttributes(null, true)),array(

  'prompt'=>'Wybierz klienta',

  'ajax'=>array('type'=>'POST',

                'url'=>CController::createUrl('Pozyczka/ajaxtabs'),

                'update'=>'#yw0_tab_"+$("#yw0").tabs("option","selected")+"',

                'data'=>'js:{tab:$("#yw0").tabs("option","selected"),

                             klient_id:$("#Pozyczka_klient_id").val()}'))); 


$this->widget('zii.widgets.jui.CJuiTabs',array(

		  'tabs'=>array(

		    'Adres'=>array('ajax'=>array('ajaxtabs_kontakt')),

		    'Adres korespondencyjny'=>array('ajax'=>array('ajaxtabs_kontakt_kor')),

		    'Dane osobowe'=>array('ajax'=>array('ajaxtabs_dane_osobowe')),

		    'Dochody'=>array('ajax'=>array('ajaxtabs_dochody')),

		    'Pożyczki'=>array('ajax'=>array('ajaxtabs_pozyczki')),

		    ),

		  'options'=>array(

		    'collapsible'=>true,

		    'selected'=>0,

		    'ajaxOptions'=>array('data'=>'js:{klient_id:$("#Pozyczka_klient_id").val()}','type'=>'POST'),

   ),

		  'htmlOptions'=>array(

		    'style'=>'width:300px;'

		    ),

		  ));






plik: PozyczkaController.php




public function actionAjaxTabs(){

 if(isset($_POST['tab'])) $tab=$_POST['tab'];

 else $tab=0;

    switch($tab){

      case 0: $this->renderPartial('_klient_kontakt',array('klient_id'=>$_POST['klient_id']));break;

      case 1: $this->renderPartial('_klient_kontakt_kor',array('klient_id'=>$_POST['klient_id']));break;

      case 2: $this->renderPartial('_klient_dane_osobowe',array('klient_id'=>$_POST['klient_id']));break;

      case 3: $this->renderPartial('_klient_dochody',array('klient_id'=>$_POST['klient_id']));break;

      case 4: $this->renderPartial('_klient_pozyczki',array('klient_id'=>$_POST['klient_id']));break;  

    }

	}

	

public function actionAjaxTabs_kontakt(){

   $this->renderPartial('_klient_kontakt',array('klient_id'=>$_POST['klient_id']));

}

public function actionAjaxTabs_kontakt_kor(){

   $this->renderPartial('_klient_kontakt_kor',array('klient_id'=>$_POST['klient_id']));

}

...



plik: _klient_kontakt.php




if($klient_id=="" or $klient_id==0) $model= new Klient;

else $model=$this->loadModel($klient_id,'Klient');

$this->widget('zii.widgets.CDetailView',array(

  'data'=>$model,

  'attributes'=>array(

    'telefon1',

    'telefon2',

    'zam_ulica',

    'zam_nr_domu',

    'zam_lokal',

    'zam_kod_pocztowy',

    'zam_miejscowosc',

    ),

  )

);




Kiedy wybieram klienta z dropDownList to chcę, żeby uaktualniały się dane na aktualnie wybranej zakładce. I to mi działa.

Ale kiedy mam kogoś wybranego z listy i zmieniam zakładkę, to chciałabym, żeby ta nowa zakładka sprawdzała kto jest wybrany i zaciągała sobie z bazy danych dane dotyczące tego klienta (a dokładnie fragment danych odpowiedni do wybranej zakładki). No i to mi nie działa. Z var_dumpów wynika, że nikt nie jest wybrany w dropDownList.

Pomóżcie proszę.

Jak możesz to wrzuć tu też javascript który został wygenerowany do tych tabsòw.

Powinien być gdzieś na dole kodu :slight_smile:




jQuery('body').undelegate('#Pozyczka_klient_id','change').delegate('#Pozyczka_klient_id','change',function(){

  jQuery.ajax({

    'type':'POST',

    'url':'/supera/index.php/Pozyczka/ajaxtabs',

    'data':{

       tab:$("#yw0").tabs("option","selected"),

       klient_id:$("#Pozyczka_klient_id").val()},

    'cache':false,

    'success':function(html){

jQuery("#yw0_tab_"+$("#yw0").tabs("option","selected")+"").html(html)}});

return false;});


jQuery('#yw0').tabs({

   'collapsible':true,

   'selected':0,

   'ajaxOptions':{

      'data':{klient_id:$("#Pozyczka_klient_id").val()},

      'type':'POST',

      'cache':'true'}});



O ten kawałek chodzi?

Co jest wysyłane do kontrolera? Sprawdź w zakładce Sieć dowolnego narzędzia diagnostycznego (firebug itp.) zawartość post. W ten sposób możesz ustalić, czy problem leży po stronie js czy php. Jak wywołasz w konsoli js:


 $("#Pozyczka_klient_id").val()

to pojawia się wartość, czy jest pusty string?

edit:

Z drugiego tematu wynika, ze faktycznie jest to kłopot z pobieraniem wartości z selecta. Spróbuj zmienić na


$("#Pozyczka_klient_id :selected").val()

albo


$("#Pozyczka_klient_id :selected").text()

W pliku ładowanym przez renderPartial wyrzucam zawartość $_POST i jako $_POST[‘klient_id’] dostaję pusty ciąg. Jednocześnie, kiedy po zmianie zakładki sprawdzam narzędziami Chroma wartość zmiennej, dostaję prawidłową wartość, czyli to, co jest wybrane w select-cie.

Wynika z tego, że nie działa to, co mam w ajaxOptions - podstawianie wartości przy tworzeniu listy zmiennych do POSTa.

Jednocześnie identyczna w zasadzie konstrukcja zastosowana przy dropDownList działa dokładnie tak, jak oczekuję…

Zaraz spróbuję zastosować sugerowane przez Ciebie poprawki.

Jeszcze jedna sprawa. Masz włączone cachowanie zapytań. Spróbuj, przynajmniej na czas testów ustawić cache na false w ajaxOptions CJuiTabs.

Wyniki testów

  • dodanie :selected powoduje błędy

  • zmiana cache na false nie zmienia nic jeśli chodzi o (nie)działanie

:(

:selected dałaś po spacji?

Sprawdzasz wartość zmiennej klient_id w debugerze, czy zmiennej post w nagłówku zapytania ajax? Pytanie, jest takie: Czy zostaje wysłana odpowiednia wartość do kontrolera. Jedynym sposobem, żeby to ustalić jest sprawdzenie nagłówka zapytania. Na przykład zawartość post formularza logowania na stronie yii:


LoginForm%5Busername%5D=test&LoginForm%5Bpassword%5D=&LoginForm%5BrememberMe%5D=0

lub jak podane w firebug:

Jeżeli tu będziesz mieć puste, a wartość klient_id tuż przed wysłaniem będzie właściwa, to trzeba będzie poszukać innego sposobu przesłania tej zmiennej (zakładam, że tak jak napisałaś na angielskim forum wpisanie konkretnej wartości działa.)

edit:

Jeszcze jeden pomysł (już desperacki :) ). Spróbuj owinąć:


$("#Pozyczka_klient_id").val()

w funkcję parseInt(). Żeby wyglądała tak:


parseInt($("#Pozyczka_klient_id").val())

Chyba się udało ;D

Najpierw znalazłam takie coś:

Since this runs when you first create the tabs:


data: $("#myform").serialize(),

The data is whatever it was then, it’s never updated. The easiest solution here is just to update that data when it’s needed, by using the tab’s select event, like this:


$( "#tabs" ).tabs({

  select: function() {

    $(this).tabs("option", { ajaxOptions: { data: $("#myform").serialize() } });

  },

  ajaxOptions: {

    type: 'post',

    error: function( xhr, status, index, anchor ) {

      $( anchor.hash ).html(

        "Couldn't load this tab. We'll try to fix this as soon as possible. " +

        "If this wouldn't be a demo." );

    }

  }

});

i prawie było ok gdyby nie parę problemów, np jak w Yii podpiąć obsługę eventu i… no właśnie: prawie ok.

W powyższym przykładzie, linię:


   

 $(this).tabs("option", { ajaxOptions: { data: $("#myform").serialize() } });



należy skorygować, o tak:


    $(this).tabs("option", { ajaxOptions: { data: $("#myform").serialize(),

type:"POST" } });



bo ponieważ dlatego, że wystąpienie eventu całkowicie nadpisywało poprzednią wartość ajaxoptions, a domyślna metoda wysyłania to GET, więc sprawdzanie potem zmiennej $_POST mijało się z celem.

Mogę walczyć dalej :wink: Serdecznie dziękuję za pomoc, bo bez możliwości pogadania z kimś inteligentnym nie znalazłabym rozwiązania.