Dynamisches Hinzufügen einer CSS-Klasse zu einer Ansichtszeile mit template.php

8

Ich habe tatsächlich den unteren Rand von Google erreicht und versucht herauszufinden, wie jeder Zeile einer Ansicht eine CSS-Klasse hinzugefügt werden kann. Der Trick besteht darin, dass die Klasse für jede Zeile dynamisch anhand einiger Daten vom Knoten bestimmt werden muss, von dem die Ansicht stammt. Die Funktion, die dies für den Knoten sauber macht, ist -

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

Der Punkt dabei ist, ein Ereignis farblich zu kennzeichnen, bei dem sich nicht genügend Leute angemeldet haben. Auf der Titelseite wird eine Liste der Ereignisse angezeigt, die auch farblich gekennzeichnet sein müssen. Ich hoffe wirklich, dass es eine einfache Lösung in der Art von -

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

Nur <?php print $event_class ?>in die Ansicht .tpl fallen zu lassen, reicht nicht aus.

JGrubb
quelle
Es kann nicht als gute Praxis angesehen werden (PHP-Logik in ein tpl einfügen), aber wie wäre es, dies direkt in die Zeile tpl zu setzen?
Tostinni
1
Das ist keine CSS-Klasse, das ist HTML. Und es soll semantisch sein. Versuchen Sie, aussagekräftige Klassen zu verwenden und Rot / Grün für das CSS zu belassen.
Capi Etheriel

Antworten:

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

Ich weiß nicht, ob es hübsch ist. Ich weiß nicht, wie es funktioniert. Aber es funktioniert.

BEARBEITEN (02-01-2012): Nachdem ich nun ein weiteres Jahr mit Drupal zusammengearbeitet habe, hätte ich versucht, einen anderen Weg zu finden, als dies in node_load()jeder Zeile der Ansicht zu tun .

JGrubb
quelle
5
Hinweis: In der Methode template_preprocess_views_view können Sie unter $ view-> result [$ id] -> _ field_data ['nid'] ['entity'] auf die Knoten- / Entitätsdaten zugreifen (wodurch node_load () in jeder Zeile vermieden wird)
g10
0

Ihre Lösung ist großartig! Um sicherzustellen, dass die Klassen wirklich zu den Ansichtszeilenklassen hinzugefügt werden, sollten Sie sie hinzufügen

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

nach

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

Und die Vorverarbeitungsfunktion wird sein:

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
quelle