[RISOLTO] Attributo CSS da valore field

20 contenuti / 0 new
Ultimo contenuto
[RISOLTO] Attributo CSS da valore field

Ciao a tutti. Sto cercando di risolvere una questione semplice ma non riesco ad andarne fuori. Praticamente vorrei creare una piccola "cosa" (che sia un block, un CCK field, ecc., non ha importanza) che rappresenti il giorno di chiusura dell'azienda. Esempio:

L M M G V S D

Vorrei che a seconda del giorno di chiusura, cambiasse lo stile della lettera che lo rappresenta. Per fare un altro esempio:

L M M G V S D

Considerate che voglio che questo sia fatto automaticamente. Il problema è che non so come procedere. Pensavo di creare un text field di tipo "Select list" e, a seconda del valore scelto, assegnargli un ID.. ma come?

interessante.
si può fare in 100 modi (!)
io che sono pigro userei computed field.
crei un campo select con allowed values i gg della settimana (sto campo non lo mostri in node/teaser view, ma te lo trovi nel db per altri usi)
crei un campo computed che non salverai nel db (non serve, visto che c'è l'altro)
questo campo dovrebbe essere più o meno così (senza tag php):

<?php
//$node_field[0]['value'] è il campo computed; field_giorno_chiusura[0]['value'] è il campo che contiene il giorno selezionato
$node_field[0]['value'] = '<div class="' . $node->field_giorno_chiusura[0]['value'] . '"><div class="lun">L</div><div class="mar">M</div><div class="mer">M</div><div class="gio">G</div><div class="ven">V</div><div class="sab">S</div><div class="dom">D</div></div>';
 
?>

ammettendo che gli allowed values siano i giorni abbreviati, il tuo css dovrebbe essere più o meno così:
.lun .lun,
.mar .mar,
.mer .mer,
.gio .gio,
.ven .ven,
.sab .sab,
.dom .dom{
font-weight:bold;
}

ovviamente sia css che php vanno rivisti per il caso specifico...

Ciao, intanto ti ringrazio per l'aiuto.
Saranno un paio d'ore che provo a seguire la tua strada ma non ci riesco!
Provando il tuo codice viene fuori un div con class = "indici del valore" (cioè lun=1, mar=2, ecc) che racchiude una serie di div con ognuno una classe distinta dall'altra (lun, mar, mer, gio, ven, sab, dom). Sto provando a ragionare ma non trovo la soluzione giusta. Senza contare poi che questo metodo presuppone che ci sia un solo valore per la field "field_giorno_chiusura" mentre io vorrei usare delle checkbox con la possibilità di scelta multipla..

probabilmente stai pescando il value dall'array, mentre ti serve la key, ovvero l'etichetta.
devi vederti il nodo con devel e trovare l'elemento che ti serve, almeno io faccio così.

si può fare anche per la scelta multipla: ogni opzione può essere recuperata e usata come classe css.
bisogna solo architettare il modo migliore per farlo.

un'altra cosa: se definisci gli allowed values così:

lun|Lunedì
mar|Martedì
eccetera

"lun", "mar", eccetera dovrebbero essere usati come key, invece di 1,2,3,...

Sono "circa" arrivato ad una soluzione in questo modo:

<?php
$temp
= array();
foreach (
element_children($node-> field_giorno_chiusura) as $key) {
   
$temp[] = $node->field_giorno_chiusura[$key]['value'];
}
foreach (
$temp as $key => $value) {
switch (
$value) {
case
"lun":
$node_field[0]['value'] = '<div class="chiuso">L</div>';
break;
case
"mar":
$node_field[1]['value'] = '<div class="chiuso">M</div>';
break;
case
"mer":
$node_field[2]['value'] = '<div class="chiuso">M</div>';
break;
case
"gio":
$node_field[3]['value'] = '<div class="chiuso">G</div>';
break;
case
"ven":
$node_field[4]['value'] = '<div class="chiuso">V</div>';
break;
case
"sab":
$node_field[5]['value'] = '<div class="chiuso">S</div>';
break;
case
"dom":
$node_field[6]['value'] = '<div class="chiuso">D</div>';
break;
default:
$node_field[0]['value'] = '<div class="aperto">L</div>';
$node_field[1]['value'] = '<div class="aperto">M</div>';
$node_field[2]['value'] = '<div class="aperto">M</div>';
$node_field[3]['value'] = '<div class="aperto">G</div>';
$node_field[4]['value'] = '<div class="aperto">V</div>';
$node_field[5]['value'] = '<div class="aperto">S</div>';
$node_field[6]['value'] = '<div class="aperto">D</div>';
}
}
?>

