template.phpを使用してCSS行をビュー行に動的に追加する


8

ビューの各行にcssクラスを追加する方法を理解しようとしているGoogleの底に実際に達しました。トリックは、ビューが取得するノードからのデータの一部に基づいて動的に決定される各行のクラスが必要なことです。これをノードに対してきちんと引き離す機能は-

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をドロップするだけでは実行されません。


それは良い習慣とは考えられないかもしれません(tplにphpロジックを置く)が、これを直接行tplに置くのはどうですか?
tostinni '19年

1
これはCSSクラスではなく、HTMLです。そして、それは意味論的であることになっています。意味のあるクラスを使用して、CSSに赤/緑を残してみてください。
Capi Etheriel 2012

回答:


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

それがきれいかどうかわからない。それがどのように機能するか分からない。しかし、それは機能します。

編集(2012年2月1日):Drupalで1年間作業した後node_load()、ビューのすべての行で実行する以外に、これを実行する他の方法を見つけようとしました。


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

}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.