[RISOLTO] output $node->body in full html

10 contenuti / 0 new
Ultimo contenuto
[RISOLTO] output $node->body in full html

Salve

in un modulo, via *.install creo un nodo e poi dal callback di menu ne carico il contenuto; e fin qui tutto ok.
il mio node però ha delle parti in html che vorrei mantenesse in fase di output. il codice che uso:

<?php
$node
= node_load(array('nid' => 2));
return
node_view($node);
 
?>

non appena esegue node_view, tutta la parte html viene piallata e reinterpretata, con la scomparsa di alcune porzioni, ad esempio. vorrei invece stampasse a video esattamente l'html così com'è, senza reinterpretazioni e piallature...
in che modo ci posso riuscire?

grazie

Il problema non sta nel codice che hai pubblicato. FYI puoi passare direttamente il nid a node_load:

<?php
 $node
= node_load(2);
return
node_view($node);
?>

Il valore tornato da node_view è il contenuto (in HTML) di node.tpl.php. In più avrai valori in $node->body e $node->links.
Io non capisco dove sta questo codice (in un *.tpl.php?), nè a chi viene restituito il risultato della chiamata a node_view - chi riceve il return?
A cosa riferisci con "tutta la parte html viene piallata e reinterpretata, con la scomparsa di alcune porzioni" parli della pagina finale?

Più imparo, più dubito.

Allora, attraverso hook_menu ho creato un menu la cui page callback è una funzione volendo semplicissima - nello specifico è più complessa ma qui riporto la parte di interesse -, indi, la situazione è la medesima:

<?php
function mymodule_menu_callback() {
$node = node_load(2);
return
node_view($node);
}
?>

Indi node_view in sostanza elabora il tpl di riferimento del node_type, in questo caso page.

Il problema di fondo è che il $node->body è valorizzato da una GMap, oltre che altri elementi HTML, ad esempio:
<iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.it/maps?f=q&amp;source=s_q&amp;hl=it&amp;geocode=&amp... /><small><a href="http://maps.google.it/maps?f=q&amp;source=embed&amp;hl=it&amp;geocode=&a... style="color:#0000FF;text-align:left">Visualizzazione ingrandita della mappa</a></small>

Fino al DB mi ritrovo correttamente il node memorizzato, ma in fase di output i link vengono interpretati e ad esempio l'iframe della GMap sparisce; io vorrei invece che $node->body restasse così com'è, senza filtro HTML applicato in fase di stampa a video.

Adesso applicherò i tuoi suggerimenti circa $node->body e $node->links, ma temo che, senza l'uso di node_view, potrei perdermi parte dell'HTML buono per creare poi la pagina finale senza errori e come si deve.

Se ci son dubbi su quant'ho scritto, basta chiedere.

Ok, il codice è a posto...

Felagund wrote:
...Il problema di fondo è che il $node->body è valorizzato da una GMap, oltre che altri elementi HTML, ad esempio:
<iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.it/maps?f=q&amp;source=s_q&amp;hl=it&amp;geocode=&amp... /><small><a href="http://maps.google.it/maps?f=q&amp;source=embed&amp;hl=it&amp;geocode=&a... style="color:#0000FF;text-align:left">Visualizzazione ingrandita della mappa</a></small>
Fino al DB mi ritrovo correttamente il node memorizzato, ma in fase di output i link vengono interpretati e ad esempio l'iframe della GMap sparisce; io vorrei invece che $node->body restasse così com'è, senza filtro HTML applicato in fase di stampa a video.

