ajax - ładowanie zawartości

Chciałem za pomocą Html::ajaxLink załadować zawartość (moduły) do odpowiednich widoków. Wzorowałem się na metodzie renderPartial ( http://www.yiiframework.com/doc/cookbook/49/ ). Jednak Linki tworzę nie w widoku tylko w kontrolerze ponieważ są to elementy JTreeView także tworzone dynamicznie przez ajaxa.

Metody kontrolera wyglądają nastepująco:

Metoda ajaxFillTree


public function actionAjaxFillTreeJednostki(){

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

            exit();

        }

        $parentId = 0;

        if (isset($_GET['root'])) {

            $parentId = (int) $_GET['root'];

        }

        

        $children = Jednostki::model()->findAllByAttributes(array('rodzic'=>$parentId));

        

        for($i=0;$i<sizeof($children);$i++){

        	$data[$i]['text'] = CHtml::ajaxLink(

        							$children[$i]->nazwa,

        							CController::createUrl('sis/UpdateAjax'),

        							array(  'update' => '#data',

        									'type'=>'GET',

        									'data'=>array('id'=>$children[$i]->id),

        								)

        							);

        	$maDzieci = Jednostki::model()->findByAttributes(array('rodzic'=>$children[$i]->id));

        	if(isset($maDzieci)){

        		$data[$i]['hasChildren']=true;

        		

        	}

        	else{

        		$data[$i]['hasChildren']=false;

        	}

        	$data[$i]['id']=$children[$i]->id;

        }

        

        echo CTreeView::saveDataAsJson($data);

            

        exit();

        

	}

Metoda odpowiedzialna za renderowanie zawartosci


public function actionUpdateAjax()

    {

        $data = array();

        $id = $_GET['id'];

        $data['info']='to jest ajax, id: '.$id;

        

        $data['dInformacje'] = Jednostki::model()->findByPk($id);

		

        $this->renderPartial('_ajaxContent', $data, false, true);

    }

	

}

i widoki renderownej zawarosci

wyswietl.php


<div id="data">

	<?php echo $this->renderPartial('_ajaxContent',array(

				'info'=>$info,

				'dInformacje'=>$dInformacje,

			)); 

	?>

</div>

ajaxContent.php


<div id="informacje_glowne">

<?php echo $info;?>

<?php  echo "<br />".$dInformacje->nazwa?>


</div><!-- informacje_glowne -->

Po kliknięciu w wygenerowane linki (w drzewie) nic się nie renderuje. Dlaczego?

Jeśli dane do TreeView wczytywane są ajax’em tak jak w twoim przypadku to ajaxLink nie zadziała, gdyż obsługa zdarzenia kliknięcia w ten link (polecenie jQuery) nie zostanie wyrenderowana.

Jedno z rozwiązań - musiał być w widoku "wyswietl.php" ręcznie dodać obsługę w jQuery czyli coś takiego:




<?php


Yii::app()->clientScript->registerScript("jQuery('#treeview a').live(

		'click',function(){

			jQuery.ajax({

				'type':'GET',

				'url':jQuery(this).attr('href'),

				'cache':false,

				'success':function(html){jQuery('#data').html(html);}

			});

			return false;

		});");


?>



Do tego CHtml::ajaxLink powinieneś zmienić na zwykły CHtml::link z odpowiednim URLem zawierającym również parametr. Selektor #treeview powinien odpowiadać ID elementu w którym są wszystkie linki z drzewka. Powodzenia.

Dzięki wielkie, poradziłem sobie wcześniej poprzez statyczne wygenerowanie drzewa (bez pomocy ajaxa), wtedy linki działały.

Twoje rozwiązanie wydaje się bardzo sensowne. Pewnie wykorzystam w przyszłości.