EntityFieldQuery caricare nodi con commenti e paginatore
Ciao a tutti,
ho bisogno di creare una pagina, da un mio modulo, che visualizzi i nodi, con i relativi commenti, di uno specifico content type e visualizzarli con il paginatore.
ora sono riuscito a far visualizzare i nodi con il paginatore:
<code>
$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'supporto')
->propertyCondition('status', 1)
->pager(2)
->addMetaData('account', user_load(1));
$result = $query->execute();
$nodes = node_load_multiple(array_keys($result['node']));
$content = node_view_multiple($nodes, 'full');
$output = array(
'content'=> $content,
'pager'=> array(
'#markup'=> theme('pager'),
'#weight'=>10
));
return drupal_render($output);
</code>
Quello che no riesco a fare è caricare i commenti relativi a ciascun nodo e visualizzarli contestualmente ai nodi.
separatamente sono riuscito a caricare i commenti di un singolo nodo con il seguente codice
<code>
$n=node_load('20158');
$c=comment_get_thread($n, 'COMMENT_MODE_FLAT', '1000');
$cc=comment_load_multiple($c);
$ccc=comment_view_multiple($cc,$n);
print drupal_render($ccc);
</code>
ma io ho bisogno che i commenti vengano visualizzati insieme al nodo.
qualche suggerimento?
grazie
Risposte
Ciao, il codice responsabile
Ciao, il codice responsabile al rendering dei commenti è presente in:
https://api.drupal.org/api/drupal/modules!comment!comment.module/function/comment_node_view/7
che è invocato da node_view().
Nota però queste righe di codice:
<?php
// Only append comments when we are building a node on its own node detail
// page. We compare $node and $page_node to ensure that comments are not
// appended to other nodes shown on the page, for example a node_reference
// displayed in 'full' view mode within another node.
if ($node->comment && $view_mode == 'full' && node_is_page($node) && empty($node->in_preview)) {
$node->content ['comments'] = comment_node_page_additions($node);
}
?>
in pratica la condizione non è mai vera se non ti trovi nella pagina del nodo.
Potresti provare ad introdurre un ciclo che per ogni nodo caricato con node_load_multiple esegue la funzione comment_node_page_additions (https://api.drupal.org/api/drupal/modules!comment!comment.module/function/comment_node_page_additions/7).
Probabilmente se vuoi personalizzare ulteriormente il rendering dei commenti devi andare a guardare meglio cosa fa questa funzione e magari estrapolarne solo una parte.
Spero ti sia utile!
Ciao e grazie per l'aiuto. ho
Ciao e grazie per l'aiuto.
ho provato modificando il codice come mi hai suggerito:
<code>
$nodi=array();
foreach ($nodes as $node){
$add['comments']=comment_node_page_additions($node);
$full=(object) array_merge((array) $node, (array) $add);
$nodi[$node->nid]=$full;
}
$content = node_view_multiple($nodi, 'full');
</code>
facendo un print dell'array sembra che i commenti ci siano ma poi non me li stampa.
non so come uscirne...
secondo te sbaglio approccio. hai capito cosa voglio fare? c'è un altro modo per farlo?
grazie ciao
Proverei, facendo riferimento
Proverei, facendo riferimento al primo codice qualcosa del genere:
<?php
...
$content = node_view_multiple($nodes, 'full');
foreach($nodes as $nid => $node) {
$content['nodes'][$nid]['comments'] = comment_node_page_additions($node);
}
$output = array(
...
?>
o, facendo riferimento al secondo:
<?php
$n=node_load('20158');
$c=comment_get_thread($n, 'COMMENT_MODE_FLAT', '1000');
$cc=comment_load_multiple($c);
$ccc['comments']=comment_view_multiple($cc,$n);
$ccc['#theme'] = 'comment_wrapper__node_' . $n->type;
$ccc['#node'] = $n;
$view = node_view($n, 'full');
$view['comments'] = $ccc;
print drupal_render($view);
?>
vedi se funziona.
In alternativa, se non hai la stretta necessità di utilizzare codice, potresti usare il modulo Views.