ajax Check

Witam,

Muszę zadać to pytanie, bo czytam czytam dokumentacje i nie mogę tego zrozumieć. Sprawa tyczy się ajaxa.

Mam projekt całkiem spory, a w jednym z widoków coś takiego:


<?php echo $form->dropDownListControlGroup($model, 'rodzajid', $rodzaj_list, array('empty' => 'Wybierz...','ajax' => array(

				'url' => $this->createUrl('ajaxCheckRodzaj'),

				'type' => 'POST',

				'dataType' => 'json',

				'success' => 'function(data){

					if(data.res) {

						$("#ytFiles").css("visibility","visible");						

					} else {

						$("#ytFiles").css("visibility","hidden");

					}

				}',

				'data' => array('rid' => 'js:this.value', 'YII_CSRF_TOKEN' => Yii::app()->request->csrfToken),

			))); ?>

Rozwiewając wątpliwości: lista rozwijana z rodzajami- jeśli w modelu rodzaj w kolumnie "pdf" znajdzie wartość 1 zmienia widoczność elementu "ytFiles".

Moje pytanie jest następujące: Skąd "on" wie, że musi szukać 1 w kolumnie pdf? Nigdzie w projekcie nie mogę znaleźć odwołania do tego działania? Jeśli potrzebujecie jakiegoś kodu, lub macie pytania jestem otwarty.

Z góry dziękuję.

Aby dowiedzieć się skąd on wie użyłbym kilku sposobów.

  1. w kodzie (firefox -ctrl+U) możesz zobaczyć co jest pod zmienną

$this->createUrl('ajaxCheckRodzaj')

i poszukać


url' => jakiś adres url,

'type' => 'POST',

'dataType' => 'json',

  1. lub

print_r($this->createUrl('ajaxCheckRodzaj'));die;

  1. FireBug’a (w mozilli F12)

Jak klikasz na guzik w tedy wykonuje się zapytanie post, możesz je przeanalizować w zakładce network FireBug’a

Wyszukujesz ten requet znajdziesz na jaki adres url lecą dane i jaka jest odpowiedź z tego adresu.

Zapewne pod adresem


$this->createUrl('ajaxCheckRodzaj')

jest kontroler który ma if’a i return Json.

Adres na jaki idzie zapytanie

Dadne jake są w zapytaniu POST

Odpowiedź jaka przyszła z pytanego adresu URL

Zastanawia mnie tylko ten $this-> przez createUrl w jakim kontekscie (klasie) umiejscowiony jest ten kod? Jeżeli w widoku to ciekawe. Klasa yii\web\View nie ma metody createUrl.

ps. daj plus

Niestety nie odpowiem dlaczego ;) Projekt otrzymałem jako spuścizna no i go pomału rozwijam douczając ;)

Zaraz odpowiem jak mi poszło z głównym problemem.

Edit:

Przekazuje rid - id rodzaju, a odpowiedź(res) to [0/1]

localhost:8081/mojastrona/wniosek/ajaxCheckRodzaj

szukałem ajaxCheckRodzaj, a wystarczyło pomyśleć i poszukać akcji actionAjaxCheckRodzaj… ;)

Super, dzięki za wyczerpującą odpowiedź ;)

To w sumie kolejne pytanie:

przerobiłem actionAjaxCheckRodzaj na:


public function actionAjaxCheckRodzaj()

	{

		if (Yii::app()->request->isAjaxRequest)

        {

			$rid = Yii::app()->request->getParam('rid');

			$obj = Rodzaj::model()->FindByPK($rid);


			if (is_object($obj)) {	

				if ($obj->pliki == 1 OR $obj->pliki == '1') {

					echo json_encode(array('res' => 1));

				} else {

					echo json_encode(array('res' => 0));

				}

				if ($obj->pieniezne == 1 OR $obj->pieniezne == '1') {

					echo json_encode(array('res2' => 1));

				} else {

					echo json_encode(array('res2' => 0));

				}

				Yii::app()->end();

			} else {

				echo json_encode(array('res' => 0));

				echo json_encode(array('res2' => 0));

				Yii::app()->end();

			}

		}

	}

odpowiedzi otrzymuję ładne, ale nic się nie dzieje nawet poprzednia funkcjonalność przestała działać, pomimo obsługi zacnej (poprawnej) odpowiedzi metody. A tutaj obsługa odpowiedzi.


echo $form->dropDownListControlGroup($model, 'rodzajid', $rodzaj_list, array('empty' => 'Wybierz...','ajax' => array(

				'url' => $this->createUrl('ajaxCheckRodzaj'), // it is selected at MyHtml::ajax() which URL to use

				'type' => 'POST',

				'dataType' => 'json',

				'success' => 'function(data){

					if(data.res) {

						$("#ytFiles").css("visibility","visible");							

					} else {

						$("#ytFiles").css("visibility","hidden");

					}

					if (data.res2){

						$("#ytFiles2").css("visibility","visible");	

					} else {

						$("#ytFiles2").css("visibility","hidden");

					}

				}',

				'data' => array('rid' => 'js:this.value', 'YII_CSRF_TOKEN' => Yii::app()->request->csrfToken),

			))); ?>

offtop: to pewnie dlatego że korzystam z


bootstrap.widgets.TbActiveForm' 

EDIT:

Dotarłem do tego jak to zrobić ;) Zamiast zwracać 2 jedno-elementowe tablice zwróciłem je jako 1 tablice 2 elementową.

Taka mała rada. Jeżeli dopiero zaczynasz naukę to przerzuć się na Yii2.