Autor Zpráva
David1256
Profil
Navazuji zde na toto téma Nepřerušování přehrávání playeru na stránce při změně odkazu
Zjistil jsem, že se asi nevyhnu předávání proměnné z JS do PHP. Zjistil jsem, že to jde pomocí Ajaxu nebo cookies, ale nikde jsem nenašel podrobný návod. Poradíte mi někdo, jak pomocí jedné z těchto dvou variant vysosám JS proměnou do PHP? Díky.
Str4wberry
Profil
A kde jsi hledal?

Nejčastější potíže s PHP (FAQ) » Jak přenést proměnnou z javascriptu do PHP
David1256
Profil
Díky. Rozhodl jsem se pro cookie. Mám následující kód:
set_cookie ( "stranka", "window.document.write(stranka);"); 
Chci aby se mi do cookie uložila hodnota proměnné stranka, ale místo toho se mi tam uloží řetězec "window.document.write(stranka);" Kde je chyba? Díky.
Obávám se jestli to přes ty cookie opravdu jde...


Tak to zkouším i přes JQuery a taky to nejde. Mám kód.
<script type="text/javascript">
// jQuery část
$.get('test.php', {jmeno: "Pepa", prijmeni: "Novak"});
// odešle pomocí metody get PHP skriptu test.php dvě
// proměnné, jmeno a prijmeni 
</script>
<?php include "test.php";?>
Obsahem testu.php je:
<?php
// PHP část       
$jmeno = $_GET['jmeno'];
$prijmeni = $_GET['prijmeni'];
echo $prijmeni;
// Přijmutí proměnných v PHP pomocí metody GET
?>
Ovšem hodnotu $prijmeni, což by mělo být "Novak" to taktéž nevypíše. Ve stránce mam normálně toto JQuery <script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js">
anonymní
Profil *
Místo
set_cookie ( "stranka", "window.document.write(stranka);");
použij
set_cookie ( "stranka", stranka);
David1256
Profil
Díky. Cookie funguje. Nicméně si to bere jen hodnoty když je zadám přímo do url a načtu stránku. Když měním proměnné location.hashem v průběhu brouzdání po stránkách a nereloaduju, tak je cookie stále nedefinována. Jak kdyby potřebovala prostě reload stránky, aby se přiřadila. Takže to vypadá, že budu muset použít to JQuery.get(), které nebude pořebovat reload stránky. Jenže to mi nechce fachčit viz Jak dostat JS proměnnou do PHP pomocí Ajaxu nebo cookies
Alphard
Profil
David1256:
O co se teď vlastně snažíte? Nechat jednu stránku bez reloadu, kde bude hrát váš přehrávač a AJAXem tahat okolní obsah?
David1256
Profil
Alphard:
Nechat jeden div, ve kterém bude hrát přehrávač a ostatní obsah, aby se nechal měnit. Normálně měním url a načtám si potřebný obsah kam chci a přehrávač pořád hraje bez přerušení. Jenže to je zatím vše jen přes JS smíchaný s AjaxLoaderem. Až budu potřebovat používat proměnné v php kvůli tahání údajů z db, tak mi JS nepostačí, proto potřebuji přenést proměnnou z JS do PHP. Koukal jsem už na jednu stránku, kde to funguje podobně jako potřebuji, takže vím, že to je možné udělat. Na té stránce právě pracují s tím JQuery.get(). Jenže mně se ho nedaří rozchodit. Přes něj by se měla nechat předat hodnota JS proměnné do PHP proměnné bez reloadu stránky. O něco výš v diskusi jsem naznačil, jak se to snažím přes to JQuery udělat, ale někde je problém, protože to nefunguje. Snažím se tedy teď rozchodit to předání proměnné přes JQuery.
Alphard
Profil
Šel bych na to cestou Nette řešení http://addons.nette.org/cs/jquery-ajax (sám o sobě není tento odkaz dostatečný k pochopení principu).

Funguej to asi takhle: Vygeneruje se normální stránka, ale na <a href=""> se naváží js události, které na samotná url z odkazů pošlou AJAXově požadavky. Server vyhodnotí odpověď a odešle zpět požadovaný kód (obsahující žádanou část, bez hlaviček apod), který se nalepí na patříčné místo podle id prvku.
Ve vašem případě je tady zjednodušení, že aktivně pracujete s jediným html elementem, nějaká hlavní část stránky.

Ale upozorňuji, že tvořit podobnou aplikaci nebude jednoduché. Klasicky je přechod na jinou stránku v podstatě restart, tady se začnou kumulovat veškeré chyby. Aby to v půlce prohlížečů po půl hodině neskončilo neovladatelnou stránkou...


Alternativa je vše vykreslit v javascriptu, použít js templates apod., ale to je ještě řádově těžší.
Lukáš R.
Profil
David1256:
Nevím jestli jsem to správně pochopil, ale podle mě <?php include "test.php";?> nemůžeš použít, protože v té době, kdy se zpracovává stránka na serveru, ještě server nemá odpověď z AJAXu. To by muselo být <?php include "test.php?jmeno=Pepa&prijmeni=Novak";?>
David1256
Profil
Myslím, že přes to Nette bysem tomu musel dát zase kupu času než by to fungovalo. JS templates neznám, takže by to byl asi taky běh na dlouhou trať. Nicméně jsem už pošteloval cookies do takové podoby, kdy mi už fungují tak, jak chci. Je to sice pár řádků kódu navíc, ale stále o 99% méně než kdybych tam tahal celé JQuery + script s JQuery.get().

