2012-02-03 2 views
4

나는 Drupal에 페이스 북 벽과 같은 종류의 홈페이지로 온라인 커뮤니티를 만들었다. 가장 최근의 25 개의 게시물을 볼 수 있으며 그 중 가장 최근의 두 개의 댓글은 해당 게시물 아래에 있습니다. 또한 이러한 주석 바로 아래에 텍스트 영역이있어 특정 게시물에 대한 새 설명을 신속하게 게시 할 수 있습니다.필자의 특별한 경우에 PHP에서 JavaScript로 데이터를 전달하는 가장 좋은 방법

Facebook 스타일의 게시물에는 JavaScript를 통해 많은 기능이 내장되어 있습니다. 게시물 바로 아래에있는 "모든 댓글보기"링크를 클릭하면 해당 게시물에 대한 모든 댓글을 잡고 바로 아래에 표시하는 AJAX 전화가 생성됩니다. 또한 게시물을 유용한 정보로 표시하거나 질문에 대한 해결책으로 주석을 삽입하거나 주석을 편집 할 수 있습니다. 이러한 모든 작업에는 AJAX 요청이 필요합니다. 즉, 요청을 보내는 JavaScript는 노드 ID (고유 한 코멘트 ID (댓글의 고유 식별자) 등

초기 구현에서는 이러한 필수 데이터가 게시물 전체에 뿌려지기 때문에 필요한 JS를 작성하는 것이 더 복잡해졌습니다. 그것. 따라서 두 번째 구현은이 모든 데이터를 각 게시물의 기본 줄 바꿈 요소에있는 JSON 호환 문자열로 출력합니다. 이로 인해 JS가 필요한 데이터를 훨씬 쉽게 찾을 수있게되었지만 JSON을 문자열로 쓰는 것은 고통 스럽습니다 (이스케이프하는 따옴표, 줄 바꿈 없음).

이제 제 3의 아이디어가 있습니다. 구현하기 전에 이에 대한 피드백을 찾고 있습니다. 아이디어는 각 게시물의 데이터를 보유하는 객체를 포함하는 모든 게시물에 대해 단일 글로벌 JS Array를 만드는 것입니다. 해당 배열의 각 요소는 AJAX 호출에 필요한 데이터를 보유합니다. 그래서 다음과 같이 보일 것입니다 :

페이스 북 스타일의 포스트 템플릿

<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 요소를 찾을 때까지 해당 링크에서 위쪽으로 이동합니다. 그런 다음 의 값을 가져 와서 globalPostArray의 어떤 요소가 필요한 데이터를 보유하고 있는지 알 수 있습니다.

생각하십니까? 나는 이와 같은 것을 성취 할 수있는 표준적이고 받아 들여진 방법이 있어야하는 것처럼 느껴집니다.

+2

왜 JSON 문자열로 통증이 있습니까? 'json_encode' 함수를 사용하지 않으시겠습니까? –

+0

아니, 나는 그것을 사용하지 않았다. 그리고 그것이 고통이었습니다. 분명히 나는 ​​바보 야. – maxedison

답변

6

PHP와 자바 스크립트간에 정보를 "전달"하는 표준 방법에 대해서는 전혀 들어 본 적이 없습니다. PHP와 자바 스크립트간에 정보를 전달하는 표준적인 방법은 각각 서버 측과 클라이언트 측 언어이므로 들어 본 적이 없습니다. 개인적으로 두 번째 및 세 번째 솔루션의 하이브리드를 사용할 것입니다.

post-id를 data-postindex 속성에 저장합니다 (데이터 속성은 새롭고 소량의 데이터를 저장하는 "올바른 방법"입니다). 하지만 나머지 JSON 배열은 데이터 속성에 많은 양의 데이터를 저장하고 이스케이프 처리하는 것이 잠재적으로 문제가 될 수 있습니다. PHP는 당신을 위해 모든 이스케이프의 관리 및 소요 json_encode 기능이있다 - 당신이 평소처럼 PHP 배열 (예를 들어, $postdata)를 구축 한 다음 게시물 템플릿이 던져 :

<script type="text/javascript"> 
    globalPostArray.push(<?php echo json_encode($postdata) ?>); 
</script> 

$postdata 다음과 같은 문자입니다 :

기존 코드에서 이러한 배열을 생성하기는 쉽습니다.

나는 이런 종류의 구현에 대해 blog post을 작성했지만, 필요한 것은 모두 json_encode의 포인터입니다.

<div class="post" data-postindex="<?php echo $post->index; ?>" 
        data-nid="<?php echo $post->nid; ?>" 
        data-authorID="<?php echo $post->authorID; ?>"> 

을 ... 또는 1 데이터 속성에 완전한 JSON 문자열을 저장 :

+0

json_encode. 이봐. 먼저 json_encode를 언급하는 것보다 조금 더 나아가는 것뿐만 아니라 게시를위한 답을 줄 것입니다. – maxedison

0

나는 요소 내에 데이터를 저장하는 것

<div data-data="<?php echo htmlentities(json_encode($somedata));?>"> 
+0

이것은 내 원래의 솔루션 이었지만 많은 양의 데이터로 다루기가 어려워졌습니다. – maxedison

+0

네가 직접 데이터 처리를 구현해야 할 때가 맞다. 그러나 예를 들어 build-in 데이터 메소드로 jQuery를 사용할 때 단점은 없지만 IMO는 데이터가 요소에 바인딩된다는 이점을 갖습니다. –

+0

많은 추가 코드가 필요합니다 (json_encode를 사용하여 JavaScript에 직접 전달하는 것과 반대). – maxedison

4

하나를 통과하는 가장 신뢰할 수있는 방법 자바 스크립트에 대한 PHP 변수는 json_encode입니다.

클로저와 리소스는 전달할 수 없지만 전달할 게임은 없습니다.

0

내 대답은 다른 사람들과 거의 같지만 자세한 내용입니다. 나는 보통 이런 식으로 작업을 수행하고 난 가장 좋은 방법이라고 생각 : (물론 당신이 아약스를 사용하여 데이터를 잡아 수 있지만, 상황에 따라 다름)

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) {...} 
관련 문제