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.
}
Je laisse tomber <?php print $event_class ?>
dans la vue .tpl ne le fait pas.
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 d'exécuter node_load()
sur chaque ligne de la vue.
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]);
}
}
}