Theming node--products.tpl.php in D7 + Ubercart 3
Ciao a tutti,
sto realizzando un negozio online con D7 + Ubercart 3...
Tramite le Views ho creato delle viste personalizzate per la Home Page, Prodotti simili, Ricerca e categorie.. per quanto riguarda la pagina del prodotto, con le viste non riesco a formattarla come voglio con le views quindi ho duplicato il file node.tpl.php e rinominato in node--product.tpl.php ed ho iniziato a richiamare i vari campi del prodotto all'interno di una <table>.. e funziona, la pagina del prodotto viene visualizzata come io l'ho impostata!
Il problema è che adesso mi ha cambiato la formattazione dei campi anche in home page, nel box prodotti simili etc
come faccio a far si che questa formattazione (ovvero il "node--product.tpl.php") venga applicata solo per la pagina del prodotto ( node/%) ???
Non so se mi sono spiegato bene... scusatemi!
Grazie del supporto

Risposte
Ciao, all'interno del
Ciao, all'interno del template hai una variabile aggiuntiva $view_mode che determina se è stato richiesto il rendering del nodo "full" (visualizzazione pagina), "teaser" (anteprima), etc.. (altri tipi di visualizzazione). Prova a mettere un "print $view_mode" dentro il tuo node--product.tpl.php e vedi quale visualizzazione viene richiamata all'interno delle pagine. Probabilmente le liste in home sono anteprime di prodotti: con qualche salto condizionale dovresti poter risolvere (i.e. switch ($view_mode) { case 'full': ... case 'teaser': ... } ).
Spero ti sia utile!
perchè non ci ho pensato
perchè non ci ho pensato prima...
Grazie mille!!!! funziona, ma ho fatto degli "if" non so se è corretto... non sono un gran esperto di php!!
la struttuta del mio node--products.tpl.php adesso è la seguente:
<?php
if($view_mode=='full') {
?>
" qui ho messo una 'table' all'interno della quale richiamo i campi che mi servono"
<?php } ?>
<?php
if($view_mode=='teaser') {
?>
"qui ho copiato pari pari il contenuto del file node.tpl.php
<?php } ?>
Tutto sembra funzionare come voglio, ma è coretto?
Grazie ancora!!!!
Ciao, il codice è corretto
Ciao, il codice è corretto anche se invertirei le condizioni utilizzando il costrutto if .. then .. else tipo:
<?php if ($view_mode == 'teaser') { ?><!-- contenuto dal mostrare nelle anteprime -->
<?php } else { /* copre tutti gli altri casi */ ?>
<!-- contenuto dal mostrare per le altre visualizzazioni -->
<?php } ?>
Ciao e Grazie ancora per
Ciao e Grazie ancora per l'aiuto!!!
ho un altro problemino.. io nel prodotto ho un campo di tipo 'pulsante opzione' chiamato "field_product_presale"
Questo mi serve per quei prodotti che devono ancora uscire sul mercato e quindi li voglio mettere online come prevendita... Ogni volta che inserisco un articolo io seleziono se SI (prevendita) o NO (prodotto normale),
adesso vorrei inserire nel node--products.tpl un if del genere:
<?php if ($content['field_product_presale'] == 'SI') { ?>
<img src="images/presale.png">
<?php print render($content['display_price']); ?>
<?php } else { ?>
<?php } ?>
ma non accade niente... credo che mi stia sfuggento qualcosa!!! Ho provato anche a mettere '0' al posto di 'SI'... 0 sarebbe la chiave del SI e 1 del NO
Anche per lo stock vorrei fare qualcosa di simile del tipo... if uc_stock_level (o come si chiama) >= 5 'carica immagine verde'
if >0 e <5 carica immagine arancione, if =0 carica immagine rossa...
Grazie
Per vedere la struttura di un
Per vedere la struttura di un oggetto o variabile e il suo valore puoi utilizzare le funzioni php var_dump e print_r. Volendo puoi usare il modulo devel che ti mette a disposizione funzioni addizionali come kpr (basato sulla libreria Krumo, veramente molto comoda e intuitiva) o dvm.
Perdona la mia ignoranza...
Perdona la mia ignoranza... non ho capito bene come fare con il var_dump.. potresti farmi un esempio di sintassi?
Mentre per il modulo devel ri riferivi a questo.. http://drupal.org/project/devel ?
Grazie
Con una cosa del genere <?php
Con una cosa del genere
<?phpprint '<pre>' . print_r($content, TRUE) . '</pre>';
?>
oppure
<?phpvar_dump($content);
?>
otteni una stampa a schermo della struttura e del contenuto della variabile.
Puoi vedere quali valori assume una determinata componente e impostare le condizioni di conseguenza.
Sì, mi riferivo a quel progetto. Una volta attivato puoi disporre di vari strumenti per lo sviluppo: ti aggiunge anche un tab in più sul nodo con informazioni per il debug e il theming.
Devel installato... OTTIMO
Devel installato... OTTIMO STRUMENTO!!
ma ancora non ho risolto.. credo che stia facendo qualche errore di sintassi...
Questa è l'array che mi restituisce:
[field_product_presale] => Array
(
[und] => Array
(
[0] => Array
(
[value] => 0
)
)
)
quindi ho scritto il seguente codice, ma credo che io stia facendo qualche errore di sintassi:
<?php if($content['field_product_presale'][value]==0) { ?>
<img src="images/presale.png">
<?php } ?>
<?php } else { ?>
<!-- prodotto non in prevendita -->
<?php } ?>
ci sto diventando matto...
il sistema non mi restituisce nessun errore.. ho provato a mettere una stringa di testo nel 'else' e me la stampa!
Grazie
Come puoi vedere dal
Come puoi vedere dal risultato stampato dalla funzione print_r non è
<?php$content['field_product_presale'][value]
?>
ma
<?php$content['field_product_presale']['und'][0]['value']
?>
il valore da confrontare.
Avevo già provato anche
Avevo già provato anche così...
<?php if ($content['field_product_presale']['und'][0]['value'] == '0') { ?>
ma il risultato è l'errore seguente:
Notice: Undefined index: und in include() (linea 109......
l'unica formula che non mi restituisce nessun errore è questa:
<?php if ($content['field_product_presale'][0] == '0') { ?>
ma non mi soddisfa la condizione lo stesso.
Potrebbe essere che in certi
Potrebbe essere che in certi casi il valore del campo non sia definito. Fai un check dell'esistenza dell'elemento dell'array con isset($content['field_product_presale']['und']) prima di confrontarlo.
No niente... stesso
No niente... stesso errore!!!
Grazie per la pazienza ed il tempo che mi dedichi, sei la persona più gentile che io abbia mai incontrato durante una richiesta di supporto!!!
Beh ... è stano che continui
Beh ... è stano che continui a darti lo stesso errore se prima controlli l'esistenza della variabile. Prova a postare l'output di print_r($content) e il codice dell'intero file tpl.
Ho caricato dei file rtf
Ho caricato dei file rtf altrimenti qua facevo troppa confusione... li trovi qua:
www.mozaikolive.com/print_r.rtf
http://www.mozaikolive.com/node--product.rtf
Grazie
Guardando la stampa completa
Guardando la stampa completa la parte che ti interessa è questa
[field_product_presale] => Array
(
[#theme] => field
[#weight] => 10
[#title] => Product Presale
[#access] => 1
[#label_display] => above
[#view_mode] => full
[#language] => und
[#field_name] => field_product_presale
[#field_type] => list_integer
[#field_translatable] => 0
[#entity_type] => node
[#bundle] => product
[#object] => stdClass Object
(
[vid] => 24
[uid] => 1
[title] => Fabio Records - Fabio DJ - Fabio EP Fabio Records - Fabio DJ - Fabio EP Fabio Records - Fabio DJ - Fabio EP Fabio Records - Fabio DJ - Fabio EP Fabio Records - Fabio DJ - Fabio EP
[log] =>
[status] => 1
[comment] => 2
[promote] => 1
[sticky] => 0
[nid] => 24
[type] => product
[language] => und
[created] => 1358863097
[changed] => 1360542145
[tnid] => 0
[translate] => 0
[revision_timestamp] => 1360542145
[revision_uid] => 1
[model] => FB03
[list_price] => 0.00000
[cost] => 0.00000
[sell_price] => 13.00000
[weight] => 0.3
[weight_units] => kg
[length] => 0
[width] => 0
[height] => 0
[length_units] => cm
[pkg_qty] => 1
[default_qty] => 1
[unique_hash] => 3c8f4c2ae4cc794b105588a547089bcb
[ordering] => 0
[shippable] => 1
[price] => 13.00000
[body] => Array
(
)
[uc_product_image] => Array
(
[und] => Array
(
[0] => Array
(
[fid] => 75
[alt] =>
[title] =>
[width] => 1399
[height] => 1386
[uid] => 1
[filename] => ep8.jpg
[uri] => public://ep8.jpg
[filemime] => image/jpeg
[filesize] => 760420
[status] => 1
[timestamp] => 1358863097
[type] => image
[rdf_mapping] => Array
(
)
)
[1] => Array
(
[fid] => 84
[alt] =>
[title] =>
[width] => 455
[height] => 455
[uid] => 1
[filename] => big-shots-bonus-ep.jpg
[uri] => public://big-shots-bonus-ep_0.jpg
[filemime] => image/jpeg
[filesize] => 128091
[status] => 1
[timestamp] => 1359298083
[type] => image
[rdf_mapping] => Array
(
)
)
)
)
[taxonomy_catalog] => Array
(
[und] => Array
(
[0] => Array
(
[tid] => 1
[taxonomy_term] => stdClass Object
(
[tid] => 1
[vid] => 2
[name] => Vinyl 12"
[description] =>
[format] => filtered_html
[weight] => 0
[vocabulary_machine_name] => catalog
[uc_catalog_image] => Array
(
)
[rdf_mapping] => Array
(
[rdftype] => Array
(
[0] => skos:Concept
)
[name] => Array
(
[predicates] => Array
(
[0] => rdfs:label
[1] => skos:prefLabel
)
)
[description] => Array
(
[predicates] => Array
(
[0] => skos:definition
)
)
[vid] => Array
(
[predicates] => Array
(
[0] => skos:inScheme
)
[type] => rel
)
[parent] => Array
(
[predicates] => Array
(
[0] => skos:broader
)
[type] => rel
)
)
)
)
)
)
[field_product_presale] => Array
(
[und] => Array
(
[0] => Array
(
[value] => 0
)
)
)
[field_release_date] => Array
(
[und] => Array
(
[0] => Array
(
[value] => 01/01/2013
[format] =>
[safe_value] => 01/01/2013
)
)
)
[field_prova_presale] => Array
(
[und] => Array
(
[0] => Array
(
[value] => SI
[format] =>
[safe_value] => SI
)
)
)
[field_product_mp3_prelisten] => Array
(
[und] => Array
(
[0] => Array
(
[fid] => 77
[display] => 1
[description] =>
[uid] => 1
[filename] => Beeinflussen (Original Mix).mp3
[uri] => public://sites/default/files/music/Beeinflussen (Original Mix)_4.mp3
[filemime] => audio/mpeg
[filesize] => 1106606
[status] => 1
[timestamp] => 1358863097
[type] => audio
[rdf_mapping] => Array
(
)
)
)
)
[field_simplenews_term] => Array
(
[und] => Array
(
[0] => Array
(
[tid] => 13
)
)
)
[field_title_ep] => Array
(
[und] => Array
(
[0] => Array
(
[value] => Fabio EP
[format] =>
[safe_value] => Fabio EP
)
)
)
[field_artist] => Array
(
[und] => Array
(
[0] => Array
(
[value] => Fabio DJ
[format] =>
[safe_value] => Fabio DJ
)
)
)
[field_catalog_n_] => Array
(
[und] => Array
(
[0] => Array
(
[value] => FB03
[format] =>
[safe_value] => FB03
)
)
)
[field_label] => Array
(
[und] => Array
(
[0] => Array
(
[value] => Fabio Records
[format] =>
[safe_value] => Fabio Records
)
)
)
[rdf_mapping] => Array
(
[rdftype] => Array
(
[0] => sioc:Item
[1] => foaf:Document
)
[title] => Array
(
[predicates] => Array
(
[0] => dc:title
)
)
[created] => Array
(
[predicates] => Array
(
[0] => dc:date
[1] => dc:created
)
[datatype] => xsd:dateTime
[callback] => date_iso8601
)
[changed] => Array
(
[predicates] => Array
(
[0] => dc:modified
)
[datatype] => xsd:dateTime
[callback] => date_iso8601
)
[body] => Array
(
[predicates] => Array
(
[0] => content:encoded
)
)
[uid] => Array
(
[predicates] => Array
(
[0] => sioc:has_creator
)
[type] => rel
)
[name] => Array
(
[predicates] => Array
(
[0] => foaf:name
)
)
[comment_count] => Array
(
[predicates] => Array
(
[0] => sioc:num_replies
)
[datatype] => xsd:integer
)
[last_activity] => Array
(
[predicates] => Array
(
[0] => sioc:last_activity_date
)
[datatype] => xsd:dateTime
[callback] => date_iso8601
)
)
[cid] => 0
[last_comment_timestamp] => 1358863097
[last_comment_name] =>
[last_comment_uid] => 1
[comment_count] => 0
[shipping_type] => small_package
[shipping_address] => Array
(
[first_name] =>
[last_name] =>
[company] => Frequenze - Distribuzioni Mix
[street1] => Viale Guidoni, 58
[street2] =>
[city] => Firenze
[zone] => 114
[country] => 380
[postal_code] => 50100
[phone] => +39 055 412841
[email] =>
)
[ups] => Array
(
[vid] => 24
[nid] => 24
[pkg_type] => 02
)
[name] => admin
[picture] => 0
[data] => b:0;
[entity_view_prepared] => 1
)
[#items] => Array
(
[0] => Array
(
[value] => 0
)
)
[#formatter] => list_default
[0] => Array
(
[#markup] => SI
)
)
quindi il valore da verificare è $content['field_product_presale']['#items'][0]['value']. Inoltre:
<?phpisset($content['field_product_presale']['und']);
if($content['field_product_presale']['und'][0]['value'] == 0) {
?>
questo controllo non ha alcun senso. L'esistenza va controllata dentro la condizione prima del confronto, nel caso ad esempio:
<?phpif (isset($content['field_product_presale']['#items'][0]) &&
($content['field_product_presale']['#items'][0]['value'] == 0)) {
?>
Ottimo!!! Funziona!!! Ma
Ottimo!!! Funziona!!!
Ma toglimi una curiosità.. non ho capito in che modo il campo [#items] è collegato al campo ['field_product_presale']??
E un altra curiosità, perchè con il print_r non riesco a vedere la variabile del livello dello stock? volevo fare la stessa cosa per il livello dello stock mettendo magari un pallino verde quando lo stock è superiore a 5, un pallino arancione quando è compreso tra 0 e 5 e ovviamente rosso quando è 0.
Grazie
Nell'elemento #items c'è
Nell'elemento #items c'è l'array dei valori del campo relativo (è un array perchè il campo potrebbe avere più valori) che è l'output della funzione field_get_items (http://api.drupal.org/api/drupal/modules%21field%21field.module/function...).
Esiste una funzione per trovare la qtà a magazzino di un prodotto uc_stock_level (http://api.drupalize.me/api/drupal/function/uc_stock_level/7).
Perfetto, mi sei stato
Perfetto, mi sei stato davvero di enorme aiuto!!!! Non so come ringraziarti..
l'ultimo sito che mi hai indicato è davvero utile!!!
Grazie ancora!!!!! :)
Ciao, un altra domanda.. ero
Ciao,
un altra domanda.. ero riuscito ad ottenere il livello di stock non con la funzione uc_stock_level($sku)
ma con la funzione uc_stock_level($node->model) nel node--products.tpl.php
quindi facevo:
$stock = uc_stock_level($node->model);
<?php if ($stock > 5) { ?>
<img src="/images/stock_green.png">
etc etc...
adesso vorrei porre la stessa condizione in un campo di testo "php code" in modo da poterlo richiamare non solo nel node--products ma in qualsiasi vista!
Con lo stesso if che ho nel node--products mi restituisce il seguente errore:
Notice: Undefined variable: node in eval() (line 2 of /var/www/clients/client0/web1/web/modules/php/php.module(80) : eval()'d code).
Notice: Trying to get property of non-object in eval() (line 2 of /var/www/clients/client0/web1/web/modules/php/php.module(80) : eval()'d code).
anche se metto la funzione "uc_stock_level($sku)" mi restituisce questo errore:
Notice: Undefined variable: sku in eval() (line 2 of /var/www/clients/client0/web1/web/modules/php/php.module(80) : eval()'d code).
sembra quasi che non riesca a leggere le variabili..
Grazie
Apri sempre una nuova
Apri sempre una nuova richiesta invece di accordare altre domande ad una vecchia!
Hai ragione, le variabili non riesce a leggerle, proprio perché non sono definite nel contesto in cui viene richiamata eval(). In pratica devi fare in modo di definire l'oggetto $node (che all'interno del template è appunto definito), ad esempio tramite node_load (http://api.drupal.org/api/drupal/modules%21node%21node.module/function/n...) passandogli i parametri disponibili nel contesto di chiamata.
Grazie mille!! Credo di aver
Grazie mille!!
Credo di aver capito.. provo a fare come dici!!
Perdonami.. la prossima volta se ne ho bisogno aprirò una nuova richiesta!!!