Лучший способ передать данные с PHP на JavaScript для моего конкретного случая

Я создал интернет-сообщество в 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) {...}