Autor Zpráva
David1256
Profil
Dobrý den,

jde nějak Ajaxem reloadovat jen to, co je v hlavičce dokumentu? Vím, že jde reloadovat určitý div, ale jde nějak dynamicky změnit třeba meta údaje nebo titulek apod.?

Děkuji.
Radek9
Profil
David1256:
Jaké meta údaje bys chtěl měnit? Proč? Titulek změníš pomocí document.title.
David1256
Profil
Je to docela komplikované. Načítám totiž všechny součásti stránky Ajaxem. Jenže nyní potřebuji do stránky zabudovat FB like button. FB like button si však sosá meta tagy z hlavní stránky a né ze stránky, kterou do divu Ajaxem vkládám. Jenže já potřebuji mít pro každou adresu jiné meta tagy (pro každý článek jiný titulek fb like buttonu) přičemž neplatí, že při změně adresy se reloaduje stránka, protože používám právě Ajax, což je vlastně důvod, proč mě napadlo, jestli nejde měnit Ajaxem obsah <head> docela by se mi to hodilo.
Radek9
Profil
David1256:
Můžeš si pomocí document.getElementsByTagName vybrat všechny meta elementy, najít ten správný a upravit mu vlastnosti.
David1256
Profil
Jde o to, že já tam potřebuju Ajaxem podstrčit PHP kód, protože JS jako takový nemá na FB jakýkoliv vliv. Pokud změním pouze za pomoci document.getElementsByTagName atribut <meta>, tak si toho FB ani nevšimne, protože se to nestane na straně serveru.
Radek9
Profil
David1256:
potřebuju Ajaxem podstrčit PHP kód
Ty ale nepodstrčíš PHP kód, nýbrž jen jeho výsledek. Bude to mít stejný efekt, jako bys to měnil čistě přes JS.

tak si toho FB ani nevšimne, protože se to nestane na straně serveru.
Pokud si FB načítá stránku znovu, tak ti AJAX nepomůže. Načte stránku přesně tak, jako bys ji poprvé otevřel v prohlížeči. Takže pokud neměníš adresu, je to k ničemu.
David1256
Profil
Načte stránku přesně tak, jako bys ji poprvé otevřel v prohlížeči.
To právě potřebuji.
Takže pokud neměníš adresu
Adresu měním ale přes hash.

Prostě si myslím, že pokud dostanu Ajaxem PHP kód do hlavičky, tak to bude fungovat, protože Ajax způsobuje to, že spouští scripty i bez reloadu stránky, což potřebuji. Otázka zní, jak dostat Ajaxem nějaký kód do hlavičky. Mám jakýsi AjaxLoader, ale ten má parametry id divu a adresa vkládaného souboru, což nepoužiji, protože těžko budu cpát nějaký <div> do <head>.
Someone
Profil
Vkládání obsahu vegenerovaného serverem má v ajaxu nastarost JavaScript.

David1256:
protože JS jako takový nemá na FB jakýkoliv vliv

Takže to vyjde úplně nastejno.
Str4wberry
Profil
Jak by to šlo udělat?

Nemám to odzkoušeno, ale napadá mne u FB like tlačítka neuvést adresu stránky (= měla by se použít právě prohlížená), tím docílíš toho, že se ti načte právě ta zobrazená. Hash „#!něco“ si Facebook převede na ?_escaped_fragment_=něco, kde mu vrátíš příslušný obsah.
David1256
Profil
Str4wberry:
Ano když se neuvede adresa stránky, tak si FB "vycúcne" aktuální adresu. Já to tak mám i postavené. On si bere FB tu právě zobrazenou adresu, tuto adresu však ohlodá o část za # a vloží ji do og:title (meta tag -> titulek fb liku) s tím, že tento titulek nese href i s částí za # (titulek je tedy test.metalforever.info ale vede třeba na test.metalforever.info#stranka=novinky....). Je to takové docela dost komplikované. Pokusím se to převést do praxe. Třeba to pomůže k porozumění mého problému. Na této adrese http://test.metalforever.info/fb.php?clanek=17 mi funguje vše tak, jak má. Ovšem pokud toto tlačítko implementuji do celého webu http://test.metalforever.info, tak si to už meta data netahá z fb.php ale z index.php a já tudíž potřebuji měnit meta data v index.php podle toho, jaká je aktuální adresa, ale tak aby to FB script nějak zaregistroval. Myslím si, že ten Ajax by mohl nějak fungovat, ale těžko říct. Právě proto píši sem.
Str4wberry
Profil
Já myslím, že ti rozumím dobře. Musíš právě využít vlastnosti, že když do adresy za # přidáš ten vykřičník, tak ti obsah za ním Facebook převede na ono _escaped_fragment_=něco. Ve svém souboru index.php si potom zajistíš, že při tomto přítomném parametru vrátíš (klidně jenom) potřebný titulek a popis.