Ovviamente fra il DB ed il risultato stampato, il contenuto passa attraverso gli filtri (http://api.drupal.org/api/function/check_markup/6) - se non usi Full HTML, è facile che un <iframe> viene eliminato...

Felagund wrote:
Adesso applicherò i tuoi suggerimenti circa $node->body e $node->links, ma temo che, senza l'uso di node_view, potrei perdermi parte dell'HTML buono per creare poi la pagina finale senza errori e come si deve.

Non serve usare questi campi - era solo a titolo informativo...

Più imparo, più dubito.

il nodo lo creo via drupal_execute e ho tentato di assegnare il full html, però non ho capito in che modo la radio operi la scelta, nonostante abbia provato con dei var_dump su $form e $form_state durante un hook_form_alter...

indi la domanda finale è: in che modo governo i filtri in output? la cosa riguarda l'output, poiché in quel contesto potrei avere necessità di non filtrare il nodo, probabilmente in un'altra pagina si.
non so se rendo l'idea.

grazie, leggo la guida...

Ametto di non aver mai avuto la necessità di creare un nodo programmaticamente...
In più non capisco perchè hai fatto tutto ciò per un singolo nodo (quando potevi crearlo, incollare il testo, e creare un menù item), ma questo non mi riguardo - ogniuno hai i suoi motivi...
Leggendo http://dgtlmoon.com/saving_drupal_cck_node_drupalexecute_is_a_dog_use_no... spiega l'uso di node_save (che mi pare più ragionevole per creare nodi programmaticamente), ma più importante, dimostra il settaggio del formatto del filtro:

<?php
 $node
->filter = 1;
?>

Che valore è 1? Secondo me, viene dalla tabella filter_formats, quindi a te serve 2...

HTH

John

Più imparo, più dubito.

ok, grazie, funziona, e spiegherò meglio come.

possiamo governare il filtro sia in fase di creazione del nodo, sia in fase di output; entrambi i modi sono del tutto indipendenti: ho eseguito dei test creando due nodi identici utilizzando node_save, con l'unica differenza sul filtro utilizzato (1 o 2, filtered o full html).
se in fase di output non viene specificato il filtro da utilizzare, node_view utilizzerà il default del nodo, cioè quello indicato in fase di creazione; altrimenti applica il filtro passato poco prima del node_view.
in questo modo ho potuto visualizzare in full html un nodo precedentemente creato con filtered html.
i valori 1 e 2, come da te giustamente indicato, si rifanno alla tabella filter_formats.

qualche esempio:

<?php
// mymodule.install
function mymodule_install() {
 
$output = '<div style="text-align: center; margin-bottom: 30px;"><iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="<a href="http://maps.google.it/maps?f=q&amp;source=s_q&amp;hl=it&amp;geocode=&amp;q=colosseo+roma&amp;sll=41.442726,12.392578&amp;sspn=18.429204,46.538086&amp;ie=UTF8&amp;hq=&amp;hnear=Anfiteatro+Flavio,+Piazza+del+Colosseo,+00184+Roma,+Lazio&amp;t=h&amp;z=15&amp;ll=41.889257,12.49374&amp;output=embed"></iframe><br" rel="nofollow">http://maps.google.it/maps?f=q&amp;source=s_q&amp;hl=it&amp;geocode=&amp...</a> /><small><a href="<a href="http://maps.google.it/maps?f=q&amp;source=embed&amp;hl=it&amp;geocode=&amp;q=colosseo+roma&amp;sll=41.442726,12.392578&amp;sspn=18.429204,46.538086&amp;ie=UTF8&amp;hq=&amp;hnear=Anfiteatro+Flavio,+Piazza+del+Colosseo,+00184+Roma,+Lazio&amp;t=h&amp;z=15&amp;ll=41.889257,12.49374"" rel="nofollow">http://maps.google.it/maps?f=q&amp;source=embed&amp;hl=it&amp;geocode=&a...</a> style="color:#0000FF;text-align:left">Visualizzazione ingrandita della mappa</a></small></div>';
 
$nodes = array(
    array(
'type' => 'page', 'title' => 'GMap format 2', 'body' => $output, 'name' => 'admin', 'format' => 2) // nid 1
   
, array('type' => 'page', 'title' => 'GMap format default (0, preleverà il filtro di default in node_view)', 'body' => $output, 'name' => 'admin') // nid 2
 
);
  foreach (
$nodes as &$node) {
   
node_save($node);
  }
}
// mymodule.module
function mymodule_page_callback_1() {
   
drupal_set_title("Nodo 1, format 2: visualizzerà il nodo 1 in full html");
   
$node = node_load(1);
    return
node_view($node);
}
function
mymodule_page_callback_2() {
   
drupal_set_title("Nodo 1, format 1: visualizzerà il nodo 1 in filtered html");
   
$node = node_load(1);
   
$node->format = 1; // format cambiato
   
return node_view($node);
}
function
mymodule_page_callback_3() {
   
drupal_set_title("Nodo 2, format 0: visualizzerà il nodo 2 in default filter, solitamente filtered html");
   
$node = node_load(1);
    return
node_view($node);
}
function
mymodule_page_callback_4() {
   
drupal_set_title("Nodo 2, format 2: visualizzerà il nodo 2 in full html");
   
$node = node_load(1);
   
$node->format = 2; // format cambiato
   
return node_view($node);
}
 
?>

esplico il perché del casotto per un nodo, per chi fosse interessato.
il mio problema ricorrente su drupal è il seguente: quando sviluppo qualcosa, solitamente lo faccio per gente che magari non è tenuta conoscere cms, contenuti, etc.
inoltre l'esperienza mi insegna che fare tutto lato pagina web è un'arma a doppio taglio: magari avrei già risolto questo problema, ma sistematicamente dovrei tenere traccia di pezzi di db che mi implementino poi questo nodo...
lato codice invece, visto che drupal mi permette di creare moduli con installer, posso implementare le configurazioni, i nodi, i menu etc e stare tranquillo che, in caso di utonto e totale distruzione del sito - più di una volta mi chiedevano di resettare l'intero sito o porzioni allo stato originale di consegna -, è sufficiente agire via moduli, e fanno tutto loro, sempre.
non creo mai un nodo ad hoc per un progettino, ma cerco di renderlo portabile, non si sa mai mi serva anche in altri contesti.

i nodi sono circa 50 più altri 200 da inserire in una lista. sono tutti un po' diversi, chi necessita di link, chi sta sotto un termine taxonomy, chi invece ha una GMap da visualizzare.

anche io solitamente utilizzo queste funzioni un po' più dirette (node_save, node_load, etc), evitando più possibile il casotto di drupal_execute, lasciato come ultima carta per risolvere un eventuale problema.

Grazie per le delucidazioni - molto più utile di un semplice "Ok funge". Credo che volevi dire

<?php
 $node
= node_load(2);
?>
e non user_load negli esempi. (Mi immaginavo anche che dovevi creare n nodi, dove n > 1 ;-)
Concordo con le tue osservazioni - la prima cosa che faccio e creare un modulo con nome del sito. Prima o poi mi tocca riempirlo di codice - di solito prima...
Ultima richiesta: metti un bel [Risolto] nel titolo?

Più imparo, più dubito.

jhl.verona wrote:
Grazie per le delucidazioni - molto più utile di un semplice "Ok funge". Credo che volevi dire
<?php
 $node
= node_load(2);
?>
e non user_load negli esempi. (Mi immaginavo anche che dovevi creare n nodi, dove n > 1 ;-)
Concordo con le tue osservazioni - la prima cosa che faccio e creare un modulo con nome del sito. Prima o poi mi tocca riempirlo di codice - di solito prima...
Ultima richiesta: metti un bel [Risolto] nel titolo?

sisi infatti ho corretto gli esempi inserendo node_load, che poi prende il nid o un array di parametri da matchare :D
inserito anche il [Risolto]!

ah aggiunto una precisazione, anziché utilizzare node_view che tra l'altro mi metteva il doppio link con il title cliccabile nonostante passassi credo i valori giusti, ho preferito utilizzare il callback indicato in node/%, cioè node_show: adesso visualizza il nodo come se digitassi node/% :D