Yii Framework Forum: Problem z CJuiTabs - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Problem z CJuiTabs Rate Topic: -----

#1 User is offline   dragonka 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 12
  • Joined: 15-October 11

Posted 11 January 2012 - 02:34 PM

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ę.
0

#2 User is offline   Mariusz W. 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 24
  • Joined: 15-December 11
  • Location:Poland/Warsaw

Posted 11 January 2012 - 03:23 PM

Jak możesz to wrzuć tu też javascript który został wygenerowany do tych tabsòw.
Powinien być gdzieś na dole kodu :-)
Posted Image
Posted Image
0

#3 User is offline   dragonka 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 12
  • Joined: 15-October 11

Posted 11 January 2012 - 04:49 PM

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?
0

#4 User is offline   sidewinder 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 210
  • Joined: 08-July 09
  • Location:Poland

Posted 12 January 2012 - 03:35 AM

View Postdragonka, on 11 January 2012 - 02:34 PM, said:

Z var_dumpów wynika, że nikt nie jest wybrany w dropDownList.


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:

View Postdragonka, on 12 January 2012 - 03:13 AM, said:

My solution works if i type for example 2 instead of $("#Pozyczka_klient_id").val()

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()

---------------------------------------------------------------------
"Never memorize what you can look up in books."
Albert Einstein
0

#5 User is offline   dragonka 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 12
  • Joined: 15-October 11

Posted 12 January 2012 - 04:23 AM

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.
0

#6 User is offline   sidewinder 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 210
  • Joined: 08-July 09
  • Location:Poland

Posted 12 January 2012 - 04:43 AM

Jeszcze jedna sprawa. Masz włączone cachowanie zapytań. Spróbuj, przynajmniej na czas testów ustawić cache na false w ajaxOptions CJuiTabs.
---------------------------------------------------------------------
"Never memorize what you can look up in books."
Albert Einstein
0

#7 User is offline   dragonka 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 12
  • Joined: 15-October 11

Posted 12 January 2012 - 04:51 AM

Wyniki testów
- dodanie :selected powoduje błędy
- zmiana cache na false nie zmienia nic jeśli chodzi o (nie)działanie
0

#8 User is offline   sidewinder 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 210
  • Joined: 08-July 09
  • Location:Poland

Posted 12 January 2012 - 05:08 AM

:(
:selected dałaś po spacji?

Quote

...kiedy po zmianie zakładki sprawdzam narzędziami Chroma wartość zmiennej, dostaję prawidłową wartość, czyli to, co jest wybrane w select-cie.

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:

Quote

LoginForm[password]
LoginForm[rememberMe] 0
LoginForm[username] test

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())

---------------------------------------------------------------------
"Never memorize what you can look up in books."
Albert Einstein
0

#9 User is offline   dragonka 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 12
  • Joined: 15-October 11

Posted 12 January 2012 - 06:54 AM

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 ;-) Serdecznie dziękuję za pomoc, bo bez możliwości pogadania z kimś inteligentnym nie znalazłabym rozwiązania.
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users