předání dat z javascript do PHP

Ernst
13. zář 2015 19:33 #123365
Potřebuji z prohlížeče dostat geolokaci zpět na server do PHP.
Přečetl jsem si toto www.zdrojak.cz/clanky/geolokace-v-prohlizeci/ a www.pehapko.cz/zakladni-kurz/15-php-a-javascript
ale nedokážu si to nějak spojit dohromady.
Když ty hodnoty budu mít v PHP, tak už si dál poradím

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od H13
13. zář 2015 22:58 #123368
Ahoj, PHP je statické, to znamená, že co se vygeneruje, tak to už nezměníš. Můžeš vygenerovat Javascript kód, ale ne naopak.

PHP vygeneruje javascript kód ale Javascript nevygeneruje PHP.

Javascriptem můžeš vytvořit nový požadavek na server (přes AJAX nebo standardní cestou) a když tam zadaš specifický parametr, pak s ním můžeš na server pracovat, příklad:

1) PHP vygeneruje Javascript např s tím, že na něco klikneš a on pošle požadavek na server, např.:
2) Javascript dá požadavek s URL index.php?javascripthodnota=1
3) znovu se načte stránka s parametrem javascripthodnota=1 - tedy na serveru zjistíš metodou GET (nebo POST) jakou hodnotu má parameter "javascripthodnota" a podle toho zařídíš výstup z PHP

V tvým případě např. pošleš index.php?long=1111111111&lat=22222222222 a podle zadaných kritérií v PHP rozhodneš, co za výstup se vytoří - např. vygeneruješ mapu s touto pozicí.

Phoca Gallery - http://www.phoca.cz/phocagallery - obrázková galerie (Joomla!)
Phoca Guestbook - http://www.phoca.cz/phocaguestbook - kniha návštěv (Joomla!)
Phoca Download - http://www.phoca.cz/phocadownload - stahování souborů (Joomla!)
Phoca Cart - http://www.phoca.cz/phocacart - e-shop,...
Poděkovali: Ernst

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Ernst
15. zář 2015 10:16 #123397
teoreticky to chápu, ale už na začátku jsem narazil na jeden problém.
Když do php vypíši: (jen jsem něco libovolného zkusil)
..... php kód
?>
<script>
function zkouska(){
var promena=”Toto je pokusný text”;
document.write (promena + ” vložený do PHP”);
}
</script>
<?php
echo “<script>zkouska(); </script>”;
?>
Tak mi to vypíše chybu Parse error: syntax error, unexpected '>'

Předpokládám, že je to tím, že to php je uvnitř třídy. Jak to tedy napsat? Musím si založit samostatný javascript soubor a ten volat?

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Cony
15. zář 2015 11:43 #123403
Vytvoření samostaného JS souboru je nejrozumnější, potřebujete-li parametrizovat na základě hodnot z PHP tak přímo do HTML vkládat je minimální kód.

