Aggiornamento Parte Di Una Pagina

Buongiorno a tutti.

Vi chiedo un aiuto, ho bisogno di aggiornare all’interno di una pagina un pezzo di codice con dei dati che vengono presi ogni 3-4 secondi da un db.

In pratica dovrei usare qualcosa come la funzione JS setTimeout() che ogni 3-4 secondi chiama uno script php nel server prende i dati che vengono passati e li visualizza all’interno della pagina.

Non capisco come inserire questo nella view.

Qualcuno mi può dare uno spunto?

grazie!!

quando si vuole aggiornare una porzione di pagina, ci viene necessariamente in aiuto ajax.

Io opterei per una funzione js che con json prende i dati che servono per ripristinare la porzione di pagina.

ci sono vari modi per realizzare una cosa del genere.

Ad esempio: renderPartial nella view, della porzione che vuoi aggiornare, e con gli strumenti che ti mette a disposizione yii restituire un renderPartial in json e sostituirla.

oppure json solo del dato e sostituzione a mano del dato stesso. Dipende da cosa vuoi fare.

Per la temporizzazione che dicevi, in questo modo, puoi richiamare ogni tot questa funzione e in più mettere un bottone che richiama la funzione per fare il sync manualmente.




setTimeout('check_dato()',5000);






function check_dato()

{

    <?php echo CHtml::ajax(array(

            'url'=>array('controller/action_json/'.$model->id.''),

            'data'=> "js:$(this).serialize()",

            'type'=>'post',

            'dataType'=>'json',

            'success'=>"function(data)

            {

                    $('#div').html(data.div);

            } ",

            ))?>

    return false; 

}






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

{ 

echo CJSON::encode(array(

'div'=>$this->renderPartial('controller/_div', array('model'=>$model),true,true)));

exit;

}



ovviamente non è codice testato quindi prendilo con le pinze.

altra cosa che ti risolverebbe un pò di grane è, se i dati che vuoi refreshare siano in una gridview.

a quel punto risolvi agile con una cosa di questo tipo:




    setTimeout("$.fn.yiiGridView.update('tua-grid', { data: $(this).serialize() })",5000);



ti ringrazio tanto per il suggerimento,

sono ancora un pivello di yii, non ti ho risposto prima perchè devo metabolizzare quello che mi hai scritto

ci sono molte cose che non ho capito.

intanto purtroppo la gridview non c’è.

posta un pò di codice, magari com’è fatta la view, i tuoi dubbi… vediamo che si può fare.

superOT, come mai quel nick? :D

allora,

la view è molto semplice, se ho capito bene inserisco il codice javascript, dovrebbe essere qualcosa del genere:




<script type="text/javascript">

setTimeout('check_dato()',5000);


function check_dato()

{

    <?php echo CHtml::ajax(array(

            'url'=>array('controller/controllastato/'.$model->id.''),

            'data'=> "js:$(this).serialize()",

            'type'=>'post',

            'dataType'=>'json',

            'success'=>"function(data)

            {

                    $('#div').html(data.div);

            } ",

            ))?>

    return false; 

}


</script> 





<?php

/* @var $this UserController */

/* @var $model User */


$this->breadcrumbs=array(

	'Registrazioni Utente',

);




echo CHtml::image(Yii::app()->request->baseUrl.DIRECTORY_SEPARATOR.'images'.DIRECTORY_SEPARATOR.'user.png', 'Utente');

echo "Nome Utente: ".$nome;

	


	--- qui dovrei stampare la parte che si aggiorna  ogni 3-4 secondi----


	echo "<br><br>";

	echo CHtml::link('Registra ora',array('User/RegNow'));

	

	//stampo le registrazioni effettuate.

	echo "<br><br>Registrazioni effettuate:";

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

	'dataProvider' => $dataregi,

    ));

?>



controller/controllastato è il controller che interroga il db per capire cosa stampare nella view

la prima cosa che non capisco è, il codice:




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

	{ 

		echo CJSON::encode(array(

		'div'=>$this->renderPartial('controller/_div', array('model'=>$model),true,true)));

		//exit;

	}



dovrei metterlo in controller/controllastato?

in tal caso perchè metti il controller nella renderpartial?

grazie

fdilecce è solo un nick, immagino che tu pensi ad un collegamento con la città di Lecce, ma non c’è :) .

scusami con ‘controller’ nel renderPartial non volevo portarti fuori strada, era riferito alla view del tuo controller.