Takže shrnutí mého řešení pro někoho, kdo bude na jpw.cz hledat odpověď na stejný problém:
1) Celé to funguje na principu kombinace Javascriptové funkce location.hash, AjaxLoaderu a práce s cookies.
Můj odkaz tedy vypadá nějak takto. (Konkrétně u stránkování)
<a onclick="var cislo = get_cookie('cislo'); var cislo = parseInt(cislo)+1; set_cookie('cislo', cislo); ajaxLoader('includy/novinky.php','prostredek'); window.location.hash='stranka=novinky#cislo='+ cislo";>Další</a>
Abych to vysvětlil, tak po kliknutí na odkaz na další stránku se mi musí změnit hodnota cookie, ve kterém uchovávám hodnotu o číslu stránky o 1. Takže první zjistím současnou hodnotu cookie "cislo" a tu pak zvýším o 1 a uložím do té samé cookie. AjaxLoaderem pak načtu obsah pouze do divu, jehož obsah chci změnit. No a samozřejmě musím změnit i adresu url, aby si návštěvníci stránky mohli posílat odkazy na tu část obsahu stránky, na kterou odkazují. To zajišťuje právě location.hash.
Hodnoty proměnných z hashe získávám k tomu účelu upraveným scriptem. Funkce get_cookie není zabudovaná funkce JS, ale taktéž vytvořená. Na netu je takových funkcí docela dost.
Možná poslouží k pochopení ještě tato část kódu, kterou načítám obsah při potvrzení url adresy.
  <script type="text/javascript">
  if(stranka=="undefined") //zajímavé je, že (!stranka) nefungovalo
  {
  set_cookie('stranka', 'novinky');
  var cislo = parseInt(cislo); //cislo je definovaná výš na hodnotu 1. Tedy v tom případě pokud není definované, tak mu to dává ve scriptu o něco výše hodnotu 1
  set_cookie('cislo', cislo);
  ajaxLoader('includy/novinky.php','prostredek');
  }
  else
  ajaxLoader('includy/'+ stranka +'.php','prostredek');
  </script>
Snad to někomu poslouží jako inspirace.

Díky všem za rady. Byly užitečné a bez nich bych to nejspíš nezvládl.
nemeja
Profil
A co udělat, že jakmile se klikne na nějaký odkaz ( přesměrování ) tak se uloží do cookies aktualní čas přehrávaného videa a na druhé stránce se na to jen naváže ;)
David1256
Profil
Takové řešení tu už někdo navrhoval. Ono by to šlo, ale při přesměrování to sice na chvíli ale stejně přeruší přehrávání. Přes toto řešení půjde pořád plynule.
Str4wberry
Profil
Snad to někomu poslouží jako inspirace.

Snad ne, protože.

1) Je to nesmyslně složité. Nevidím smysl si něco ukládat do cookie, když můžeš stejnou adresu, která by normálně byla v <a href> předat té tvé funkci ajaxLoader('includy/novinky.php?cislo=2','prostredek').

2) Nevím, jestli ti to nedošlo, ale můžeš klidně volat ajaxLoader('index.php?stranka=novinky&cislo=2','prostredek'). JavaScript vůbec nezajímá, jak se obsah dané URL vytváří (že ho generuje PHP z určitých souborů pomocí include), zajímá se jen o výstup.

3) Tvé jakože odkazy jsou taktéž nešťastné řešení, jelikož jsou závislé na JS. (Vyhledávače s tím mohou mít problémy, nelze zkopírovat adresa odkazu atd.)

4) Chybí část kódu, která si vyzobne stránku, která se má načíst, z location.hashe (v případě, že si otevřu odkaz, který mi někdo poslal).
David1256
Profil
1) Ano to je lepší. Opraveno.
2) Nedošlo. Opraveno.
3) Ano to vím, ale jak to udělat bez JS?
4) Toto je kód, který vyzobává proměnné z url, s kterými se pracuje při načítání stránky z odkazu.
<script type="text/javascript">
  function  get_hash() {  //funkce, která získá z url ve tvaru např. "#stranka=kontakty" hodnotu kontakty atd.
    hash = document .location .hash.replace (new  RegExp ('^(.*)#'), ''); 
    get = {} 
    if  (hash) { 
        hash = hash.split ('&'); 
        for  (i = 0; i < hash.length ; i++) { 
            hash[i] = (hash[i]).split ('='); 
            get[hash[i][0]] = (hash[i][1] ? hash[i][1] : null); 
        } 
    } 
    return  get; 
 }
 _get = get_hash();
</script>
<script type="text/javascript"> 
var  stranka = _get.stranka;  //načítám obsah proměnné stranka z url
var  cisloStranky = _get.cisloStranky;  //načítám obsah proměnné cisloStranky z url
if(!cisloStranky)    //pokud není na stránku přistoupeno z přímého odkazu 
  var cisloStranky = 1;  //nastav cisloStranky na 1
var cisloStranky = parseInt(cisloStranky);  //převeď cisloStranky na typ integer kvůli matematickým operacím
 </script>  

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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