it-swarm-es.com

¿Hay alguna forma de agregar comentarios a páginas que NO son nodos?

Estoy construyendo un módulo y necesito poner un formulario de comentarios en una página que es NO un nodo. ¿Hay alguna forma de hacer esto?

Supongo que necesitaré usar:

drupal_get_form ('forma_comentario', matriz ('nid' => $ nodo-> nid));

Sin embargo, esto parece tener cierta dependencia del nid, ya que siempre parece estar adjunto a un nodo.

3
WestieUK

API el módulo que maneja las páginas que ves en api.drupal.org , tiene el mismo problema; las páginas de documentación que ve no son nodos, pero el módulo permite agregarles comentarios.

La devolución de llamada de página invocada para las páginas de documentación es api_page_function () , que está asociada a la ruta api/%/%/function/%api_item En su implementación de hook_menu() (ver api_menu () , comenzando en la línea 125 del archivo vinculado). La devolución de llamada de la página usa _ api_add_comments () , que contiene el siguiente código:

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 crea nodos vacíos que se asocian a las páginas de documentación; la razón de esto es que el módulo de comentarios todavía necesita un objeto de nodo para devolver cualquier comentario que esté asociado con ese nodo.

3
kiamlaluno

No. Un comentario tiene un campo externo obligatorio en la base de datos: "comments.nid". Los comentarios no sirven para nada que no sea un nodo.

Incluso si de alguna manera logra almacenar comentarios sin una ID de nodo, las cosas se romperán de manera ruidosa.

1
berkes

Esto funciona para mi:

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'));
  }
  // ...
}

Pero trabajo con el módulo ajax_comments cuando intento guardar un comentario que tiene que reproducir páginas.

Pero todas las etiquetas y ajax_comment.js y .css se cargan y la estructura del formulario está con la página del nodo (cualquier solución para esto).

1
Sami .GH

Sugiero probar el módulo Responder .

1
Bojan Zivanovic

Definitivamente es posible agregar comentarios a páginas sin nodo. Sigo ideas en otras respuestas para adjuntar un nodo vacío a mi página sin nodo. Todos los detalles técnicos están aquí.

Caso de uso:

Migro un sitio web antiguo a Drupal 7. Tengo URL antiguas que muestran el contenido de una tabla de base de datos como http://www.example.com/oldpage.php?gid= xxxxx donde xxxxx es un ID de número entero. Estos ID son importantes para mí ya que hay miles de enlaces desde sitios externos a ellos. Mi nuevo Drupal URLs se parecen a http: //www.example.com/newpage/xxxxx Siempre puedo dejar que el servidor web reescriba las URL antiguas en las nuevas URL. Si uso el nodo, ya no tengo control sobre las ID.

Asignar ID antiguo a ID de nodo nuevo:

Creo un nuevo tipo de nodo llamado ' ¡nodo vacío'. Esto se puede hacer usando la interfaz de usuario de administrador o por Drupal API. A continuación, cree una tabla de base de datos llamada association_table así:

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

Esto asigna mi antiguo 'gid' al ID de nodo asociado de 'nodo vacío'. Se creará un nodo vacío según sea necesario cuando el usuario visite la URL de mi nueva página. Al final de esa página tengo algo como:

$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.
} 

Ahora la función de ayuda:

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;
}

La función auxiliar crea un nodo vacío, establece su título en algo apropiado, establece su propietario como usuario administrador y devuelve su ID de nodo. El bit $ title es absolutamente necesario. El título aparecerá en muchos lugares en Drupal, como 'admin/content', 'admin/content/comment' y los enlaces en los que se puede hacer clic en el resultado de búsqueda.

Agregar formulario de comentario a la página sin nodo:

Esto es bastante fácil de hacer. Al final de mi 'nueva página', haz

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);
}

Con este formulario, el usuario puede agregar comentarios a la tabla principal de comentarios.

Manejar redirección:

Drupal se referirá a estos nodos vacíos usando URL/node/????? (por ejemplo, enlaces en 'admin/content'). Cuando los usuarios envíen el formulario de comentarios, también serán redirigidos a/node/?????. Necesito redireccionar/node/????? a/newpage/xxxxx usando la asignación en la tabla_de_asociaciones. Esto se hace implementando 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);
  }
}

Resumen:

Este procedimiento funciona perfectamente para mí en mi sitio de producción Drupal 7.

Se requieren algunos ajustes adicionales. Por ejemplo, dependiendo de cómo se establezcan los títulos de los nodos vacíos, pueden aparecer en el resultado de la búsqueda. Esto puede no ser deseable. En mi caso, uso hook_query_alter para cambiar cómo se realiza la búsqueda en estos nodos vacíos.

0
macelee