Agregar dinámicamente una clase CSS a una fila de vista con template.php

8

De hecho, he llegado al final de Google tratando de descubrir cómo agregar una clase CSS a cada fila de una vista. El truco es que necesito que la clase para cada fila se determine dinámicamente en función de algunos de los datos del nodo desde el que se extrae la vista. La función que lo lleva a cabo perfectamente para el nodo es:

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

El objetivo de esto es codificar por color un evento que no ha tenido suficientes personas para registrarse. Habrá una lista de eventos en la portada, y también necesito que estén codificados por colores. Realmente espero que haya una solución simple en la línea de -

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

Solo caer <?php print $event_class ?>en la vista .tpl no lo hace.

JGrubb
fuente
Puede que no se considere una buena práctica (poner la lógica php en un tpl), pero ¿qué hay de poner esto directamente en la fila tpl?
tostinni
1
esa no es una clase CSS, es HTML. Y se supone que es semántico. Intenta usar clases significativas y deja rojo / verde para el CSS.
Capi Etheriel

Respuestas:

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

No sé si es bonita. No sé cómo funciona. Pero funciona.

EDITAR (02-01-2012): después de trabajar con Drupal durante otro año, habría intentado encontrar otra forma de hacerlo además de ejecutar node_load()en cada fila de la vista.

JGrubb
fuente
55
nota: en el método template_preprocess_views_view, puede acceder a los datos del nodo / entidad en $ view-> result [$ id] -> _ field_data ['nid'] ['entity'] (evitando así node_load () en cada fila)
g10
0

tu solución es genial! Para asegurarse de que las clases realmente se agregarán a las clases de filas de vistas, debe agregar

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

después

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

Y la función de preproceso será:

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
fuente