Menambahkan kelas CSS secara dinamis ke baris tampilan dengan template.php


8

Saya sebenarnya telah mencapai bagian bawah Google mencoba mencari cara menambahkan kelas css ke setiap baris tampilan. Triknya adalah bahwa saya perlu kelas untuk setiap baris ditentukan secara dinamis berdasarkan beberapa data dari node yang menarik dari tampilan. Fungsi yang melakukan ini dengan rapi untuk node adalah -

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

Intinya adalah untuk mewarnai kode suatu acara yang belum memiliki cukup banyak orang yang mendaftar. Akan ada daftar acara di halaman depan, dan saya perlu mereka diberi kode warna juga. Saya sangat berharap ada beberapa solusi sederhana di sepanjang -

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

Hanya menjatuhkan <?php print $event_class ?>pada tampilan .tpl tidak melakukannya.


Ini mungkin tidak dianggap praktik yang baik (menempatkan logika php di tpl) tetapi bagaimana dengan menempatkan ini langsung di baris tpl?
tostinni

1
itu bukan kelas CSS, itu HTML. Dan itu seharusnya semantik. Coba gunakan kelas yang bermakna dan biarkan merah / hijau untuk CSS.
Capi Etheriel

Jawaban:


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

Tidak tahu apakah itu cantik. Tidak tahu bagaimana kinerjanya. Tapi itu berhasil.

EDIT (02-01-2012): setelah bekerja dengan Drupal selama satu tahun lagi sekarang, saya akan mencoba mencari cara lain untuk melakukan ini selain berjalan node_load()di setiap baris tampilan.


5
catatan: dalam metode template_preprocess_views_view, Anda dapat mengakses data node / entitas di $ view-> result [$ id] -> _ field_data ['nid'] ['entitas'] (dengan demikian menghindari node_load () pada setiap baris)
g10

0

solusi Anda hebat! Untuk memastikan bahwa kelas akan benar-benar ditambahkan ke kelas baris pandangan yang harus Anda tambahkan

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

setelah

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

Dan fungsi preproses akan:

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

}

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.