Přihlásit se

předání dat z javascript do PHP

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

21. zář 2015 14:16 #123497
Odpověď od Ernst
Joomla Expert
Já Vám strašně moc děkuji, že si mi takto věnujete. Hodně jste mně toho naučil.
ten sled funkcí se mi taky nezdál, ale fungovalo to. Dokonce jsem měl hned na začátku nadefinovány ty dvě proměnné, ale nebylo to třeba. Vysvětlit to samozřejmě neumím ani nepotřebuji.
To "a" jsem tam měl jen proto, že jsem zatím neuměl odeslat zpět dvě proměnný, tak jsem si výsledek v php rozdělil pomocí toho "a" na dvě proměnný.
Pomocí toho v php
$document = &JFactory::getDocument();
$document->addScript('/components/com_lovefactory/js/lokace.js');
se mi javascript odešle (do console vypíše odesláno), Jak to vlastně funguje mi není zcela jasné, ale beru to jako fakt a později se to doučim.
ale v tom lokace php to asi nemohu přečíst jako $_REQUEST ale musím použít $_GET?
Studoval jsem to na mnoha webech, nejnověji na jaknajquery.cz/ajax-a-jquery/ a www.koding.cz/priklady.php?id=26

Samozřejně bych raději upravil tu komponentu (z ní to volám) ale přijímám v jiném PHP, ale zatím to neumím.
Jde o stránku, kde zobrazuji uživatele a potřebuji vypsat vzdálenost od mé aktuální pozice.
Takže tu stránku (funkci) musím nějak znovu zavolat s parametry, které jsem získal z JS.
Nebo ten JS volat o něco dřív a použít Vámi nenáviděnou globální proměnnou s mojí geolokací. To by také teoreticky šlo?

21. zář 2015 16:11 #123498
Odpověď od Ernst
Joomla Expert
Někde je chyba a nevím kde
lokace.js:
jQuery(function(){
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(position) {
jQuery.ajax({
url: '/components/com_lovefactory/models/lokace.php',
data: {lat: position.coords.latitude, lgt: position.coords.longitude}
}).done(function(){
console.log('Odeslano');
}).fail(function(){
console.log('Odeslání selhalo');
});
}, function(error){
console.log('Zjitění souřadnic selhalo');
console.log(error.message);
});
}
});

ale to lokace.php se nezavolá

22. zář 2015 09:41 #123505
Odpověď od Ernst
Joomla Expert
Tedy ono se zavolá:
GET http://localhost/components/com_lovefactory/models/lokace.php?lat=50.0373925&lgt=14.309066399999999
ale v lokace php se mi nic neděje.
Poslané hodnoty nemohu zobrazit (třeba var_dump()) a když v tom lokace.php udělám úmyslně chybu syntaxe žádná chyba se nevypíše.
Prostě to vypadá, jako by to php neproběhlo.
Celé to lokace php jsem napsal jen:
<?php $lat = $_GET["lat"]; $lon = $_GET["lgt"];
var_dump($lat); var_dump($lat);?>

Ale nic se nevypíše. Kde prosím dělám chybu?

22. zář 2015 09:44 #123506
Odpověď od Cony
Moderátor
A kde jako čekáte, že se Vám to vypíše? Kontroloval jste v konzoli výsledek AJAX dotazu?

22. zář 2015 09:54 - 22. zář 2015 09:58 #123507
Odpověď od Ernst
Joomla Expert
ano kontroloval, vše OK
Myslím, že by se to mělo vypsat v tom PHP

PS Pokud do js přidám alert, tak to také vypíše správně

Možná jsme se trefili do stejného času a nečetl jste moji poslední odpověď

22. zář 2015 12:09 #123508
Odpověď od Cony
Moderátor

ernst napsal: ano kontroloval, vše OK
Myslím, že by se to mělo vypsat v tom PHP

Tak schválně, za domácí úkol se zkuste nad tím zamyslet, co to znamená to "vypsat v tom PHP", kde hledat to co si "vypíšte v tom PHP". (malá nápověda AJAX = Asynchronous Javascript And Xml).

Powered by Fórum