Chi mi spiega questo snippet?

La ricerca avanzata inerente la griglia che viene creata tramite gii è costituita da 2 pezzi.

Uno il form di ricerca vero e proprio





<?php echo CHtml::link('Ricerca Avanzata','#',array('class'=>'search-button')); ?>

<div class="search-form" style="display:none">

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

	'model'=>$model,

)); ?>

</div><!-- search-form -->



che grazie a style="display:none" è nascosto

e poi lo spezzone di codice javascript per farlo comparire o nascondere alla pressione del link Ricerca Avanzata:





Yii::app()->clientScript->registerScript('search', "

$('.search-button').click(function(){

	$('.search-form').toggle();

	return false;

});

$('.search-form form').submit(function(){

	$.fn.yiiGridView.update('call-rcms-grid', {

		data: $(this).serialize()

	});

	return false;

});

");



La prima riga


Yii::app()->clientScript->registerScript('search', "

ho capito che serve per dire di inserire lo script che segue ed il primo parametro ‘search’ posso chiamarlo come voglio ma non capisco a cosa serva

e poi segue il codice javascript diviso in 2 parti:


$('.search-button').click(function(){

	$('.search-form').toggle();

	return false;

});

alla pressione del link visualizzo/nascondo il form

ma l’ultima parte a cosa serve?

Se ti riferisci a quel return false, serve ad evitare che il browser esegua l’evento onclick e si fermi alla gestione scritta con jquery. Senza quel return false, ti invito a provare per avere conferma, il browser dovrebbe aprire la pagina ‘#’.

Se ti può interessare, ho partecipato ad un javascriptBarCamp un paio di anni fa, … qui trovi delle slides in cui analizzo tutta la gestione degli eventi nei browser (da ie ad opera passando per firefox e così via) http://www.slideshare.net/sensorario/javascript-camp-listener-per-eventi

Sono passati un paio di anni ma molte delle cose che ci sono scritte sono ancora tutte vere =).

Se invece ti riferisci al pezzetto


Yii::app()->clientScript->registerScript('search', "



, sappi che serve per dire ad yii che vuoi registrare del codice javascript. Si preoccuparerà lui di metterlo nella pagina finale. Prova a guardare il codice html generato di questo documento. Aiuta a capire molte cose.

Mea culpa, mi sono espresso male.

Mi riferivo a questo pezzo di codice:


$('.search-form form').submit(function(){

        $.fn.yiiGridView.update('call-rcms-grid', {

                data: $(this).serialize()

        });

        return false;

});

invece per il pezzetto


Yii::app()->clientScript->registerScript('search', "

a cosa serve search ?

E’ l’id dello script. Hai tre parametri:

public CClientScript registerScript(string $id, string $script, integer $position=4)

L’id credo sia più utile a chi legge il codice che ad altro.

Lo script è … il codice js.

La posizione invece è importante: in base a quel valore, il tuo script viene posizionato in parti diverse del documento renderizzato. Consiglio caldamente di posizionare tutto alla fine della pagina salvo in casi eccezionali.

Per ulteriori dettagli:

http://www.yiiframework.com/doc/api/1.1/CClientScript#registerScript-detail

Il ID viene usato internalmente come indice per il array dove si tengono tutti i script prima che la pagina viene generatta… per questo deve essere unica…

se fai un altro call ad registerScript() con lo stesso ID e JS codice differente… il primo codice lo perdi e non vera generato nella pagina finalle…

Per quanto si tratta della seconda parte li si chiama il metodo che aggiorna la grid… questo metodo si trova nel file jquery.yiigridview.js… come parametro viene mandato un JSON array che contiene tutti i datti della forma di ricerca "data: $(this).serialize()"… il metodo yiiGridView.update() fa un ajax call usando questi dati come parametri… ed e cosi che nel controller ricevi il $_POST con i datti scritti nel form.

Spero ti sia piu chiaro :)

Si grazie. Ho anche provato ad eliminare questa seconda parte per vedere cosa succedeva e ho notato che la griglia continuava a funzionare, ma ogni volta veniva ricaricata tutta la pagina. Invece con quello spezzone di codice, vengono aggiornati solo i dati all’interno della griglia.