Adicionando dinamicamente uma classe CSS a uma linha de exibição com template.php


8

Na verdade, cheguei à parte inferior do Google tentando descobrir como adicionar uma classe css a cada linha de uma exibição. O truque é que eu preciso que a classe para cada linha seja dinamicamente determinada com base em alguns dados do nó de onde a exibição é extraída. A função que executa isso perfeitamente para o nó é -

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

O objetivo é codificar por cores um evento que não teve pessoas suficientes para se inscrever. Haverá uma lista de eventos na primeira página, e eu preciso que eles também sejam codificados por cores. Eu realmente espero que exista uma solução simples ao longo das linhas de -

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

Apenas soltar <?php print $event_class ?>a visualização .tpl não faz isso.


Pode não ser considerado uma boa prática (colocar a lógica php em um tpl), mas e colocar isso diretamente na linha tpl?
Tostinni 19/05/11

11
isso não é uma classe CSS, é HTML. E é suposto ser semântico. Tente usar classes significativas e deixar vermelho / verde para o CSS.
Capi Etheriel

Respostas:


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

Não sei se é bonito. Não sei como ele funciona. Mas funciona.

EDIT (02-01-2012): depois de trabalhar com o Drupal por mais um ano, tentaria encontrar outra maneira de fazer isso além de executar node_load()em todas as linhas da exibição.


5
note: no método template_preprocess_views_view, você pode acessar os dados do nó / entidade em $ view-> result [$ id] -> _ field_data ['nid'] ['entity'] (evitando assim node_load () em cada linha)
g10

0

sua solução é ótima! Para garantir que as classes sejam realmente adicionadas às classes de linhas das visualizações, adicione

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

depois de

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

E a função de pré-processo 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]);
    }
  }

}

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.