Il problema è che in questo modo mi vengono stampati solo i valori che sono stati selezionati nel checkbox. Ad esempio, se seleziono lunedì e venerdì questo è il risultato:

L
V

con la classe "chiuso"...

posta un print_r dell'array completo del campo, altrimenti non posso aiutarti

Ehmm.. scusa ma non sono molto pratico! Come si fa un print_r dell'array?
Suppongo che sia qualcosa del tipo:

<?php
print_r
($node-> field_giorno_chiusura);
 
?>

ma dove inserisco questo codice?

in node.tpl.php, ad esempio (non sei in produzione immagino).
oppure usi il modulo devel (execute php code)

Ho risolto con questo codice:

<?php
 $temp
= array();
foreach (
element_children($node->field_giorno_chiusura) as $key) {
   
$temp[] = $node->field_giorno_chiusura[$key]['value'];
}
$node_field[0]['value'] = '<div class="aperto">L</div>';
$node_field[1]['value'] = '<div class="aperto">M</div>';
$node_field[2]['value'] = '<div class="aperto">M</div>';
$node_field[3]['value'] = '<div class="aperto">G</div>';
$node_field[4]['value'] = '<div class="aperto">V</div>';
$node_field[5]['value'] = '<div class="aperto">S</div>';
$node_field[6]['value'] = '<div class="aperto">D</div>';
foreach (
$temp as $key => $value) {
switch (
$value) {
case
"lun":
$node_field[0]['value'] = '<div class="chiuso">L</div>';
break;
case
"mar":
$node_field[1]['value'] = '<div class="chiuso">M</div>';
break;
case
"mer":
$node_field[2]['value'] = '<div class="chiuso">M</div>';
break;
case
"gio":
$node_field[3]['value'] = '<div class="chiuso">G</div>';
break;
case
"ven":
$node_field[4]['value'] = '<div class="chiuso">V</div>';
break;
case
"sab":
$node_field[5]['value'] = '<div class="chiuso">S</div>';
break;
case
"dom":
$node_field[6]['value'] = '<div class="chiuso">D</div>';
break;
}
}
?>

In questa maniera è tutto ok. Volevo infine aggiungere un div contenitore, per poter sfruttare la proprietà float e allineare i div. Ho quindi provato così:

<?php
 $temp
= array();
foreach (
element_children($node->field_giorno_chiusura) as $key) {
   
$temp[] = $node->field_giorno_chiusura[$key]['value'];
}
$node_field[0]['value'] = '<div class="settimana-cont"><div class="aperto">L</div>';
$node_field[1]['value'] = '<div class="aperto">M</div>';
$node_field[2]['value'] = '<div class="aperto">M</div>';
$node_field[3]['value'] = '<div class="aperto">G</div>';
$node_field[4]['value'] = '<div class="aperto">V</div>';
$node_field[5]['value'] = '<div class="aperto">S</div>';
$node_field[6]['value'] = '<div class="aperto">D</div></div>';
foreach (
$temp as $key => $value) {
switch (
$value) {
case
"lun":
$node_field[0]['value'] = '<div class="settimana-cont"><div class="chiuso">L</div>';
break;
case
"mar":
$node_field[1]['value'] = '<div class="chiuso">M</div>';
break;
case
"mer":
$node_field[2]['value'] = '<div class="chiuso">M</div>';
break;
case
"gio":
$node_field[3]['value'] = '<div class="chiuso">G</div>';
break;
case
"ven":
$node_field[4]['value'] = '<div class="chiuso">V</div>';
break;
case
"sab":
$node_field[5]['value'] = '<div class="chiuso">S</div>';
break;
case
"dom":
$node_field[6]['value'] = '<div class="chiuso">D</div></div>';
break;
}
}
?>

Ma niente da fare.. Il risultato è che il div "settimana-cont" si chiude subito dopo il div del lunedì.

ps. Ho provato anche a fare il print dell'array con devel ma non ci riesco! Mi potresti dire esattamente il codice da inserire?

prendi il nid di un nodo dove è presente e compilato il campo giorno_chiusura
vai a tuosito/devel/php e incolla il codice (senza tag php)

<?php
//nid = node id del nodo in questione (un numero)
$node = node_load(nid);
print_r($node->field_giorno_chiusura);
 
?>

Grazie mille, mi stai aprendo un mondo! Il risultato è questo:

<?php
 
Array
(
    [
0] => Array
        (
            [
value] => lun
       
)
    [
1] => Array
        (
            [
value] => ven
       
)
    [
2] => Array
        (
            [
value] => dom
       
)
)
 
?>

