Přihlásit se

předání dat z javascript do PHP

13. zář 2015 19:33 #123365
předání dat z javascript do PHP od Ernst
Joomla Expert
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

13. zář 2015 22:58 #123368
Odpověď od H13
Admin
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 Cart - www.phoca.cz/phocacart - e-shop, e-commerce
Phoca Gallery - www.phoca.cz/phocagallery - obrázková galerie
Phoca Download - www.phoca.cz/phocadownload - stahování souborů
Phoca Guestbook - www.phoca.cz/phocaguestbook - guestbook
Poděkovali: Ernst

15. zář 2015 10:16 #123397
Odpověď od Ernst
Joomla Expert
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?

15. zář 2015 11:43 #123403
Odpověď od Cony
Moderátor
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 .

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

15. zář 2015 14:04 #123410
Odpověď od Cony
Moderátor
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.

17. zář 2015 11:28 #123445
Odpověď od Ernst
Joomla Expert
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

17. zář 2015 12:39 #123446
Odpověď od Cony
Moderátor
"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 .

17. zář 2015 12:56 - 17. zář 2015 13:00 #123447
Odpověď od Ernst
Joomla Expert
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.

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

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

17. zář 2015 15:21 #123449
Odpověď od Ernst
Joomla Expert
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.

20. zář 2015 22:52 #123489
Odpověď od Ernst
Joomla Expert
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

21. zář 2015 00:10 - 21. zář 2015 00:10 #123490
Odpověď od karel
Zkušený uživatel
... "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

21. zář 2015 11:15 - 21. zář 2015 11:16 #123495
Odpověď od Ernst
Joomla Expert
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?

21. zář 2015 12:41 - 21. zář 2015 12:43 #123496
Odpověď od Cony
Moderátor
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
Code:
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

Powered by Fórum