Allegato | Dimensione |
---|---|
![]() | 22.63 KB |
Salve,
Vorrei costruire una lista (un menu) le cui voci, in output, mostrino un'icona, la voce di menù, un'eventuale descrizione e il contenitore della voce di menù.
Ho creato un nuovo tipo di contenuto e aggiunto le tre voci che fanno il mio menu. In page.tpl ho l'html pronto per incorporare le variabili php che dovranno stampare l'icona, la voce di menù, la descrizione e la classe css che formatta il box della voce di menu.
Come faccio? Dove trovo queste variabili? Esiste un modulo che fa tutto ciò?
Alla fine vorrei ottenere una lista verticale di tre "banner", come in figura1.jpg allegata.
Grazie per l'aiuto.
R.
L'immagine aiuta, grazie...
Okay...
Okay - ma il template da modificare è node.tpl.php, non page.tpl.php. Anzi, dato che hai creato un tipo di contenuto a posto, meglio node-tipo-di-contenuto.tpl.php
Per creare una lista di nodi da visualizzare in un blocco, views è il tuo amico... Vedi questo esempio: http://drupaleasy.com/blogs/ryanprice/2008/06/using-views-2-drupal-6-cre...
P.S. Non rispondo più a richieste email - ne ricevo parecchie ormai - perchè l'intelligenza di questa communità è (è sarà sempre) ben superiore alla mia...
Più imparo, più dubito.
Va benissimo così, figurati.
Però non mi è chiaro tutto. Progetto e sviluppo siti da anni, ma Drupal è un ambiente nuovo, anche a livello concettuale, e questo è il mio primo sito. A mio carico ho anche che non ho mai usato un CMS pronto, ne ho creati tanti da zero, ma al solo scopo di gestire contenuti pensati e strutturati a monte. Questo per fare il quadro e trovare una qualche scusa alla mia lentezza...
L'utilizzo di View è alternativo alla creazione di node-tipo-di-contenuto.tpl.php?
O devo sempre creare una pagina di questo tipo quando ho un tipo di contenuto con una sua formattazione?
Poi, come lo collego a page.tpl.php? Voglio dire: al posto del codice che ho messo in page.tpl.php per fare uscire questo tipo di contenuto, cosa devo mettere?
Grazie.
R.
Nessun problema...
Idem - solo che sono forse 9 mesi avanti per quanto riguarda Big D. Mamma mia quanto tempo...
Views è un modulo contribuito che costruisce query - quindi produce liste di oggetti (nodi, utenti, ecc). Sia lui che CCK sono considerati 'essenziale' per un qualunque sito Drupal. Con il tuo background, se sai l'inglese ti consiglio "Pro Drupal Developer"
Il node.tpl.php fa parte del sistema templating di Big D, è si occupa di 'presentare' l'informazione di un nodo. In una pagina di nodo (node/xxx) questo (di solito) viene chiamato una volta, ma in una view, che magari visualizza n nodi, verrà chiamato n volte.
Il collegamento funziona 'alla rovescia' o in realtà a cascata. Drupal 'scende' ogni elemento di dati, fino ad un livello atomico, dove viene convertito in HTML. Quindi in page.tpl.php, il node.tpl.php ha già convertito in HTML il contenuto, in fatti in page.tpl.php c'è un variable chiamato $content - immagino che hai indovinato cosa contiene...
Più imparo, più dubito.
Scusa se sono tardo. Provo a ricapitolare fin dove mi pare di aver capito. Perché i miei dubbi partono addirittura dal flusso di lavoro, quindi cosa fare prima e cosa dopo.
Direi che per prima cosa devo spostare il codice html che mi darebbe l'output in pag.tpl e metterlo in node.tpl. Primo problema: i marcaposto. Ciò che ora è testuale dovrà essere sostituito dalle variabili php. $content mi tira fuori tutto insieme, mi dà il nodo, ma io avrei bisogno di alcuni elementi del nodo, enne variabili per enne informazioni. Sbaglio? Per esempio: come faccio a fare uscire la mia icona? Che variabile mi serve?
Poi, sempre se ho capito qualcosa, dovrei crearmi il mio tipo di contenuto usando views, giusto? E, altra domanda, aggiungere i tre record sempre usando views? Quello che ho fatto finora, creando il nuovo tipo di contenuto e aggiungendo i record non serve, dico bene? Va rifatto, giusto?
Il resto lo fa il sistema?
In attesa dell'oracolo, continuo a studiare, sperando di riscriverti per dirti che ho capito e grazie lo stesso. Ma dubito, John. E, se fra nove mesi ne so quanto te, divento credente!
R.
Stai facendo domande molto intelligente, spero che le mie risposte siano all'altezza...
E' un ottimo punto di partenza. Parliamo del nodo (escludo il discorso di pagina, blocchi, menù e quant'altro per semplificare).
Il flusso di lavoro è:
Quindi 'modello dati', 'dati', 'logica di business' e infine 'temizzazione'.
Bravo - e la risposta è: quelli necessario! Drupal carica il nodo compresso campi aggiunti quale CCK ecc. Poi chiama un preprocessore: template_preprocess_node che costruisce una serie di variabili che poi il template stamperà.
Anche noi possiamo aggiungere variabili, creando un funzione xxx_preprocess_node o in un nostro modulo, o nel file template.php della nostra tema.
Qui mi fermo, perchè hai da studiare un pò. Comunque se installi Devel puoi usare dsm() per analizzare tutti questi dati...
No. Views costruisce query, e visualizza liste di cose, tipo nodi, utenti, ecc. Se costruisci tre nodi del tipo di contenuto che hai creato, la view produrrà la lista - e basta. Tre nodi, non tre record. Nel vocabolario di Drupal è raro parlare di record.
Se per record intendi campi CCK, no - hai fatto la cosa giusta e corretto. Un nodo da se ha poche cose, titolo, corpo, ecc. Per aggiungere campi quale tuo icone, ecc, bisogna usare CCK (citato prima #3) Questo è il modello di dati.
Dubitare è intelligente - senza non c'è progresso...
Più imparo, più dubito.
[ post spostato su suggerimento di jhl.verona (vedi sotto)]
come avere maggior controllo sull'output xhtml generato da views
Ciao ego2012 e benvenuto nel club.
Stai dirottando il thread - non so più a chi rispondere. Apri un nuovo thread per favore - se sei loggato vai qui: http://www.drupalitalia.org/node/add/forum
Più imparo, più dubito.
Dunque, ho creato il mio tipo di contenuto, aggiungendo i campi che mi servono, ho aggiunto i record e ho creato una vista (un blocco) che vedo in home con una sua formattazione che poi non è altro che l'output di tutti i $field->content, uno di seguito all'altro. Ora ho esigenza di personalizzarla, perché diventi come nella figura allegata al primo post. In Views, c'è una voce (temizzazione) che mi mostra codice che, copiato in views-view-fields.tpl.php e opportunamente modificato, dovrebbe ignorare il codice di default e offrire una altro output. Per fare ciò, però, ho bisogno di ignorare $field->content e usare altro. Ma cosa?
In pratica il mio ciclo manda in output dodici campi (4 x 3 nodi) che devo riorganizzare perché si prendano le rispettive classi. Ma come?
R.
Non è necessario usare views per temizzare...
Bene, questo è già qualcosa. Presumo che stai usando Stile riga: Nodo
Se tutto è come ho descritto sopra, è sufficiente usare il template node.tpl.php.
Prima prendi una copia di questo file nella tua tema e chiamarlo node-tipo-di-contenuto.tpl.php, dove tipo-di-contenuto è il nome macchina del tuo tipo di contenuto.
Adesso puoi temezzare come preferisci al interno di questo template. Se hai Devel installato ed abilitato, nel template puoi scrivere
per vedere tutti gli elementi del nodo, compreso i tuoi campi CCK, altrimenti usi
Più imparo, più dubito.
Vediamo se ho capito. Tu dici: hai creato un tipo di contenuto (nodo) che hai chiamato banner e una sua vista (blocco) che hai chiamato banner. Ora fermati, Views non ti serve più. Crea la pagina node-banner.tpl che è la pagina propria dei nodi e buttaci dentro il codice html che prima, erroneamente, avevi messo in page.tpl.php. Aggiungi
<?php
print('<pre>'); print(check_plain(print_r($node, TRUE))); print('</pre>');
?>
per avere l'output degli elementi del nodo e scegliere quelli che sostituiranno il codice statico della tua lista.
Ho capito giusto? Perché se fosse così, sarebbe incredibilmente logico e comprensibile, solo che non funziona. O forse sbaglio qualcosa. O forse non ho capito niente...
Piano, piano, vinceremo...
Un passo indietro. Con la vista per blocchi, del tipo Stile riga: Nodo ti sta visualizzando qualcosa. Giusto?
Presumo di si. Questo vuol dire che sta usando il template node.tpl.php per ogni nodo che appare nel blocco (tre in questo caso).
Hai creato un template (non una pagina) apposto per il tuo tipo di contenuto che si chiama node.banner.tpl.php, e che contiene (per ora) lo stesso codice di node.tpl.php - giusto? (Puoi copiarlo da qui: http://api.drupal.org/api/drupal/modules--node--node.tpl.php/6/source)
Questo file si trova nella tema che tu hai abilitato per il tuo sito - giusto?
Se hai fatto questi passi, il blocco sarà uguale come prima. Per essere sicuri che sta usando il template giusto, basta aggiungere un pò di testo, per esempio, metti:
<p>Funziona?</p>
dopo il
<?php if (!$page): ?>
<h2><a href="<?php print $node_url ?>" title="<?php print $title ?>"><?php print $title ?></a></h2>
<?php endif; ?>
E' esattamente così. Non so cos'è che non va, ma lo scopriremo. Oltre a Devel (già citato sopra) un altro tool di sviluppo fatto apposto per chi devi smanettare la propria tema e Theme Developer. Richiede la presenza di Devel, ma un pò come Firebug, se clicci su un blocco della pagina, ti dice quale template è stato usato, ed anche quale altri template potrebberano essere usati...
Più imparo, più dubito.
Dunque, torno un attimo indietro per una sintesi di quanto fatto.
Ho creato il tipo di contenuto (banner) e una sua vista (un blocco che ho chiamato banner).
Sono andato in blocchi e ho configurato il mio nuovo blocco nella sidebar.
A questo punto, nella mia home ho il blocco, con il suo format ma nel posto giusto. (fig1)
Non ho ancora creato né node.tpl.php, né node.banner.tpl.php.
Li creo, cominciando da node.tpl.php, in cui aggiungo un testo di verifica (Ciao, sono node.tpl.php. Aggiorno il tema e vado a vedermi la mia home. Tutto ok, più o meno. Vedo sempre il mio blocco dove deve essere, e il testo aggiunto, anche se non nella sidebar, c'è. (fig2)
Duplico node.tpl.php e rinomino il duplicato in node.banner.tpl.php. Aggiungo un testo di verifica (Ciao, sono node.banner.tpl.php). Aggiorno il tema e ... Niente. continuo a vedere il mio blocco nella sidebar, ma il testo aggiunto è sempre quello di node.tpl.php. Se lo cancello, sparisce, tutto qui, senza che node.banner.tpl.php venga minimamente considerato.
Che faccio?
Grazie per le foto - aiutano molto.
Stai usando campi nel view, non Stile: Nodo. Puoi probabilmente arrivare a quello che ti interessa semplicemente:
Se questo non da tutti i risultati che desideri, poi intervenire tramite CSS. Infine se ancora non sei soddisfatto bisogna modificare i template di views (perchè stai usando quelli avendo selezionato Stile: unformattato, o almeno non avendo selezionato Stile: Nodo)
In fig 2, avrebbe dovuto scrivere "Ciao, sono node.tpl.php" anche nei tre nodi del blocco - ma questo non succede come spiegato sopra.
Non vedi "Ciao, sono node.banner.tpl.php" perchè il file si chiama
node-banner.tpl.php
(trattini non punto)Più imparo, più dubito.
Vediamo se mi riesce di capire qualcosa:
Sì. Mi sebrava corretto perché perché ogni singolo campo ha proprie caratteristiche di layout (una classe per ogni campo). Il codice html che avevo messo erroneamente in page.tpl.php era
<ul id="menu-sidebar-rounded">
<li id="prossime-date"><a href="#" class="labelcat"><img src="<?php print $my_theme_folder?>/img/ico_prossime_date_alpha.png" alt="Prossime date" />Prossime date</a><span class="end"></span></li>
<li id="stavo-pensando-che"><a href="#" class="labelcat"><img src="<?php print $my_theme_folder?>/img/ico_stavo_pensando_alpha.png" alt="Stavo pensando che" />Stavo pensando...</a><span class="end"></span></li>
<li id="condividi-in-facebook"><a href="#" class="labelcat"><img src="<?php print $my_theme_folder?>/img/ico_facebook_bg_blu_alpha.png" alt="Condividi in Facebook" />Condividi in Facebook</a><span class="menu-sidebar-desc">Fai il login col tuo account di Facebook e condividi con i tuoi amici i contenuti del sito!</span><span class="end"></span></li>
</ul>
Per cui mi è sembrato corretto continuare a lavorare sui campi. Si può fare anche con Nodo? Conviene?
Ho visto che nelle caratteristiche di ogni campo ho anche la possibilità di definire una classe. Significa che se scrivo pluto e nei miei css vado a definire una .pluto, il mio campo è bello e formattato?
Non lo vedo comunque. Prima era così. Ho rinominato la pagina perché in un tuo precedente post avevi scritto node.banner.tpl.php e allora ho provato anche così, ma non funge comunque.
Sento che ci siamo quasi. Spero solo che tu non ti spazientisca neanche un attimo prima!
E si, la luce c'è in fondo alla galleria, spero che non sia un treno...
Oh si, va benissimo usare campi nel view. Ci sono tanti modi di spellare un gatto. Restiamo con questo.
Probabilmente non hai bisogno di aggiungere altri classi. Il blocco ha già uno, il nodo pura, ogni campi idem. Credo che saranno sufficiente, n'est pas?
Oops. Hai ragione. Cerco un pò di cenere da spargere sul capo... Allora node-banner.tpl.php è corretto, ma non lo vedi perchè:
Più imparo, più dubito.
Mi sto perdendo.
Ora ho l'output dei miei tre gruppi di informazioni (l'icona, il titolo, e il corpo).
In fig3 ho, sopra, i banner così come dovrebbero essere - e come sono nel mio html - alla fine di questo delirio; sotto, l'output della vista così come è ora.
Dove devo mettere le mani perché sotto sia come sopra?
In Views ho un'area (Tema: Informazioni) in cui, in Output dello stile di riga, ho il codice con cui popolare views-view-fields.tpl.php.
L'ho fatto e ho visto che, modificando questo file, agisco sull'output della vista.
Il ciclo foreach mi butta fuori tanti campi quanti ce ne sono, ciascuno con la propria classe, ma dove viene valorizzata questa classe? C'è una qualche impostazione dei campi in cui devo indicare la classe?
Poi io ho bisogno di raccoglierli dentro tre banner (che nel mio caso erano tre
Mi sembra di essere tornato al punto di partenza!
L'immagine aiuta, ma adesso bisogna vedere un pò di HTML. Per la maggiore possiamo sistemare con CSS, non con altri template. Scusa, credevo che avevi creato tu il CSS per fig 1. Forse mi sbagliavo...
Bisogna mappare gli elementi e classi a quelli del tuo codice HTML (basta aggiungere i varie selectors al CSS originale).
Altrimenti, cambi lo Stile della vista in Stile riga: Nodo, e procedi manipolando node-banner.tpl.php con l'HTML e classi che vuoi tu.
P.S. questo sei tu? http://robertofrau.it/
Più imparo, più dubito.
Partiamo dalla fine:
Mi sa che quella luce in fondo alla galleria è proprio un treno...
Sono arrivato ad avere un output pulito (icona, titolo e, nel bottone facebook, il corpo.
Se ho capito bene, questo output è in views-views-field.tpl.php. Ogni campo della mia vista viene mandato in output da
<<?php print $field->element_type; ?> class="field-content"><?php print $field->content; ?></<?php print $field->element_type; ?>>
</<?php print $field->inline_html;?>>
In pratica $field-content stampa tutto. E tra le variabili disponibili non mi pare ci sia qualcosa che mi stampi gli elementi dell'array esploso.
Il codice html che genera invece l'output come lo vorrei io è
<ul id="menu-sidebar-rounded">
<li id="prossime-date"><a href="#" class="labelcat"><img src="<?php print $my_theme_folder?>/img/ico_prossime_date_alpha.png" alt="Prossime date" />Prossime date</a><span class="end"></span></li>
<li id="stavo-pensando-che"><a href="#" class="labelcat"><img src="<?php print $my_theme_folder?>/img/ico_stavo_pensando_alpha.png" alt="Stavo pensando che" />Stavo pensando...</a><span class="end"></span></li>
<li id="condividi-in-facebook"><a href="#" class="labelcat"><img src="<?php print $my_theme_folder?>/img/ico_facebook_bg_blu_alpha.png" alt="Condividi in Facebook" />Condividi in Facebook</a><span class="menu-sidebar-desc">Fai il login col tuo account di Facebook e condividi con i tuoi amici i contenuti del sito!</span><span class="end"></span></li>
</ul>
Detto questo, come faccio a far sì che buttino fuori lo stesso risultato? Così, a senso, direi che mi servono cose tipo
<?php print $title ?> <?php print $body ?> <?php print $icona ?>
o qualcosa del genere da mettere al posto del mio codice statico, mantenendo un solo elemento lista e mettendolo in un ciclo.
Immagino che però non possa essere così semplice. O magari è più semplice ancora e non ci arrivo.
Puoi provare a spiegarmi con un esempio cosa intendi quando dici "Bisogna mappare gli elementi e classi a quelli del tuo codice HTML (basta aggiungere i varie selectors al CSS originale)"?
Ho provato anche a modificare la mia vista in Nodo e a maneggiare node-banner.tpl.php (funzionante!!!).
Qui ho $title a cui posso appioppare una bella classe css, ma poi ho $content che mi stampa in una volta sola icona e body e sono fregato di nuovo!
Come ne esco!?
Non ho molto tempo adesso - quindi sarà un storia a due parti...



Ho creato un tipo di contenuto 'banner':
Poi ho creato un view (blocco):
Il risultato è così:
(Tu hai fatto meglio di me - ma non mi fermo mica qui ;-)
Usando Tema: Informazioni dalla vista ho creato un template (preso da
sites/all/modules/views/theme/views-view-fields.tpl.php
) chiamatoviews-view-fields--banner-ads--block.tpl.php
che da più che sufficiente 'specificità'.In questo ho fiondato un bel
Come si vede, l'informazione c'è. Bisogna solo 'plasmarlo' con un pò di HTML e CSS. esempio, per stampare l'immagine devo solo fare
che scriverà:
<img src="http://dev.autonomous-sandbox/sites/default/files/imagecache/reg/faceboo... alt="" title="" class="imagecache imagecache-reg imagecache-default imagecache-reg_default" width="57" height="57" />
Domani proseguo col smanettare il template. Oppura fai tu prima...
[Edit] l'immagine di Devel era sparito. Cambio hosting per gli immagini [/Edit]
Più imparo, più dubito.
Vedi, bastava questo! :-)
Era questo che non capivo: come tirare fuori gli oggetti da quel dannato array!
Grazie di cuore.
R.
Per completare il thread, scrivi tu la parte seconda? Pubblichi qui il codice che metti nel template? Grazie...
Più imparo, più dubito.
Volentieri. Ci sto lavorando ora. Appena è pronto, scrivo il post.
Eccomi per l'atto conclusivo.
Una volta definiti i campi della vista (immagine, titolo, corpo e link) e capito la sintassi con cui tirare fuori il valore di ciascun campo, ho creato due template (views-view-fields--Banner--block.tpl.php e views-view-list--Banner--block.tpl.php) in cui ho riscritto una lista praticamente identica a quella html che avevo scritto all'inizio, così ho evitato di riscrivere i CSS. Il mio html originale è in uno dei post precedenti
In views-view-fields--Banner--block.tpl.php ho definito il contenuto del singolo elemento della lista come segue (mantengo anche i commenti così può essere tutto più chiaro.
<?php
// $Id: views-view-fields--Banner--block.tpl.php,v 1.6 2008/09/24 22:48:21 merlinofchaos Exp $
/**
* @file views-view-fields.tpl.php
* Default simple view template to all the fields as a row.
*
* - $view: The view in use.
* - $fields: an array of $field objects. Each one contains:
* - $field->content: The output of the field.
* - $field->raw: The raw data for the field, if it exists. This is NOT output safe.
* - $field->class: The safe class id to use.
* - $field->handler: The Views field handler object controlling this field. Do not use
* var_export to dump this object, as it can't handle the recursion.
* - $field->inline: Whether or not the field should be inline.
* - $field->inline_html: either div or span based on the above flag.
* - $field->separator: an optional separator that may appear before a field.
* - $row: The raw result object from the query, with all data it fetched.
*
* @ingroup views_templates
*/
?>
<?php
//dsm($fields); //Questo codice (santo jhl) butta fuori i campi
?>
<?php print "id="" . str_replace('.','', str_replace(' ', '-', strtolower($fields['title']->raw))) . "">";
// Il codice qui sopra serve a stamparmi l'id di ciascun elemento della lista (l'id è il nome stessa della lista, minuscolo e col - al posto dello spazio
// ATTENZIONE <li> chiuso qui per inserire ID=
// RICORDA <li> si apre e si chiude </li> in views-view-list--Banner--block.tpl.php
// Infine uso raw al posto di content per evitare refusi di codice html
?>
<a href="<?php print $fields['field_icona_fid']->raw; ?>" class="labelcat">
<img src="<?php print $fields['field_icona_fid']->raw; ?>" alt="<?php print $fields['title']->raw; ?>" /><?php print $fields['title']->raw; ?></a>
<?php if ($fields['body']->raw) { ?>
<span class="menu-sidebar-desc"><?php print $fields['body']->raw; ?></span>
<?php } ?>
<span class="end"><!-- chiude box rounded --></span>
In views-view-list--Banner--block.tpl.php ho invece definito il contenitore della lista e, al suo interno, mandato in ciclo l'oggetto $row (con la sua classe) contenente tutti i campi visti in views-view-fields--Banner--block.tpl.php. Ecco il codice.
<?php
// $Id: views-view-list--Banner--block.tpl.php,v 1.13 2009/06/02 19:30:44 merlinofchaos Exp $
/**
* @file views-view-list.tpl.php
* Default simple view template to display a list of rows.
*
* - $title : The title of this group of rows. May be empty.
* - $options['type'] will either be ul or ol.
* @ingroup views_templates
*/
?>
<ul id="menu-sidebar-rounded">
<?php foreach ($rows as $id => $row): ?>
<li class="<?php print $classes[$id]; ?>" <?php print $row; ?></li>
<?php endforeach; ?>
</ul>
Il risultato è identico all'originale. Grazie, grazie, grazie, John.
R.
Errata corrige.
Dove scrivo
Intendo il nome del nodo e non della lista: se il nodo ha titolo Prossime date allora l'elemento della lista che lo manderà in output sarà
<li id="prossime-date">...</li>
Bravo Roberto, ma la foto finale, dov'è? Dai...
In più, se puoi modificare il titolo del thread mettendo un bel [Risolto] d'avanti (che solo tu o un admin può fare) - servirà anche ad altri - sapere che il camino aveva una (lieta) conclusione.
Più imparo, più dubito.
Hai ragione. E volevo anche mettere la foto finale, che poi è identica alla parte alta di fig.3, ma non mi funziona il client ftp e devo riavviare. Rimedierò al più presto.