Javascript pak vkládejte pomocí JDocument::addScript, JDocument::addScriptDeclaration nebo JHTML::_('script',...) viz dokumentace .

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Ernst
15. zář 2015 11:51 #123406
děkuji.
Byla ta předchozí chyba způsobena tím, že to php bylo ve třídě?

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Cony
15. zář 2015 14:04 #123410
Nemyslím, na první pohled v tomhle úryvku syntax chybu nevidím.
Ale není to určitě dobrý přístup, do třídy začleňovat HTML.

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Ernst
17. zář 2015 11:28 #123445
Přiznávám, že tady stále tápu.
Pokud to vezmu z návodu od conyho a dám
$document = JFactory::getDocument();
$document->addScriptDeclaration('
window.event("domready", function() {
alert("An inline JavaScript Declaration");
});
');
tak do objektu $document doplním pole ($document->_script) s tímto scriptem.
Ale stále mi nedochází, jak to poslat na klienta.
Pokud to chápu dobře, tak javasript musí na konci zavolat index.php?long=xxxx &lat=yyyy.
ale ještě jsem se nedostal k tomu, jak ty hodnoty metodou post nebo get přečtu

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Cony
17. zář 2015 12:39 #123446
"Poslání" na klienta za Vás při tomto postupu řeší Joomla.

Používáte window.domready - nezapomeňte tedy také nahrát MooTools. V dnešní době bych ale doporučil spíš používat jQuery, MooTools budou z Joomly odstraněny.

Skript Vám na server musí poslat asynchroní požadavek, a Vy jej musiíte zpracovat. Prvně se musíte rozhodnout kde jej budete zpracovávat (v komponentě, pluginu, modulu), a podle toho bude vypadat ono URL požadavku.

Hodnoty vstupů viz dokumentace .

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Ernst
17. zář 2015 12:56 - 17. zář 2015 13:00 #123447
Tak a teď jsem se v tom ztratil.
Prvně potřebuji poslat ten javascript na klienta.
Podle dokumentace by stačilo echo , ale to mi hlásilo chybu syntaxe (viz níže).
Dále jsem chtěl postupovat, jak psal H13.
A teď z toho mám v hlavě už guláš

nechci se učit javascript, já to potřebuji jen pro tento jeden případ a zde je už javascript vytvořen

volat to chci z modulu z jedné funkce ve třídě a na tom samém místě to přečíst.

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Cony
17. zář 2015 13:31 #123448

ernst napsal: volat to chci z modulu z jedné funkce ve třídě a na tom samém místě to přečíst.

Ale takhle přece JavaScript nefunguje. To čemu říkáte "poslání na klienta" je vypsání kódu Javaskriptu do HTML. To můžete udělat pomocí echo, ale pak si musíte hlídat v kterém místě echo voláte, aby se skript vypsal tam kam má, nebo pomocí výše uvedeného způsobu. To je první krok.

Druhý krok je to, že ten Javaskript musí něco udělat, ve Vašem případě zavolá jakousi adresu s nějakými parametry. Tečka.

Třetí krok je to, že na uvedené adrese musí něco požadavek zpracovat a něco s ním udělat. Jste v Joomle, měl by jste použít prostředky Joomly, pro tento konkrétní případ můžete použít komponentu com_ajax a zpracovávat dotaz v modulu. Zapomeňte na "zpracování v tom samém místě", jsou to dva naprosto oddělené kroky, dva oddělené požadavky na server, nemůžete čekat že "pošlete javaskript na klienta" a v následuícím příkazu PHP už zpracováváte odpověď.

Nemusíte se učit javaskript, pokuste se ale alespoň naučit jak věci principielně fungují.
Poděkovali: Ernst

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Ernst
17. zář 2015 15:21 #123449
Díky
ajax rozhraní mám nainstalované, teď se jdu prokousávat dokumentací.

Kdy ten javascript volám, je asi celkem jedno, protože potřebuji jeho hodnoty vrátit do PHP, sám nic nevypíše (tedy nepotřebuji aby něco vypsal.)

Já bohužel něco pochopím, až když to vidím napsané jako příklad (viz. požití Usort pro třídění vícerozměrných polí jsem plně pochopil, až jste mi to napsal jako příklad). Už dva dny hledám na netu nějaký kompletní příklad na předání hodnot z JS do PHP a nemohu nic najít. Všude je to napsáno obecně a ne konkrétně.

Chápu, že php se již ukončí, když se provede ten javascript a že to zpětné volání stránky s parametry musím znovu přečíst.
Ale chtěl bych to někde vidět napsané na libovolném funkčním příkladu.

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Ernst
20. zář 2015 22:52 #123489
tak jsem se soustředil jen na ajax a přečetl si spoustu článků a částečně jsem pochopil ajax.
Nadefinuji si jedno nebo více políček a tlačítko
<div id="results"></div>
<input type="text" name="name" id="name" value="">
<input type="button" class="button" id="savename" value="jmeno">

zavolám
$document = &JFactory::getDocument();
$document->addScript('/components/com_lovefactory/js/lokace.js')

lokace.js je:
jQuery(document).ready(function(){
jQuery("#savename").click(function(){
var name = jQuery('#name').val();
jQuery.post("/components/com_lovefactory/lokace.php?name="+name , {
}, function(response){ jQuery('#results').html(jQuery(response).fadeIn('slow'));}); });});

a souboru lokace.php si to přečtu:
<?php
define( '_JEXEC', 1 );
if (stristr( $_SERVER, 'win32' )) {
define( 'JPATH_BASE', realpath(dirname(__FILE__).'\..\..' ));
} else define( 'JPATH_BASE', realpath(dirname(__FILE__).'/../..' ));
define( 'DS', DIRECTORY_SEPARATOR );
require_once ( JPATH_BASE.DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE.DS.'includes'.DS.'framework.php' );
$app =& JFactory::getApplication('site');
$app->initialise();
jimport( 'joomla.user.user' );
jimport( 'joomla.user.helper' );
$name = $_REQUEST; ?>

Ale zatím nevím, jak to lokace.js napsat, aby nevyplňoval žádný políčka, ale poslal latitude a longitude,
To znamená tento JS:
function showPosition(position) {
alert("[" + position.coords.latitude + " ; " + position.coords.longitude + "]");
}
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(showPosition);
} else {
alert("ERR: Prohlizec nepodporuje Geolocation API");
}
ale aby mi místo alertu vrátil tyto hodnoty na server

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od karel
21. zář 2015 00:10 - 21. zář 2015 00:10 #123490
... "aby mi místo alertu vrátil tyto hodnoty na server" ...
na serveru to je v okamžiku, kdy "zavoláte" soubor lokace.php (... $name = $_REQUEST; )(tj se to na serveru už jednou zpracovalo), tak si to zpracujte jak potřebujete rovnou z toho. A pokud se má odeslat Lang i Lat. později (po vyplnění celého formuláře), pak potřebujete (pro jednoduchost) vyplnit právě tyto do políčka (třeba skrytého), a odeslat najednou.