Mimochodem, ta stránka není udělaná úplně šťastně. Tipoval bych, že pro vyhledávače bude její indexování oříškem.
David1256
Profil
Díky za vodítko. Brouzdám teď různě po internetu, abych více pochopil to, kam se mě snažíš navést. Tedy pokud mám adresu http://test.metalforever.info/#!stranka=novinky&cisloStranky=1&rubrika=novinky&clanek=24 Adresa se jakoby změní na http://test.metalforever.info/?_escaped_fragment_=stranka=novinky&cisloStranky=1&rubrika=novinky&clanek=24 Pokud zadám 2. adresu, tak je obsahem $_GET['_escaped_fragment_'] "stranka=novinky", pokud zadám první adresu, tak je obsahem $_GET['_escaped_fragment_'] nic. Asi mi něco uniká, ale jak zjistím pomocí tohoto z adresy za #! třeba proměnnou $_GET['clanek']?
_es
Profil
David1256:
Časť adresy za # sa serveru neodosiela.
Str4wberry
Profil
V $_GET['_escaped_fragment_'] by měla být celá adresa a jak už část názvu escaped napovídá – je escapovaná. Tudíž by tam mělo být něco jako „stranka%3Dnovinky%26cisloStranky%3D1%26rubrika%3Dnovinky%26clanek%3D24“.

Z toho si funkcí urldecode uděláš „stranka=novinky&cisloStranky=1&rubrika=novinky&clanek=24“. Teď je potřeba si to trochu rozdělit. Pokud bys zvolil nějaký jednodušší formát adres, tak by se to dost zjednodušilo.

Pokud jsou ale všechny adresy takovéto, tak bych na to šel regulárním výrazem.
preg_match("/stranka\=([a-z]*)&cisloStranky\=([0-9]*)\&rubrika\=([a-z]*)\&clanek=([0-9]*)/i", urldecode($_GET['_escaped_fragment_']), $matches);

A jednotlivé hodnoty proměnných si přiřadíš do potřebných proměnných. V nejhorším případě takto natvrdo do $_GET.
$_GET['stranka'] = $matches[1];
$_GET['cisloStranky'] = $matches[2];
$_GET['rubrika'] = $matches[3];
$_GET['clanek'] = $matches[4];

A mohlo by to fungovat.
David1256
Profil
Nevím proč, ale v $_GET['_escaped_fragment_'] se po zadání adresy http://test.metalforever.info/#!stranka=novinky&cisloStranky=1&rubrika=novinky nic nezobrazí. Výpis dat mám udělaný takto.
<?php
$escaped = $_GET['_escaped_fragment_'];
echo $escaped;
echo '<span style="color:red;">Před tímto by se mělo vypsat escaped</span>';
?>
Ugo
Profil
David1256:
viz. _es
Keeehi
Profil
David1256:
Funguje to asi takto: Facebook má zobrazit http://test.metalforever.info/#!stranka=novinky&cisloStranky=1&rubrika=novinky, zjistí, že se v adrese vyskytuje sekvence #!, takže místo načtení informací z té původní stánky načte tuto adresu http://test.metalforever.info/?_escaped_fragment_=stranka%3Dnovinky%26cisloStranky%3D1%26rubrika%3Dnovinky. Z toho co najde na této stránce si vytáhne potřebné informace. Ovšem v odkazuje stále na původní adresou.