In questo momento sono selezionati questi tre giorni. Comunque ho pensato, per quanto riguarda il discorso del div contenitore, di risolvere in una maniera molto più semplice: siccome è mia intenzione tematizzare ad hoc il sito (devo ancora affrontare questo aspetto di drupal) creerò un template apposito per il tipo di contenuto e inserirò lì, a mano, il div.
Qualcosa del tipo:

<?php
<div class="contenitore-giorno-chiusura">
print
$node->field_nomecomputedfield[0]['view']
</
div>
 
?>

con questo codice ottieni una variabile $classi = 'lun ven dom';

<?php
foreach ($node->field_giorno_chiusura as $key){
$temp[]=$key['value'];
}
$classi = implode($temp, ' ');
 
?>

piazzi la variabile nel div contenitore
<div class="<?php print $classi;?>">
  <div class="lun">L</div>
  <div class="mar">M</div>
  <div class="mer">M</div>
  <div class="gio">G</div>
  <div class="ven">V</div>
  <div class="sab">S</div>
  <div class="dom">D</div>
</div>

e il css rimane lo stesso già suggerito: solo le div con classe = a quella del div contenitore avranno il contenuto in grassetto. nel tuo esempio div.lun, div.ven e div.dom
.lun .lun,
.mar .mar,
.mer .mer,
.gio .gio,
.ven .ven,
.sab .sab,
.dom .dom{
font-weight:bold;
}

modificare a piacere ;)

Niente.. sto provando da una mezz'ora e il codice non funge.. il risultato è:

<div class="">
  <div class="lun">L</div>
  <div class="mar">M</div>
  <div class="mer">M</div>
  <div class="gio">G</div>
  <div class="ven">V</div>
  <div class="sab">S</div>
  <div class="dom">D</div>
</div>

Se faccio un print della Computed Field in questione, il risultato è questo:

<?php
 
Array
(
)
?>

Risolto finalmente! Una faticaccia di 3 giorni ma n'è valsa la pena!

<?php
 $temp
= array();
foreach (
element_children($node->field_giorno_chiusura) as $key) {
   
$temp[] = $node->field_giorno_chiusura[$key]['value'];
}
$my_days = implode($temp, ' ');
$node_field[0]['value'] = '<div class="'. $my_days .'">
    <div class="lun">L</div>
    <div class="mar">M</div>
    <div class="mer">M</div>
    <div class="gio">G</div>
    <div class="ven">V</div>
    <div class="sab">S</div>
    <div class="dom">D</div>
    </div>'
;
?>

Bohz ti ringrazio veramente tanto: sia per la disponibilità e sia per l'avermi fatto scoprire un sacco di cose. Grazie davvero.

OMG!
scusa, il mio ultimo post era riferito all'uso in un template, non in un computed field.
chiaro che così cambia un po' la logica.
felice tu abbia risolto, comunque

Ah cavoli non l'avevo capito!
Pensa che all'inizio avevo inserito il primo frammento in un computed field e la seconda porzione nel template.. ecco perché non funzionava!
Proverò allora la tua soluzione che mi sembra più elegante.

Perfetto, funziona anche la tua soluzione. Inoltre la preferisco di gran lunga alla mia, perché ho notato che drupal mi crea un sacco di div e span quando spara fuori i valori dei cck field e computed field. Almeno in questo modo levo via del codice superfluo. Ancora grazie!

Per fare le cose come si deve, la logica php dovrebbe essere inserita in template.php nella funzione di preprocess_node; il risultato sarà poi recuperato dal template.

<?php
function TUOTEMA_preprocess_node(&$vars){
$node = $vars['node'];
if(
$node->type == 'TUOTIPODICONTENUTO'){
foreach (
$node->field_giorno_chiusura as $key){
$temp[]=$key['value'];
}
$vars['classi_gg'] = implode($temp, ' ');
}
}
 
?>

poi in node-TUOTIPODICONTENUTO.tpl.php richiami la variabile: <div class="<?php print $classi_gg ?>">(...)

Perfetto, farò in questo modo allora quando sarà il momento di creare il tema personalizzato.

ciao, vorrei fare una cosa molto simile a questa ma non so bene da dove cominciare!
io ho creato una view degli utenti che ho creato,poi
Quello che vorrei inserire è un controllo su un attributo dell'utente. se il campo in questione che è una data di scadenza è prossimo ( va bene anche un mese prima) alla data di oggi, mi dovrebbe o mostrare quegli utenti colorati o magari appena mi loggo mi mostri una lista degli utenti prossimi alla scadenza.

O magari potrei fare che se la data è vicina li cancella, però sarebbe meglio se mi chiedesse conferma quando mi loggo.
Come faccio?