Znáte-li řešení, sdělte ho - pomůžete ostatním při řešení stejného problému, i případný "rádce" bude vědět, poradil-li správně nebo špatně.
Poděkovali: Ernst

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Ernst
21. zář 2015 11:15 - 21. zář 2015 11:16 #123495
tak jsem zkusmo udělal ten JS:
function showPosition(position) {
lat = position.coords.latitude ;
lon = position.coords.longitude ;
}
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(showPosition);
} else {
alert("ERR: Prohlizec nepodporuje Geolocation API");}
jQuery(document).ready(function(){
jQuery("#savename").click(function(){
var name = jQuery('#name').val();
jQuery.post("/components/com_lovefactory/models/lokace.php?latitude="+lat+'a'+lon, {
}, function(response){
jQuery('#results').html(jQuery(response).fadeIn('slow'));
});});});

a ten mi vrátí latitude+longitude
Asi to ale dělám složitě, potřebuji na server poslat jen ty dvě hodnoty, nepotřebuji žádné vstupní pole ani buttom. nemá se prostě nic zobrazit. Jak to napsat správně?
Je možné na server poslat dvě proměnné nebo jen jednu a tu si v PHP rozdělit?

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Cony
21. zář 2015 12:41 - 21. zář 2015 12:43 #123496
V tom JS máte špatně sled volání jednotlivých funkcí, a způsob předání parametrů do AJAX.
funkce getCurrentPosition maá jako parametr funkci, která se asynchronně zavolá po zjištění souřadnic. Nemůžete tedy zavolat funkci getCurrentPosition a pak pokračovat v kódu, který výsledek zpracovává, výsledek v ten okamžik vůbec nemusí existovat. Odesílat data musíte až v callback funkci.

Oddělovač pro parametr v URL není 'a' ale & :)

Bez omáčky kolem jen s výpisem chyb do konzole by to tedy mohlo být nějak takto
jQuery(function(){
	if (navigator.geolocation) {
		navigator.geolocation.getCurrentPosition(function(position) {		
			jQuery.ajax({
				url: '...',
				data: {lat: position.coords.latitude, lgt: position.coords.longitude}
			}).done(function(){
				console.log('Odesláno');
			}).fail(function(){
				console.log('Odeslání selhalo');
			});
		}, function(error){
			console.log('Zjitění souřadnic selhalo');
			console.log(error.message);
		});
	}
});

Na serveru zpracováváte výsledek v samostatném PHP souboru, který si natahuje framework Joomly, to také není ideální. Měl by jste si upravit přímo komponentu, její controller a model tak aby jste mohl volat Joomlu přímo. Pro inspiraci se můžete podívat např. na com_ajax o které už jsem psal.
Poděkovali: Ernst

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.