2012-06-04 9 views
23

Od czasu do czasu muszę przekazać kilka zmiennych z PHP do skryptu JS. Na razie zrobiłem to tak:Wydajny sposób przekazywania zmiennych z PHP do JavaScript

var js-variable = "<?php echo $php-variable; ?>"; 

Ale to jest bardzo brzydki i nie mogę ukryć mój skrypt JS w .js pliku, ponieważ musi być analizowany przez PHP. Jakie jest najlepsze rozwiązanie tego problemu?

+1

Mam nadzieję, że to tylko przykład, 'var js-variable' wygeneruje składni błąd, a także '$ php-variable' ... – MaxArt

+0

Uważaj na podwójne cytaty wewnątrz zmiennej php. – Jeroen

Odpowiedz

35

Jeśli nie chcesz używać PHP do generowania kodu JavaScript (i nie martw się o dodatkowe połączenie na twój serwer WWW), użyj AJAX do pobrania danych.

Jeśli chcesz używać PHP, zawsze koduj z json_encode przed wyprowadzeniem.

<script> 
    var myvar = <?php echo json_encode($myVarValue); ?>; 
</script> 
+0

+1 json to najlepszy sposób na wykorzystanie danych ze skryptu PHP, czy to przez ajax, czy w tym samym czasie, w którym strona jest kompilowana. – Joseph

+7

OSTRZEŻENIE: Może to spowodować zabicie witryny. Przykład: ''; ?> '. Aby uzyskać szczegółowe informacje, patrz [to pytanie] (http://stackoverflow.com/q/20942452/1402846). Rozwiązanie: Użyj ['JSON_HEX_TAG'] (http://www.php.net/manual/en/json.constants.php#constant.json-hex-tag), aby uniknąć' <' and '> '(wymaga PHP 5.3.0). – Pang

+0

Kolejną wadą tego jest wpływ na początkowy czas ładowania strony. – biplav

2

Jeśli zmodyfikować plik .htaccess zawierać

AddType application/x-httpd-php .js 

można użyć pliku js i będzie obsługiwane przez PHP, czyli połowę tego, co potrzebują.

Pod względem tego, jak brzydkie jest to rozwiązanie, powiedziałbym, że jest to najmniej szkodliwy mechanizm. Możesz spróbować przekazać cały skrypt JS za pomocą skryptu PHP w postaci ciągu znaków, a następnie przeszukać i zastąpić zmienne, które musisz wstawić, ale myślę, że zgodzisz się, że jest to brzydsze niż rozwiązanie, z którego obecnie korzystasz.

1

Jeśli chodzi o unikanie uruchamiania plików .js przez parser PHP, niewiele można zrobić, poza możliwością pobrania wartości js-variable za pośrednictwem wywołania AJAX.

Ponadto można rozważyć outputing wartość tak:

var js_variable = <?php echo json_encode ($php_variable); ?> 

uciec wszystkie rzeczy, które mogłyby zepsuć JavaScript.

6
<?php 
header('content-type:text/javascript;charset=utf-8'); 
printf('var foo = %s;', json_encode($foo, JSON_PRETTY_PRINT)); 

json_encode zapewnia poprawność kodu javascript. Nagłówek mówi przeglądarce, aby zinterpretował ją jako javascript.

następnie można połączyć się z nim jak pliku:

<script src="script.php"></script> 

Alternatywnie, może to być wygodne, aby osadzić wartość bezpośrednio w html zamiast tworzenia oddzielnego żądania HTTP. Czy to tak:

<script> 
    <?php printf('var foo = %s;', json_encode($foo, JSON_HEX_TAG | JSON_PRETTY_PRINT)) ?> 
</script> 

Należy używać JSON_HEX_TAG jeśli osadzanie w kodzie HTML, w przeciwnym razie istnieje ryzyko ataków XSS wtryskowych. Są też inne flagi, których możesz potrzebować, aby zwiększyć bezpieczeństwo w zależności od kontekstu, w którym go używasz: JSON_HEX_AMP, JSON_HEX_QUOT, JSON_HEX_APOS

2

umieścić wszystkie swoje js plików w folderze i skonfigurować serwer HTTP przekierować wszystkie żądania do tych plików do pliku PHP, który ładuje pliki i wysyła je.

Załóżmy masz Apache i Twoich plikach .js są w/JS:

RewriteRule /js /getjs.php 

getjs.php:

<?php 
header('Content-Type: text/javascript'); 
include_once($_SERVER['SCRIPT_NAME']); 
?> 
8

Proszę użyć api spp/rpc i przekazać json do swojego js. Można to zrobić w następujący sposób: jeśli używasz jQuery:

rest.php

<?php echo "{name:biplav}" ?> 

następnie od swoich js dokonać się nazwać tak:

var js_var; 
$.get("rest.php", function(data) { 
     js_var=data; 
}); 

Ów najprostszy przykład mogę myśleć.

+0

+1 Pobieranie zmiennych z serwera najlepiej reprezentuje zgłoszenie serwisowe. – RustyTheBoyRobot

3

Moim zdaniem, jeśli chcesz przekazać zmienną bezpośrednio w swoim JS, prawdopodobnie twoja aplikacja internetowa nie jest dobrze zaprojektowana.

Tak, mam dwie wskazówki: pliki * Wykorzystanie JSON dla ogólnych konfiguracjach, jak /js/conf/userprefs.json

{ 
    "avatar": "/img/users/123/avatar.jpg", 
    "preferred_color": "blue" 
    // ... 
} 
  • lub (lepiej) można odzyskać confs json z wywołania AJAX.

W przypadku frameworków PHP, takich jak Symfony2, można wybrać format w konfiguracji routingu, pozostawiając wynik zmiennej w silniku szablonów (np. Twig).

zrobić przykład dla użytkowników Symfony2 ale może to zostać wykorzystane przez każdego programisty:

routing.yml

userprefs: 
    pattern: /js/confs/userprefs.{_format} 
    defaults: { _controller: CoreBundle:JsonPrefs:User, _format: json } 
    requirements: 
     _format: json 
     _method: GET 

Wewnątrz kontrolera można zrobić wszystkie zapytania, które trzeba pobrać zmienne umieszczenie ich w widoku:

resources/views/JsonPrefs/User.json

{ 
    "avatar": "{{ user.avatar }}", 
    "preferred_color": "{{ user.preferred_color }}" 
    // ... 
} 

Wewnątrz JS teraz będziesz mógł odzyskać JSON za pomocą prostego wywołania AJAX. Dla celów wydajności możesz buforować JSONy (na przykład) za pomocą Varnish. W ten sposób serwer nie musi wykonywać kwerendy za każdym razem, gdy czytasz preferencje użytkownika.

0

Przynajmniej można użyć shortcode PHP, aby Twoje rozwiązanie „brzydki” czystsze bitowe:

var js-variable = "<?= $php-variable ?>"; 
+1

Nie jestem downvoter, ale shortcode ma problemy z przenośnością i dlatego należy unikać znajomego. – stefgosselin

+0

To nie jest brzydkie, gdy myślisz o PHP jako silniku szablonów, który również jest. Jednak gdyby mógł rozwiązać to z Ajaxem, byłoby lepiej, zgadzam się. – David