Я создал интернет-сообщество в Drupal с домашней страницей, которая похожа на стену Facebook. Вы видите 25 последних сообщений с двумя последними комментариями ниже этих сообщений. Существует также текстовое поле прямо под этими комментариями, чтобы вы могли быстро опубликовать новый комментарий к определенному сообщению.
Эти сообщения в стиле Facebook имеют множество функций, встроенных в них через JavaScript. Нажав ссылку «просмотреть все комментарии» непосредственно под сообщением, вы получаете вызов AJAX, который захватывает все комментарии для этого сообщения и отображает их прямо под ним. Вы также можете отметить сообщения как полезные, как решение вашего вопроса, отредактировать встроенные комментарии и т. Д. Все эти действия требуют запросов AJAX, а это значит, что JavaScript, выполняющий запрос, должен знать важную информацию, такую как идентификатор узла (уникальный идентификатор идентификатор сообщения), идентификатор комментария (уникальный идентификатор комментария) и т. д.
В моей первоначальной реализации эти части важных данных посыпались по всем постам, что усложняло работу с JS, которая должна была найти его. Таким образом, моя вторая реализация просто выводит все эти данные в JSON-совместимую строку в главном элементе упаковки каждого сообщения. Хотя это значительно упростило JS для поиска необходимых данных, запись JSON в виде строки – это боль (ускользание кавычек, отсутствие разрывов строк).
Итак, теперь у меня есть третья идея, и я ищу отзывы об этом до ее реализации. Идея состоит в том, чтобы создать единый глобальный массив JS для всех этих сообщений, который содержит внутри него объекты, которые хранят данные для каждого сообщения. Каждый элемент в этом массиве будет содержать необходимые данные, необходимые для вызовов AJAX. Таким образом, это будет выглядеть примерно так:
Шаблон публикации в стиле Facebook
<div class="post" data-postindex="<?php echo $post->index; ?>"> <!-- lots of other HTML for the post --> </div> <script type="text/javascript"> globalPostArray.push({ nid: <?php echo $post->nid; ?>, authorID: <?php $post->authorID; ?>, //etc. etc. etc. }); </script>
Результатом вышеуказанного кода является то, что при нажатии ссылки, требующей запроса AJAX, JS просто пересекает DOM вверх от этой ссылки до тех пор, пока не найдет основной элемент .post
. Затем он захватит значение data-postindex
, чтобы узнать, какой элемент в globalPostArray
хранит globalPostArray
ему данные.
Мысли? Я чувствую, что должен быть какой-то стандартный, принятый способ сделать что-то подобное.
Я никогда не слышал о стандартном способе «передавать» информацию между PHP и Javascript, так как это серверный и клиентский языки, соответственно. Я лично использовал бы гибрид ваших вторых и третьих решений.
Храните идентификатор сообщения в атрибуте data-postindex (атрибуты данных являются новыми, а «правильный» способ хранить небольшие объемы данных). Но я все равно просто использовал бы массив JSON для остальных, так как хранение большого количества данных в атрибутах данных (и их экранирование!) Потенциально проблематично. PHP имеет функцию json_encode
которая позаботится обо всех экранах и для вас – просто создайте массив PHP (скажем, $postdata
), как обычно, и затем бросьте это в свой шаблон сообщения:
<script type="text/javascript"> globalPostArray.push(<?php echo json_encode($postdata) ?>); </script>
Где $postdata
выглядит примерно так:
$postdata = array( 'nid' => 5, 'authorId' => 45 ...etc... );
Достаточно легко создать такой массив из вашего существующего кода.
Я написал сообщение в блоге некоторое время назад о моей реализации такого рода вещей, но похоже, что все, что вам нужно, – это указатель на json_encode .
Самый надежный способ передать любую PHP-переменную JavaScript – json_encode
.
<script type="text/javascript"> var something = <?php echo json_encode($var); ?>; </script>
Вы не можете пройти закрытие и ресурсы, но в противном случае игра для игры будет проходить.
Я бы сохранил данные внутри элемента:
<div class="post" data-postindex="<?php echo $post->index; ?>" data-nid="<?php echo $post->nid; ?>" data-authorID="<?php echo $post->authorID; ?>">
… или сохраняя полную JSON-строку в 1 атрибуте данных:
<div data-data="<?php echo htmlentities(json_encode($somedata));?>">
Мой ответ примерно такой же, как и у других парней, но более подробно. Обычно я делаю это так, и я думаю, что это лучший подход: (конечно, вы можете захватить данные с помощью ajax, но зависит от контекста)
somefile.html
<html> <head>..</head> <body> html code <script> window.my_data = <?php echo json_encode($my_php_var); ?> </script> </body> </html>
somefile.js
$(function() { window.myitem = new myClass(window.my_data); }); var MyClass = function(init_data) {...}