21. září bude sraz! Od 18.00 v restauraci Tradice v Praze u Anděla
Autor Zpráva
Fisak
Profil
Dobrý den,
Chtěl bych vytvořit seznam článků kde se při načtení stránky načtou všechny články. Pak pokud bude nějaký nový článek tak by se měl zobrazit a to bez nutnosti refreshe. Můj úmysl by byl že se bude pomocí ajaxu refreshovat skript který bude vracet nějaké hodnotu (bohužel zatím přesně nevím jak):
setInterval(function(){ $(".main-supply").load("/plugins/ajax/supply.php"); },5000); //toto mi každých 5 vteřin načte skript kde se budou vypisovat články. A potom by se mělo pomocí skriptu přidat článek který ještě není zobrazený:
$(document).ready(function(){
    var textSupplyss = '<div class="post"> <div class="postheader"><div class="postleft"><img src="'+profile_img+'" /></div><div class="postright"><div class="name"><div class="padd">'+my_name+'</div></div><div class="info"><div class="padd"><span>Zveřejněno: '+datetime+'</span><span>0 komentářů</span></div></div></div></div><div class="postcontent"><div class="padd">'+$("#textSupply").val()+'</div></div></div>'; 
        $("#results").prepend(textSupplyss);
});
Bohužel nevím jak zjistit jestli je článek už načtený nebo není. Mohl by mě prosím někdo navést nebo mi poradit jak to udělat?
Předem děkuji za odpovědi.
juriad
Profil
Předej skriptu supply.php parametr, kterým bude id posledního zobrazeného článku. Pak ten skript vrátí jen novější články. Pokud potřebuješ uvažovat i nové starší články (třeba přesunuté z jiných kategorií), musel bys poslat seznam všech id, které znáš.
Fisak
Profil
juriad:
No já spíš přemýšlel jestli nejde udělat nějaká proměná v JS kam bych uložil poslední id. Pak bych to předal supply.php jak říkáte vy. Ale bohužel nevím jak se nějaká taková globální proměnná dělá v JS
juriad
Profil
Globální proměnnou lze samozřejmě vytvořit; dokonce minimálně třemi způsoby:
1) klíčovým slovem var a názvem proměnné někde mimo definici jakékoli funkce.
2) prostě ji začít používat kdekoli a nikde ji nedeklarovat pomocí slova var. Toto se považuje za prasečinu.
3) jako atribut objektu windows; toto je dost podobné druhému způsobu.
Živá ukázka

Jak vidíš, můžeš k té proměnné přistoupit odkudkoli.
Otázkou je pak, jak ji naplníš a jak ji budeš udržovat aktuální.
Fisak
Profil
juriad:
Nakonec jsem to udělal trochu amatérsky $_SESSION['actuall_supply'] ... vím že to asi nebude optimální řešení ale chtěl bych to teďkon pořešit aby to alespoň fungovalo.
setInterval(function(){ $("#results").load("/plugins/ajax/supply-add.php"); },5000);
tímto by se měl načítat skript supply-add.php každých 5 vteřin a supply-add.php:
$
$supply_sql_friends = DB::query("select [uss_id_1], [uss_id_2] from [:pref:friends] where [uss_id_1] = %i", $_SESSION['uss_id'], " and [approved] = %s", "yes", " or  [uss_id_2] = %i", $_SESSION['uss_id'], " and [approved] = %s", "yes");
  
   $array_F = array(
    'uss_id%in'=>$supply_sql_friends
  );
  
  $supply_sql = DB::query("select * from [:pref:supply] where [uss_id] = %i", $_SESSION['uss_id'], " and [id] > %i", $_SESSION['actual_supply'], " or %and", $array_F, " and [id] > %i", $_SESSION['actual_supply'], " ORDER by [id] DESC");

  foreach ($supply_sql as $n => $data_supply) {
    
    $supply_sql_uss = DB::query("select [name], [last_name], [profile_img] from [:pref:users] where [id] = %i", $data_supply->uss_id, " %lmt ", "1");
    foreach ($supply_sql_uss as $n => $data_supply_uss) {
    
    echo '
    $(document).ready(function(){
    var textSupplyss = \'<div class="post"> <div class="postheader"><div class="postleft"><img src="'.$data_supply_uss->profile_img.'" /></div><div class="postright"><div class="name"><div class="padd">'.$data_supply_uss->name.' '.$data_supply_uss->last_name.'</div></div><div class="info"><div class="padd"><span>Zveřejněno: '.$data_supply->date.'</span><span>0 komentářů</span></div></div></div></div><div class="postcontent"><div class="padd">'.$data_supply->text.'</div></div></div>\'; 
        $("#results").prepend(textSupplyss);
});';
    $_SESSION['actual_supply'] = $data_supply->id;
    
    }
Bohužel se mi děje to že se mi po 5ti vteřinách element vymaže(nejspíš protože není žádný nový příspěvek). Takže chyba bude nejspíš v:
setInterval(function(){ $("#results").load("/plugins/ajax/supply-add.php"); },5000);
Nevíte prosím jak si s tím poradit? Předem děkuji za odpověď
juriad
Profil
Chceš použít jQuery.get a vložit si připadná nová data do toho #results sám pomocí append/prepend.
Mimochodem, to myslíš váženě, že uživatel (nebo robot) bez JS neuvidí na stránce vůbec nic?
juriad
Profil
Problém s SESSION je ten, že uživatel nemůže mít zobrazené dvě stránky zároveň. Začnou se ovlivňovat a do té starší začne natahovat články patřící do té novější (kam se také budou přidavat).
Fisak
Profil
juriad:
Ano přesně tak... A dal jsem tedy místo .load -> .get a bohužel nefunguje to :(

setInterval(function(){ $("#results").get("/plugins/ajax/supply-add.php"); },5000);


juriad:
dvě stránky zároveň
Bude tam jen jeden výpis s článkama takže by to neměl být problém


Přednější je teď pro mě zobrazení tech článků tak jak se to zobrazovat má. Poté začnu ještě řešit session...


setInterval(function(){ $.get( "/plugins/ajax/supply-add.php", function( data ) { $( "#results" ).html( data );}); },5000);
takto to funguje ale bohužel se stejným výsledkem... vymaže to všechny články. A pokud nějaký přidám tak se zobrazí na 5s a pak zase zmizí.
juriad
Profil
Musíš mít callback, který je nové články přidá; něco jako:
$.get("/plugins/ajax/supply-add.php", function(data) {
  $("#results").prepend(data);
});
Samozřejmě, že nevím, v jakém formátu si ta data posíláš a co posíláš, pokud žádná nová nejsou.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0