Ajout dynamique d'une classe CSS à une ligne de vue avec template.php

8

J'ai en fait atteint le bas de Google en essayant de comprendre comment ajouter une classe CSS à chaque ligne d'une vue. L'astuce est que j'ai besoin que la classe de chaque ligne soit déterminée dynamiquement en fonction de certaines données du nœud à partir desquelles la vue est extraite. La fonction qui réussit parfaitement pour le nœud est -

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;
  }
}

Le but est de coder par couleur un événement qui n'a pas eu suffisamment de gens inscrits. Il y aura une liste d'événements sur la première page, et j'ai besoin qu'ils soient également codés par couleur. J'espère vraiment qu'il y aura une solution simple dans le sens de -

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

Le <?php print $event_class ?>simple fait de laisser tomber la vue .tpl ne le fait pas.

JGrubb
la source
Cela peut ne pas être considéré comme une bonne pratique (mettre la logique php dans un tpl), mais qu'en est-il de le mettre directement dans le tpl de la ligne?
tostinni
1
ce n'est pas une classe CSS, c'est du HTML. Et c'est censé être sémantique. Essayez d'utiliser des classes significatives et de laisser le rouge / vert pour le CSS.
Capi Etheriel

Réponses:

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;
  }
}

Je ne sais pas si c'est joli. Je ne sais pas comment cela fonctionne. Mais ça marche.

EDIT (02-01-2012): après avoir travaillé avec Drupal pendant une autre année maintenant, j'aurais essayé de trouver un autre moyen de le faire en plus de courir node_load()sur chaque ligne de la vue.

JGrubb
la source
5
remarque: dans la méthode template_preprocess_views_view, vous pouvez accéder aux données de nœud / entité dans $ view-> result [$ id] -> _ field_data ['nid'] ['entity'] (évitant ainsi node_load () sur chaque ligne)
g10
0

votre solution est super! Pour vous assurer que les classes seront vraiment ajoutées aux classes de lignes vues, vous devez ajouter

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

après

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

Et la fonction de prétraitement sera:

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]);
    }
  }

}

Oana Hulpoi
la source