Cmq ti posto qui di seguito del codice di esempio, sul codice postato, testato ;)

nel js ho usato setInterval, al posto di setTimeout che andava poi richiamato ricorsivamente nella funzione check_dato().

Nella view:




<script type="text/javascript">

setInterval('check_dato()',1000);


function check_dato()

{

    <?php echo CHtml::ajax(array(

            'url'=>array('user/controllastato/'),

            'data'=> "js:$(this).serialize()",

            'type'=>'post',

            'dataType'=>'json',

            'success'=>"function(data)

            {

                    $('#div').html(data.div);

            } ",

            ))?>

    return false; 

}


</script> 





<?php

/* @var $this UserController */

/* @var $model User */


$this->breadcrumbs=array(

        'Registrazioni Utente',

);

?>


<div id="div">

    <? $this->renderPartial('_div',array('random'=>0)); ?>

</div>



poi crei una sottoview _div.php e ci metti dentro un banale:




<? echo $random; ?>



Nel tuo Controller, che se ho capito bene è UserController:




<?

public function actionControllaStato()

{

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

   { 

     $random = rand(0, 1000);

     echo CJSON::encode(array('div'=>$this->renderPartial('_div',array('random'=>$random),true,true)));

   }

}

?>



da notare che nella funzione check_dato() l’url

è settato come: ‘url’=>array(‘user/controllastato/’), dando sempre per scontato che stai agendo su UserController

ho sempre pensato che la cosa migliore di Yii …è questa comunità,

inizio a capirci qualcosa, anche se non funziona ancora.

Lo 0 non viene cambiato…

usi qualcosa per fare un primo debug?

ci sta che la chiamata ajax non vada a buon fine.

Se usi chrome fai tasto destro sulla pagina e poi fai Ispeziona Elemento, poi guarda se ci sono errori nella sezione console, oppure vai in sezione Network e guarda se ci sono chiamate a ‘user/controllastato/’ e cosa succede se sono in rosso, vuol dire che non trova l’azione o che succede qualcos’altro, magari l’hai posizionata nel controller sbagliato.

intanto potresti anche dirci dove hai posizionato le parti di codice.

allora, il codice l’ho inserito proprio come hai scritto tu.

La pagina viene visualizzata senza errori con lo zero iniziale, come browser uso firefox.

Se attivo firebug mi compare un errore:

JSON.parse: unexpected non-whitespace character after JSON data

nello stack vedo:





parseJSON()jquery.js (riga 564)

data = "{"div":"92"}<!DOCTYPE h...ge -->\n\n</body>\n</html>"



e poi…




done()jquery.js (riga 7511)

status = 200


nativeStatusText = "OK"


responses = Object { text= "{"div":"92"}<!DOCTYPE h...e -->\n\n</body>\n</html>\n"


}

headers = "Date: Fri, 01 Mar 2013 ...t/html; charset=UTF-8\r\n"




Nella console vedo le richieste ogni 55ms:

POST https://192.168.199.2/pbxgui/index.php/user/profilo 200 OK 46ms

POST https://192.168.199.2/pbxgui/index.php/user/profilo 200 OK 41ms

profilo è il nome dell’azione nel controller (invece di controllastato)

se guardo dentro il corpo della risposta POST vedo:





<div id='div'>0</div> 




cioè nessun aggiornamento

provato a metterci un?




'success'=>"function(data)

            {

alert(data.div);

                   // $('#div').html(data.div);

            } ",



provato con chrome/ium? scusa ma non sono pratico di firebug, l’ho usato poche volte

ok,

ho provato con chrome mi sembra che i risultati sono gli stessi.

in console non vedo nessun errore, non viene scritto niente.

mentre in network vedo le richieste ripetute (come in firefox)

se clicco su queste richieste in headers vedo

Status Code:200 OK

dunque penso che non ci siano errori

se clicco su response vedo all’inizio:




{"div":"323"}<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>

...



se non capisco male sembra che il codice javascript è giusto infatti vedo: {"div":"323"}

che ad ogni richiesta cambia, però non viene modificato nel div

l’alert ce l’hai messo nella funzione js?

ok funziona!

ti ringrazio davvero tanto!

c’era semplicemente un errore nell’azione del controller per cui non veniva aggiornato il div

grazie ancora.

a presto

era l’exit commentato… che ho visto ora :)