=> odkazuje na http://test.metalforever.info/#!stranka=novinky&cisloStranky=1&rubrika=novinky avšak data tahá z http://test.metalforever.info/?_escaped_fragment_=stranka%3Dnovinky%26cisloStranky%3D1%26rubrika%3Dnovinky
Kcko
Profil
[#14] Str4wberry
Nebylo by vhodnější místo regexpu použít parse_str / parse_url?
David1256
Profil
Chápu, jak má toto fungovat. Pročetl jsem si o tom i dokumentaci na Googlu, ale i přesto mi to nevypisuje hodnotu proměnné $_GET['_escaped_fragment_'], tak jak by mělo, respektive nevypíše mi to nic. Kód jsem zjednodušil na čisté PHP a i přesto to nefunguje. Zřejmě bude někde stále "zakopaný pes". Mám url http://test.metalforever.info/zkouska.php#!stranka=novinky&cisloStranky=1&rubrika=novinky&clanek=25 Obsah souboru zkouska.php je následovný
<?php
$escaped = $_GET['_escaped_fragment_'];
echo $escaped;
echo '<span style="color:red;">Pred timto by se melo vypsat escaped, ale nic se nevypise</span>';
?>
Klidně si to někdo zkuste u sebe, jestli vám to půjde, kód je opravdu stručný. Ale mně to prostě nechce chodit.
Radek9
Profil
David1256:
Jestli jsem to pochopil správně, tak FB se nedotazuje na zkouska.php#!neco, ale na zkouska.php?_escaped_fragment_=!neco. Takže si tam pro to dej podmínku a FB pošli správná data.
_es
Profil
David1256:
Kód jsem zjednodušil na čisté PHP a i přesto to nefunguje.
Mám url http://test.metalforever.info/zkouska.php#!stranka=novinky&cisloStranky=1&rubrika=novinky&clanek=25
Už som to písal v [#13], serveru bude odoslaný dotaz na url http://test.metalforever.info/zkouska.php, časť za # sa serveru neposiela, pracuje s ňou len prehliadač, respektíve JS.
David1256
Profil
_es:
Četl jsem tvůj názor, ale když tu jsou lidé kteří tvrdí opak, tak si rád pročtu i zbytek. Já se ptám, takže nevím, co je pravda. Na jednu stranu mi přijde tvá odpověď logická, na stranu druhou si říkám, že by mohlo být něco i na těch ostatních viz https://developers.google.com/webmasters/ajax-crawling/docs/html-snapshot?hl=cs-CZ
Chamurappi
Profil
Reaguji na Davida1256:
Četl jsem tvůj názor
Není to názor, je to fakt. (I když před pár lety byl Facebook schopný posílat požadavky i na adresy s mřížkou, k nemalému údivu serverů :-))

když tu jsou lidé kteří tvrdí opak, tak si rád pročtu i zbytek
Myslím, že nejsou. Neuvědomuješ si, že to, co Facebook vidí, nesouvisí přímo s tím, co vidí uživatelé. Uživatel si u tebe ťukne na nějaké to facebookové tlačítko, tím se pošle informace Facebooku, že se má tvá adresa nafacebookovat, Facebook k tobě pošle robota na adresu, ve které nahradí #! za ?_escaped_fragment_= a odtamtud si vysosá, co vysosat chce. (Alespoň tak jsem pochopil ostatní příspěvky já.)
_es
Profil
David1256:
Četl jsem tvůj názor, ale když tu jsou lidé kteří tvrdí opak, tak si rád pročtu i zbytek.
Netvrdia opak, len predpokladali, že ti to je známe. A že s časťou adresy za # budeš pracovať v JS - tak ako aj Facebook.
David1256
Profil
Ok. Už jsem zjistil, že mi FB opravdu vyhodí adresu http://test.metalforever.info/?_escaped_fragment_=stranka%3Dnovinky&cisloStranky=1&rubrika=novinky&clanek=25 Ovšem když si vytáhnu GET['_escaped_fragment_']; tak mi to vrátí pouze řetězec "stranka=novinky" zřejmě proto, že znak & není escapován. Jenže jak mám v tom případě zjistit proměnnou clanek z adresy, když mi řetězec končí dávno před ní?


Tak jsem to prohnal Debuggerem a vrací to už správné hodnoty. Zajímavé .-). Snad to už konečně dotáhnu do správného konce.
Str4wberry
Profil
Kcko, zřejmě ano.
David1256
Profil
Tak jsem zjistil ještě jeden zajímavý fakt ohledně fungování "FB like buttonu". Pokud je "FB like button" umístěn na stránkách, jejichž adresa pracuje se shebangem (#!), tak po kliknutí na FB like button se změní tlačítko "to se mi líbí" na takové to zšedlé, které vyjadřuje, že se vám daná stránka už líbí. Ovšem pokud na tuto již "olajkovanou" stránku přijdete z odkazu z FB profilu, tak se tlačítko zobrazí v podobě, jako kdyby se vám daná stránka nelíbila (na tlačítku je symbol toho palce nahoru místo fajfky). Zřejmě proto, že si to prvně zapamatuje adresu ve tvaru neco.php#!promenna=hodnota a podruhé tuto neco.php?_escaped_fragment_=promenna=hodnota a bere je to asi jako 2 odlišné stránky, i když jsou ve skutečnosti stejné. Pro pochopení problému přikládám i video.

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: