Tự động thêm một lớp CSS vào một hàng xem với template.php


8

Tôi thực sự đã chạm đến đáy của Google khi cố gắng tìm ra cách thêm một lớp css vào mỗi hàng của một khung nhìn. Thủ thuật là tôi cần lớp cho mỗi hàng được xác định động dựa trên một số dữ liệu từ nút mà chế độ xem lấy từ đó. Hàm rút gọn gàng cho nút này là -

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

Mục đích của việc này là mã màu một sự kiện chưa có đủ người đăng ký. Sẽ có một danh sách các sự kiện trên trang nhất và tôi cũng cần chúng được mã hóa màu. Tôi thực sự hy vọng có một số giải pháp đơn giản dọc theo dòng -

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

Chỉ cần thả <?php print $event_class ?>vào xem .tpl không làm điều đó.


Nó có thể không được coi là thực hành tốt (đưa logic php vào một tpl) nhưng còn việc đưa nó trực tiếp vào hàng tpl thì sao?
tostinni

1
đó không phải là một lớp CSS, đó là HTML. Và nó được coi là ngữ nghĩa. Hãy thử sử dụng các lớp có ý nghĩa và để lại màu đỏ / xanh cho CSS.
Capi Etheriel

Câu trả lời:


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

Không biết nó có đẹp không. Không biết làm thế nào nó thực hiện. Nhưng nó đã có tác dụng.

EDIT (02-01-2012): sau khi làm việc với Drupal thêm một năm nữa, tôi đã cố gắng tìm một số cách khác để làm điều này ngoài việc chạy node_load()trên mỗi hàng của chế độ xem.


5
lưu ý: trong phương thức template_pre process_view_view, bạn có thể truy cập dữ liệu nút / thực thể tại $ view-> result [$ id] -> _ field_data ['nid'] ['entity'] (do đó tránh được node_load () trên mỗi hàng)
g10

0

giải pháp của bạn là tuyệt vời! Để đảm bảo rằng các lớp sẽ thực sự được thêm vào các lớp hàng xem, bạn nên thêm

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

sau

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

Và chức năng tiền xử lý sẽ là:

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

}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.