2012-06-04 18 views
23

De vez en cuando tengo que pasar algunas variables de PHP a script JS. Por ahora lo hice así:Manera eficiente de pasar variables de PHP a JavaScript

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

pero esto es muy feo y no puedo ocultar mi script JS en el archivo .js, ya que tiene que ser interpretado por PHP. ¿Cuál es la mejor solución para manejar esto?

+1

espero que esto es sólo un ejemplo, 'js-variable' var generarían una sintaxis error, así como '$ php-variable' ... – MaxArt

+0

Tenga cuidado con las comillas dobles dentro de la variable php. – Jeroen

Respuesta

35

Si no desea utilizar PHP para generar su javascript (y no le moleste la llamada adicional) a su servidor web), use AJAX para buscar los datos.

Si desea utilizar PHP, siempre codifique con json_encode antes de realizar la salida.

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

+1 json es la mejor manera de utilizar datos de un script PHP, ya sea a través de ajax o al mismo tiempo que se compila la página. – Joseph

+7

ADVERTENCIA: Esto puede matar tu sitio web. Ejemplo: ''; ?> '. Ver [esta pregunta] (http://stackoverflow.com/q/20942452/1402846) para más detalles. Solución: utilice ['JSON_HEX_TAG'] (http://www.php.net/manual/en/json.constants.php#constant.json-hex-tag) para escapar' <' and '> '(requiere PHP 5.3.0). – Pang

+0

Otro inconveniente de esto es que afecta el tiempo de carga inicial de la página. – biplav

2

Si modifica el archivo .htaccess para incluir

AddType application/x-httpd-php .js 

puede utilizar un archivo .js y que estará a cargo de PHP, que es la mitad de lo que necesita.

En términos de qué tan fea es esa solución, diría que este es el mecanismo menos feo. Podría tratar de pasar todo su script JS a través de un script PHP como una cadena y hacer una búsqueda y reemplazar las variables que necesita insertar, pero creo que estará de acuerdo en que esto es más feo que la solución que está utilizando actualmente.

1

En cuanto a evitar la ejecución de archivos .js a través del analizador de PHP, es poco lo que puede hacer, excepto tal vez recuperar el valor de js-variable a través de una llamada AJAX.

También puede considerar outputing el valor de esta manera:

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

de escapar de todas las cosas que romperían su javascript.

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

json_encode garantiza javascript válido. El encabezado le dice al navegador que lo interprete como javascript.

entonces se puede enlazar con él como un archivo:

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

Alternativamente, puede ser conveniente para incrustar el valor directamente en el html en lugar de hacer una petición HTTP independiente. Hágalo así:

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

Asegúrese de utilizar JSON_HEX_TAG si incrustar en tu html, de lo contrario se corre el riesgo XSS ataques de inyección. También hay otros indicadores que puede necesitar para mayor seguridad, según el contexto en el que lo utilice: JSON_HEX_AMP, JSON_HEX_QUOT, JSON_HEX_APOS

2

poner todo su Js archivos en una carpeta y configurar el servidor HTTP para redirigir todas las peticiones a esos archivos a un archivo PHP que carga los archivos y les da salida.

Supongamos que tiene Apache y sus archivos .js están en/js:

RewriteRule /js /getjs.php 

getjs.php:

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

Utilice un descanso/RPC API JSON y pasar a sus js. Esto se puede hacer de la siguiente manera si está utilizando jQuery:

rest.php

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

luego desde sus js hacer una Lo llaman así:

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

Esa es la más simple ejemplo en el que puedo pensar

+0

+1 La recuperación de variables del servidor se representa mejor con una llamada de servicio. – RustyTheBoyRobot

3

En mi opinión, si necesita pasar una variable directamente en su JS, probablemente su aplicación web no esté bien diseñada.

lo tanto, tengo dos consejos: archivos * Uso de JSON para las configuraciones generales, como /js/conf/userprefs.json

{ 
    "avatar": "/img/users/123/avatar.jpg", 
    "preferred_color": "blue" 
    // ... 
} 
  • o (mejor manera) puede recuperar sus confs JSON con una llamada AJAX.

Con frameworks PHP como Symfony2, puede decidir un formato en su configuración de enrutamiento dejando la salida de una variable al motor de plantilla (como Twig).

hago un ejemplo para los usuarios de Symfony2 pero esto puede ser utilizado por cualquier programador:

routing.yml

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

dentro del controlador que puede hacer todas las consultas que se necesita para recuperar sus variables ponerlos en la vista:

Resources/views/JsonPrefs/User.json

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

Dentro de su JS ahora podrá recuperar el JSON con una simple llamada AJAX. Por motivos de rendimiento, puede almacenar en caché los JSON (por ejemplo) con Varnish. De esta forma, su servidor no necesita hacer una consulta cada vez que lea las preferencias del usuario.

0

Por lo menos, se puede utilizar un código corto PHP para hacer que su solución "feo" un poco más limpia:

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

No soy el que menosprecia, pero el código corto tiene problemas de portabilidad y, por lo tanto, debe evitarse amigo. – stefgosselin

+0

Esto no es feo cuando piensas en PHP como el motor de plantilla que también es. Sin embargo, si pudiera resolverlo con Ajax, sería mejor, estoy de acuerdo. – David

Cuestiones relacionadas