Yii Framework Forum: Aggiornamento Parte Di Una Pagina - Yii Framework Forum

Jump to content

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

Aggiornamento Parte Di Una Pagina Rate Topic: -----

#1 User is offline   fdilecce 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 51
  • Joined: 03-September 12

Posted 26 February 2013 - 09:38 AM

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

#2 User is offline   st4nny 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 303
  • Joined: 10-April 12

Posted 26 February 2013 - 11:59 AM

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

1

#3 User is offline   fdilecce 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 51
  • Joined: 03-September 12

Posted 27 February 2013 - 10:50 AM

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

#4 User is offline   st4nny 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 303
  • Joined: 10-April 12

Posted 27 February 2013 - 05:24 PM

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

superOT, come mai quel nick? :D
0

#5 User is offline   fdilecce 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 51
  • Joined: 03-September 12

Posted 28 February 2013 - 07:02 PM

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'è :) .
0

#6 User is offline   st4nny 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 303
  • Joined: 10-April 12

Posted 28 February 2013 - 07:21 PM

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

This post has been edited by st4nny: 28 February 2013 - 07:32 PM

1

#7 User is offline   fdilecce 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 51
  • Joined: 03-September 12

Posted 01 March 2013 - 11:03 AM

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

#8 User is offline   st4nny 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 303
  • Joined: 10-April 12

Posted 01 March 2013 - 11:19 AM

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

#9 User is offline   fdilecce 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 51
  • Joined: 03-September 12

Posted 01 March 2013 - 12:12 PM

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....hp/user/profilo 200 OK 46ms
POST https://192.168.199....hp/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
0

#10 User is offline   st4nny 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 303
  • Joined: 10-April 12

Posted 01 March 2013 - 12:31 PM

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
0

#11 User is offline   fdilecce 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 51
  • Joined: 03-September 12

Posted 02 March 2013 - 05:43 PM

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
0

#12 User is offline   st4nny 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 303
  • Joined: 10-April 12

Posted 02 March 2013 - 09:27 PM

l'alert ce l'hai messo nella funzione js?
0

#13 User is offline   fdilecce 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 51
  • Joined: 03-September 12

Posted 03 March 2013 - 02:04 PM

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
0

#14 User is offline   st4nny 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 303
  • Joined: 10-April 12

Posted 03 March 2013 - 05:32 PM

era l'exit commentato.. che ho visto ora :)
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