Динамическое добавление класса CSS в строку представления с помощью template.php

8

Я фактически достиг дна Google, пытаясь выяснить, как добавить класс CSS в каждую строку представления. Хитрость в том, что мне нужно, чтобы класс для каждой строки определялся динамически на основе некоторых данных из узла, из которого извлекается представление. Функция, которая выполняет это аккуратно для узла -

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

Смысл этого в том, чтобы раскрасить код события, на которое не было достаточно подписчиков. На первой странице будет список событий, и мне нужно, чтобы они также были выделены цветом. Я действительно надеюсь, что есть какое-то простое решение по линии -

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

Просто падение <?php print $event_class ?>в представлении .tpl не делает этого.

JGrubb
источник
Это не может считаться хорошей практикой (помещение логики php в tpl), но как насчет размещения этого непосредственно в строке tpl?
Тостинни
1
это не класс CSS, это HTML. И это должно быть семантическим. Попробуйте использовать значимые классы и оставьте красный / зеленый для CSS.
Capi Etheriel

Ответы:

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

Не знаю, если это красиво. Не знаю, как это работает. Но это работает.

РЕДАКТИРОВАТЬ (02-01-2012): после работы с Drupal в течение еще одного года, я бы попытался найти какой-то другой способ сделать это, кроме запуска node_load()в каждой строке представления.

JGrubb
источник
5
примечание: в методе template_preprocess_views_view вы можете получить доступ к данным узла / объекта в $ view-> result [$ id] -> _ field_data ['nid'] ['entity'] (таким образом избегая node_load () в каждой строке)
g10
0

Ваше решение отличное! Чтобы убедиться, что классы действительно будут добавлены в классы строк представлений, вы должны добавить

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

после

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

И функция предварительной обработки будет:

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

}

Оана Хулпой
источник