Aggiunta dinamica di una classe CSS a una riga della vista con template.php


8

In realtà ho raggiunto il fondo di Google cercando di capire come aggiungere una classe CSS a ogni riga di una vista. Il trucco è che ho bisogno che la classe per ogni riga sia determinata dinamicamente in base ad alcuni dei dati dal nodo da cui viene estratta la vista. La funzione che lo distingue ordinatamente per il nodo è -

function pgc_preprocess(&$variables) {
  $node = $variables['node'];
  if ($node->type == "event") {
    $variables['event_class'] = '';
    $num_trainers = $node->field_number_of_trainers[0]['value'];
    $count = count($node->field_trainer);
    if($count < $num_trainers) {
        $variables['event_class'] = 'red';
    } else {
        $variables['event_class'] = 'green';
    }
    return $variables;
  }
}

Il punto è quello di codificare con un colore un evento che non ha avuto abbastanza persone iscriversi. Ci sarà un elenco di eventi in prima pagina e ho bisogno che anche loro abbiano un codice colore. Spero davvero che ci sia una soluzione semplice sulla falsariga di -

function pgc_preprocess_views_view_unformatted(&$variables) {
  // Magic here, preferably having something to 
  // do with the function I already wrote.
}

Basta cadere <?php print $event_class ?>nella vista .tpl non lo fa.


Potrebbe non essere considerata una buona pratica (mettere la logica php in un tpl) ma che ne dici di metterlo direttamente nella riga tpl?
tostinni,

1
quella non è una classe CSS, è HTML. E dovrebbe essere semantico. Prova a usare classi significative e a lasciare rosso / verde per il CSS.
Capi Etheriel,

Risposte:


10
function pgc_preprocess_views_view_unformatted__home_listing(&$vars) {
  // Borrowed this bit from http://drupal.org/node/312220
  $view = $vars['view'];
  $rows = $vars['rows'];

  foreach ($rows as $id => $row) {
    $data = $view->result[$id];
    $event_class = get_the_classes($data->nid);
    $vars['classes'][$id] .= ' ' . $event_class;
  }
}

function get_the_classes($nid) {
  $node = node_load($nid);
  global $user;
  if ($user->uid != 0) { // Not for anon users.
    $event_class = '';
    if ($node->field_trainer[0]['uid'] == NULL) {
        $event_class= 'red';
    } else {
        $num_trainers = $node->field_number_of_trainers[0]['value'];
        $count = count($node->field_trainer);
        if($count < $num_trainers) {
            $event_class = 'red';
        } else {
            $event_class = 'green';
        }
    }
    return $event_class;
  }
}

Non so se è carino. Non so come si comporta. Ma funziona

EDIT (02-01-2012): dopo aver lavorato con Drupal per un altro anno ormai, avrei cercato di trovare un altro modo per farlo oltre a correre node_load()su ogni riga della vista.


5
nota: nel metodo template_preprocess_views_view, puoi accedere ai dati nodo / entità in $ view-> result [$ id] -> _ field_data ['nid'] ['entity'] (evitando così node_load () su ogni riga)
g10

0

la tua soluzione è fantastica! Per assicurarti che le classi vengano realmente aggiunte alle classi di riga delle viste che devi aggiungere

$vars['classes_array'][$id] = implode(' ', $vars['classes'][$id]);

dopo

$vars['classes'][$id][] = $event_class;

E la funzione di preelaborazione sarà:

function pgc_preprocess_views_view_unformatted__home_listing(&$vars) {
  // Borrowed this bit from http://drupal.org/node/312220
  $view = $vars['view'];
  $rows = $vars['rows'];

  foreach ($rows as $id => $row) {
    $data = $view->result[$id];
    $event_class = get_the_classes($data->nid);
    if($event_class != '') {
        $vars['classes'][$id][] = $event_class;
        $vars['classes_array'][$id] = implode(' ', $vars['classes'][$id]);
    }
  }

}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.