Время от времени мне приходится передавать некоторые переменные из PHP в JS-скрипт. Пока я сделал это так:
var js-variable = "<?php echo $php-variable; ?>";
Но это очень уродливо, и я не могу скрыть свой JS-скрипт в файле .js, потому что он должен быть проанализирован PHP. Какое лучшее решение для этого?
Если вы не хотите использовать PHP для генерации вашего javascript (и не обращайте внимания на дополнительный вызов на ваш веб-сервер), используйте AJAX для извлечения данных.
Если вы хотите использовать PHP, всегда кодируйте с json_encode перед выводом.
<script> var myvar = <?php echo json_encode($myVarValue); ?>; </script>
Пожалуйста, используйте rest / rpc api и передайте json в js. Это можно сделать следующим образом, если вы используете jquery:
rest.php
<?php echo "{name:biplav}" ?>
Затем из вашего js вызовите вызов:
var js_var; $.get("rest.php", function(data) { js_var=data; });
Это самый простой пример, о котором я могу думать.
<?php header('content-type:text/javascript;charset=utf-8'); printf('var foo = %s;', json_encode($foo, JSON_PRETTY_PRINT));
json_encode
обеспечивает действительный javascript. Заголовок сообщает браузеру, что он интерпретирует его как javascript.
то вы можете ссылаться на него как на файл:
<script src="script.php"></script>
В качестве альтернативы, может быть удобно встроить значение непосредственно в ваш html вместо отдельного HTTP-запроса. Сделайте это так:
<script> <?php printf('var foo = %s;', json_encode($foo, JSON_HEX_TAG | JSON_PRETTY_PRINT)) ?> </script>
Обязательно используйте JSON_HEX_TAG
если вы встраиваетесь в свой html, иначе вы рискуете атаками xss-инъекций. Также есть другие флаги, которые могут понадобиться для большей безопасности в зависимости от контекста, в котором вы его используете: JSON_HEX_AMP, JSON_HEX_QUOT, JSON_HEX_APOS
На мой взгляд, если вам нужно передать переменную прямо в свой JS, возможно, ваше веб-приложение не очень хорошо спроектировано.
Итак, у меня есть два совета: * Используйте JSON-файлы для общих конфигураций, например /js/conf/userprefs.json
{ "avatar": "/img/users/123/avatar.jpg", "preferred_color": "blue" // ... }
С фреймворками PHP, такими как Symfony2, вы можете выбрать формат в конфигурации маршрутизации, оставляя вывод переменной в движке шаблона (например, Twig).
Я делаю пример для пользователей Symfony2, но это может использовать любой программист:
routing.yml
userprefs: pattern: /js/confs/userprefs.{_format} defaults: { _controller: CoreBundle:JsonPrefs:User, _format: json } requirements: _format: json _method: GET
Внутри контроллера вы можете выполнять все запросы, необходимые для извлечения переменных, помещая их в представление:
Ресурсы / Views / JsonPrefs / User.json
{ "avatar": "{{ user.avatar }}", "preferred_color": "{{ user.preferred_color }}" // ... }
Внутри JS теперь вы сможете получить JSON с помощью простого вызова AJAX. Для достижения производительности вы можете кэшировать JSON (например) с помощью лака. Таким образом, ваш сервер не должен выполнять запрос каждый раз, когда вы читаете пользовательские настройки.
Если вы измените файл .htaccess, чтобы включить
AddType application/x-httpd-php .js
вы можете использовать файл .js, и он будет обрабатываться PHP, что составляет половину того, что вам нужно.
Что касается того, насколько уродливым является это решение, я бы сказал, что это наименее уродливый механизм. Вы можете попробовать передать весь JS-скрипт с помощью PHP-скрипта в виде строки и выполнить поиск и замену переменных, которые нужно вставить, но я думаю, что вы согласитесь, что это уродливое, чем решение, которое вы используете в настоящее время.
Поместите все ваши .js-файлы в папку и настройте ваш HTTP-сервер для перенаправления всего запроса на эти файлы в файл PHP, который загружает файлы и выводит их.
Предположим, что у вас есть Apache и ваши .js-файлы находятся в / js:
RewriteRule /js /getjs.php
getjs.php:
<?php header('Content-Type: text/javascript'); include_once($_SERVER['SCRIPT_NAME']); ?>
Чтобы избежать запуска .js-файлов с помощью парсера PHP, вы мало что можете сделать, за исключением того, что вы можете получить значение js-variable
через вызов AJAX.
Также вы можете рассмотреть вывод значения следующим образом:
var js_variable = <?php echo json_encode ($php_variable); ?>
чтобы избежать всего, что сломало бы ваш javascript.
По крайней мере, вы можете использовать короткий код PHP, чтобы сделать ваше «уродливое» решение немного чище:
var js-variable = "<?= $php-variable ?>";