2009/6/24 Aamchi <[email protected]>:
>
> Hi Richard,
>
> Your example works perfectly :-)
>
> Just a few minor things that I had to change to make it actually work
> (not being fussy, just if someone else finds this useful as well and
> wants to try it out):
>
> -The this operator didn't work for me, I replaced it with o_Updater
> - In the PHP the array key which stores the hash is 'Hash' and not
> 'thisHash', so replace thisHash with Hash in the js-code
> - And when updating hash: o_Updater.options.lastHash = o_JSON.thisHash
> (instead of o_Updater.options.lastHash != o_JSON.thisHash)
>
> Thanks again.
>
> Aman
>
>
>
> On 24 Jun., 12:12, Richard Quadling <[email protected]> wrote:
>> 2009/6/23 Aamchi <[email protected]>:
>>
>>
>>
>>
>>
>> > Thanks, for your response. I'm not 100% sure if I understand correctly
>> > what you mean. If I get some data and generate a hash and write this
>> > to the JSON header and retrieve this when calling onSuccess, how will
>> > I still have the previous hash? From where will I get this? Won't the
>> > updated data cause the hash to be overwritten in the JSON header? Or
>> > do I have to send two hashes always and compare them?
>>
>> > On 23 Jun., 22:57, Richard Quadling <[email protected]> wrote:
>> >> 2009/6/23 Aamchi <[email protected]>
>>
>> >> > Hi,
>>
>> >> > I was wondering if Ajax.PeriodicalUpdater can detect if content has
>> >> > changed since the last update and if so trigger an event.
>>
>> >> > So for example I have a scoreboard which fetches data every 5 seconds
>> >> > and displays this. I would be cool if there could be some kind of
>> >> > notification if content had changed. I know that the new content is
>> >> > stores in responseText but how can I compare it to the previous
>> >> > content...
>>
>> >> > Thanks,
>> >> > Aman
>>
>> >> Personally, I would do this server side.
>> >> Assuming you get the data in some sort of structure before either rending
>> >> some HTML and sending it or just sending it JSON'd, then you should be
>> >> able
>> >> to build a hash of the data.
>>
>> >> See [1] for info on Hash Functions.
>>
>> >> So. If you sent the hash value in a X-JSON header along with an
>> >> onSuccess()
>> >> callback, you can extract the hash from the second param to the onSuccess
>> >> and compare this with the previously retrieved hash to indicate you've got
>> >> changed data. See [2] for details about PeriodicalUpdater update
>> >> notification and [3] for the parameters to common callbacks.
>>
>> >> Regards,
>>
>> >> Richard.
>>
>> >> [1]http://en.wikipedia.org/wiki/Hash_function
>> >> [2]http://www.prototypejs.org/api/ajax/periodicalUpdater
>> >> <http://www.prototypejs.org/api/ajax/periodicalUpdater>[3]http://www.prototypejs.org/api/ajax/options
>> >> <http://www.prototypejs.org/api/ajax/options>
>>
>> >> --
>> >> -----
>> >> Richard Quadling
>> >> Zend Certified Engineer :http://zend.com/zce.php?c=ZEND002498&r=213474731
>> >> "Standing on the shoulders of some very clever giants!"
>>
>> You add a
>>
>> previousHash:null;
>>
>> to your periodic updater and check that value against the one coming
>> in via the X-JSON header.
>>
>> If it is different, then the data is different. If it is the same,
>> then the data is the same.
>>
>> Either way, once evaluated, same the new hash.
>>
>> Untested (sorry), but adapting the example at [1] ...
>>
>> var o_Updater = new Ajax.PeriodicalUpdater
>> (
>> 'lastLogin',
>> '/lastLogin.php',
>> {
>> method : 'get',
>> frequency : 3,
>> decay : 2,
>> lastHash : null,
>> onSuccess : function(o_Transport, o_JSON)
>> {
>> // Do we have JSON?
>> if (!!o_JSON)
>> {
>> // Do we have a previous hash?
>> if (!!this.options.lastHash &&
>> (this.options.lastHash != o_JSON.thisHash))
>> {
>> // Hashes are different. Maybe
>> activate an effect to show the
>> highlighted data and slowly fade away over time.
>> }
>> // Update hash.
>> this.options.lastHash != o_JSON.thisHash;
>> }
>> }
>> }
>> );
>>
>> The code on the server would be something like this (I'm using PHP).
>>
>> <?php
>> // Assume we are getting this data from a database.
>> $a_Data = array
>> (
>> 'Name' => 'Richard Quadling',
>> 'LastPost' => '2009-06-24 10:00:00',
>> );
>>
>> // Build hash
>> $s_Hash = array('Hash' => md5(serialize($a_Data)));
>>
>> // Generate output.
>> $s_Output =
>> "<tbody><tr><td>{$a_Data['Name']}</td><td>{$a_Data['LastPost']}</td></tbody>";
>>
>> // X-JSON Header
>> header('X-JSON: ' . json_encode($s_Hash, JSON_FORCE_OBJECT));
>>
>> // Output results.
>> echo $s_Output;
>> ?>
>>
>> The PHP outputs (edited) ...
>>
>> X-JSON: {"Hash":"a0c23e7f9651f2b65135932917b7f03a"}
>> Content-type: text/html
>>
>> <tbody><tr><td>Richard Quadling</td><td>2009-06-24 10:00:00</td></tbody>
>>
>> So the X-JSON header is presented as o_JSON in onSuccess() and
>> o_JSON.Hash is 'a0c23e7f9651f2b65135932917b7f03a'
>>
>> And the HTML would go to the container you defined in the PeriodicUpdater
>>
>> Richard.
>>
>> --
>> -----
>> Richard Quadling
>> Zend Certified Engineer :http://zend.com/zce.php?c=ZEND002498&r=213474731
>> "Standing on the shoulders of some very clever giants!"
> >
>
Sorry for the typos.
And I forgot to bind this to the onSuccess.
So, a fixed-up version (hopefully) ...
new Ajax.PeriodicalUpdater
(
'lastLogin',
'/lastLogin.php',
{
method : 'get',
frequency : 3,
decay : 2,
lastHash : null,
onSuccess : (function(o_Transport, o_JSON)
{
// Do we have JSON?
if (!!o_JSON)
{
// Do we have a previous hash?
if (!!this.options.lastHash &&
(this.options.lastHash != o_JSON.Hash))
{
// Hashes are different. Maybe
activate an effect to show the highlighted data and slowly fade away
over time.
}
// Update hash.
this.options.lastHash = o_JSON.Hash;
}
}).bind(this)
}
);
--
-----
Richard Quadling
Zend Certified Engineer : http://zend.com/zce.php?c=ZEND002498&r=213474731
"Standing on the shoulders of some very clever giants!"
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Prototype & script.aculo.us" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/prototype-scriptaculous?hl=en
-~----------~----~----~----~------~----~------~--~---