Przekazanie array z php do javascript.

0

Witam.
Zgłębiam PHP i mysql. Po wcześniejszym zapoznaniu się z javascript wykorzystuję tę wiedzę przy generowaniu stron z pomocą PHP. I teraz:

$aTablica = ["wyraz1", "wyraz2", "wyraz3"];
echo '<script>f_jakaś_funkcja_js( $aTablica );</script>';

Powyżej przykład co chciałbym uzyskać.
Na chwilę obecną rozbijam array php na string, a w javascript ponownie przerabiam na tablicę.
Jak długi może być parametr przekazany do funkcji js?

Jakieś rady lub inne metody?

Pozdrawiam
Radosław Głębicki

3

Tablicę możesz zakodować do json w PHP przy użyciu jsone_encode() i przekazać w takiej formie do JS. Jednak wykonie funkcji w JS od razu wraz z przekazaniem jej jakichś wartości, jak w przykładzie to raczej zła droga.

0

Zrobiłem tak, że gdy wracają dane linii w tabeli, które mają być zmienione to nie generuję nowej <form> z wypełnionymi value= tylko podmieniam pola value= za pomocą js. Tam właśnie wysyłam array. Ale teraz, fakt, mogłem wszystko generować za pomocą php. A wracając do rozwiązania z json. Jak to wstawić do mojego przykładu.
To co znalazłem w necie to sugeruje umieszczenie w skrypcie js <? ?> znaczników php. Ale przecież ja jestem w php w rozkazie echo. A czy json to znaczy zapis do pliku, a później zwyczajnie XMLRequest w javie GET i odczyt?

1

Jeżeli generujesz formularz przy ładowaniu stron i chcesz tam od razu zapakować wartości domyślnie - użyj PHP'a.
Jeżeli formularz już istnieje a chcesz w locie wrzucać do input'ów poszczególne wartości - użyj AJAX'a i za pomocą selektorów podmieniaj wartości.

0

W poście powyżej podałem, że tak robię z użyciem js. Chodzi o wykorzystanie json_encode() przy wywoływaniu funkcji js.

echo '<script>f_jakaś_funkcja_js( json_encode($aTablica) );</script>';

Czyli tak?

1

Jak dasz pojedyncze cudzysłowy to zmienna nie jest interpretowana. Daj podwójny cudzysłów.
Zamiast ' daj "

2

Oto jak buduje się obiekty w JS:

https://www.w3schools.com/js/js_objects.asp

<script type="text/javascript">
var car = {type:"Fiat", model:"500", color:"white"};

function mojaFunkcja(obiekt)  {
alert( obiekt.type );
}

mojaFunkcja( car );
</script>

Zmienną car możesz budować w PHP

1

Zamiast obiektu może być tablica:

https://www.w3schools.com/js/js_arrays.asp

<?php
///////////////
// PHP
$tablica = ["ola", "ela", "dominika"];
?>

<script type="text/javascript">
var dziewczyny = [<?php
$first = true;
$content = '';
foreach ($tablica as &$dziewczyna) {
  $first ? $first = false : $content .= ',';
  $content .= '"'.$dziewczyna.'"';
}
echo $content;
?>];


function mojaFunkcja(tablica)  {
 alert(tablica[0]);
}

mojaFunkcja( dziewczyny );
</script>
0

Na chwilę obecną przekazuję tablicę do funkcji js jako string, a pola oddzielam ###.
W czym powyższe jest lepsze? Zamknięte w cudzysłów i oddzielone przecinkiem?
Podsunięto mi pomysł wykorzystania pliku json, bo zapytałem jak długa może być zmienna przekazana do funkcji js.

0

Miej w pamięci, że PHP działa po stronie serwera, JS po stronie klienta. Generowanie funkcji js phpem nie wiem czy będzie najładniejszym rozwiązaniem.
Teoretycznie żeby tylko działało, można wypluć te dane różnie, ale może warto rozważyć zrobienie API do pobierania danych, żeby to miało ręce i nogi.

1

Musisz jakoś zserializować dane i je przekazać. Może to być CSV, JSON, XML, YAML, FormData, Headers, cokolwiek.

0

Czyli moja metoda rozbicia array i oddzielenia "###" jest takim zserializowaniem? A czy przy większej liczbie pół? W PHP tworzyć plik na serwerze. Parametrem funkcji js będzie adres i nazwa tego pliku na serwerze. W funkcji js XMLHttpRequest GET i pobrać ten plik i go przetworzyć? Tak?

1
Radosław Głębicki napisał(a):

Czyli moja metoda rozbicia array i oddzielenia "###" jest takim zserializowaniem?

Technicznie niby tak, ale zauważ że takim sposobem nie jesteś w stanie wysłać tekstu który zawiera w sobie ###, bo zostałyby potraktowane jako separator. Musiałbyś to jakoś obsłużyć; albo nie pozwolić na wysyłanie takiego ciągu. Dodatkowo w takim formacie wyślesz tylko string, nie wyślesz inta, booleana ani innych zagnieżdżonych typów jak lista lub mapa.

A czy przy większej liczbie pół?

Serializacja powinna działać tak samo dla dowolnej ilości pól. Te które wymieniłem tak działają, nawet dla 1000 pól.

W PHP tworzyć plik na serwerze. Parametrem funkcji js będzie adres i nazwa tego pliku na serwerze. W funkcji js XMLHttpRequest GET i pobrać ten plik i go przetworzyć? Tak?

Nooo, mógłbyś to zrobić ale to się wiąże z pewnymi założeniami. Po pierwsze musisz mieć dostęp do systemu plików; a jeśli tak to musiałbyś mieć bezpieczną strukturę, żeby przez przypadek ktoś nie zrobił Ci szkodliwie szkody w systemie plików. Żeby je zapisać musisz odpowiednio potraktować zamianę danych z formatu "webowego" (url, html, etc.) na format filesystem (ścieżki, nazwy, .., /, łączenie ścieżek, etc.). I akurat w PHP bardzo łatwo się walnąć i zrobić błąd. Musisz się liczyć z dodatkowym miejscem które musisz poświęcić na te pliki; musisz je serwować z servera odpowiednio, ładować je w kliencie; i pamiętaj że na 99% przeglądarki Ci zcache'ują ten plik, więc jak go podmienisz, to będziesz musiał jakoś zinwalidować ten cache.

Po prostu wysłanie zserializowanych danych jest dużo lepszym rozwiązaniem. JSON jest najbardziej popularnym, ale każde z tych które wymieniłem byłoby ok. Nie musisz się zupełnie martwić tym że będzie duży :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1