it-swarm-vi.com

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

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. Mẹo nhỏ 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 ?> trong chế độ xem .tpl không làm điều đó.

8
JGrubb
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() on mỗi hàng xem.

10
JGrubb

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

}

0
Oana Hulpoi