it-swarm-korea.com

노드가 아닌 페이지에 주석을 추가하는 방법이 있습니까?

나는 모듈을 구축하고 노드가 아님 인 페이지에 주석 양식을 넣어야합니다. 이렇게하는 방법이 있습니까?

다음을 사용해야 할 것 같습니다.

drupal_get_form ( 'comment_form', array ( 'nid'=> $ node-> nid));

그러나 이것은 항상 노드에 연결된 것처럼 보이므로 nid에 특정 종속성이있는 것 같습니다.

3
WestieUK

API api.drupal.org 에서 볼 수있는 페이지를 처리하는 모듈에도 동일한 문제가 있습니다. 표시되는 문서 페이지는 노드가 아니지만 모듈에서 주석을 추가 할 수 있습니다.

문서 페이지에 대해 호출되는 페이지 콜백은 api_page_function () 이며, hook_menu() 구현에서 경로 api/%/%/function/%api_item에 연결됩니다 ( api_menu () , 링크 된 파일의 125 행에서 시작). 페이지 콜백은 다음 코드를 포함하는 _ api_add_comments () 를 사용합니다.

if (module_exists('comment') && user_access('access comments') && variable_get('comment_api', COMMENT_NODE_READ_WRITE) != COMMENT_NODE_DISABLED) {
  $output .= comment_render(node_load($documentation_object->did));
  if (user_access('post comments')) {
    $output .= comment_form_box(array('nid' => $documentation_object->did), t('Post new comment'));
  }
  // ...
}

API는 문서 페이지에 연결되는 빈 노드를 만듭니다. 그 이유는 Comment 모듈은 해당 노드와 관련된 주석을 반환하기 위해 여전히 노드 개체가 필요하기 때문입니다.

3
kiamlaluno

아니요. 데이터베이스에 "comments.nid"라는 필수 외부 필드가 있습니다. 주석은 노드가 아닌 것에 대해서는 수행하지 않습니다.

노드 ID없이 어떻게 든 주석을 저장하더라도 일이 끔찍하게 깨질 것입니다.

1
berkes

이것은 나를 위해 작동합니다.

if (module_exists('comment') && user_access('access comments') && variable_get('comment_api', COMMENT_NODE_READ_WRITE) != COMMENT_NODE_DISABLED) {
  $output .= comment_render(node_load($documentation_object->did));
  if (user_access('post comments')) {
    $output .= comment_form_box(array('nid' => $documentation_object->did), t('Post new comment'));
  }
  // ...
}

하지만 페이지를 재생해야하는 댓글을 저장하려고 할 때 ajax_comments 모듈을 사용합니다.

그러나 모든 태그와 ajax_comment.js 및 .css가로드되고 양식의 구조는 노드 페이지에 있습니다 (이에 대한 모든 솔루션).

1
Sami .GH

Reply 모듈을 시도하는 것이 좋습니다.

1
Bojan Zivanovic

노드가없는 페이지에 주석을 추가하는 것은 확실히 가능합니다. 다른 답변의 아이디어를 따라 노드가없는 페이지에 빈 노드를 연결합니다. 모든 기술적 세부 사항은 여기에 있습니다.

사용 사례 :

이전 웹 사이트를 Drupal)로 마이그레이션합니다. 7. http://www.example.com/oldpage.php?gid=와 같은 데이터베이스 테이블의 내용을 보여주는 이전 URL이 있습니다. xxxxx 여기서 xxxxx는 interger ID입니다. 외부 사이트에서 수천 개의 링크가 있기 때문에이 ID는 나에게 중요합니다. 나의 새로운 Drupal URL은 http : //www.example.com/newpage/xxxxx 웹 서버가 이전 URL을 새 URL로 다시 작성하도록 할 수 있습니다. 노드를 사용하면 더 이상 ID를 제어 할 수 없습니다.

이전 ID를 새 노드 ID에 매핑 :

'빈 노드'라는 새 노드 유형을 만듭니다. 이 작업은 관리자 인터페이스를 사용하거나 Drupal API를 사용하여 수행 할 수 있습니다. 다음으로 association_table이라는 데이터베이스 테이블을 다음과 같이 만듭니다.

+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+ 
| drupal_nid | int(11)     | NO   | PRI | NULL    |       |
| gid        | int(8)      | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+

이것은 내 이전 'gid'를 '빈 노드'의 관련 노드 ID에 매핑합니다. 사용자가 내 newpage URL을 방문하면 필요에 따라 빈 노드가 생성됩니다. 그 페이지 끝에 다음과 같은 내용이 있습니다.

$sql = "SELECT drupal_nid from {association_table} WHERE gid=". $gid; // $gid: my old ID
$results = db_query($sql);
if ($results->rowCount()==1) {  
  // already associated with an empty node
  $nid = $results->fetchField(0);
}
else {
  // call helper function to create a new empty node and return its node id
  $nid = mymodule_new_node($title);
  // create new entry in association_table
  $sql = "INSERT INTO {association_table} VALUES(". $nid. ", ". $gid. ")";
  db_query($query); // I keep things simple here, of course use Drupal way to insert.
} 

이제 도우미 기능 :

function mymodule_new_node($title) {
  $node = new stdClass();
  $node->type = 'empty_node'; 
  $node->title = $title;
  $node->uid = 1;  // created by admin user
  if (module_exists('comment')) {
    $node->comment = variable_get('comment_api', COMMENT_NODE_OPEN);
  }
  node_save($node);
  return $node->nid;
}

도우미 함수는 빈 노드를 만들고 제목을 적절한 것으로 설정하고 소유자를 관리자로 설정하고 노드 ID를 반환합니다. $ title 비트는 절대적으로 필요합니다. 제목은 'admin/content', 'admin/content/comment'및 검색 결과의 클릭 가능한 링크와 같이 Drupal의 여러 위치에 표시됩니다.

노드가없는 페이지에 주석 양식 추가 :

이것은 매우 쉽습니다. 내 '새 페이지'의 끝에서

if (module_exists('comment') && user_access('access comments') && variable_get
('comment_api', COMMENT_NODE_OPEN) != COMMENT_NODE_HIDDEN) {
  $comment_form = comment_node_page_additions(node_load($nid));
  $output .= drupal_render($comment_form);
}

이 양식을 사용하여 사용자는 기본 주석 테이블에 주석을 추가 할 수 있습니다.

리디렉션 처리 :

Drupal은 URL/node/?????를 사용하여 이러한 빈 노드를 참조합니다. (예 : '관리자/콘텐츠'의 링크). 사용자가 의견 양식을 제출하면/node/?????로 리디렉션됩니다./node/????? 리디렉션해야합니다. association_table의 매핑을 사용하여/newpage/xxxxx에. 이는 hook_node_view를 구현하여 수행됩니다.

function mymodule_node_view($node, $view_mode, $langcode) {
  if ($node->type == 'empty_node' && $view_mode == 'full' && arg(0) == 'node') {
    $sql = "SELECT gid FROM {association_table} WHERE nid=". $node->nid; 
    $gid = db_query($sql)->fetchField(0);
    drupal_goto('newpage/' . $gid);
  }
}

요약 :

이 절차는 내 Drupal 7 프로덕션 사이트에서 완벽하게 작동합니다.

몇 가지 추가 조정이 필요합니다. 예를 들어 빈 노드의 제목이 설정된 방식에 따라 검색 결과에 표시 될 수 있습니다. 이것은 바람직하지 않을 수 있습니다. 제 경우에는 hook_query_alter를 사용하여 이러한 빈 노드에서 검색이 수행되는 방식을 변경합니다.

0
macelee