web-dev-qa-db-ja.com

D7:作成日が14日未満の場合にクラスをリストアイテムに追加する

Drupal 7とビューを使用して、現在、コンテンツタイプ「ニュース」のティーザー5個のリストを生成するビューがあります。ティーザー5個はハードルールです。条件付きでフォーマットしたい「作成日」が14日未満の場合は、CSSスタイルで「新規」としてスタイルを設定できるように行を追加します。したがって、「新規」行が3つある場合、残りの2つはマークされていない行です。

その方法は?

更新

「time ago」日付形式を使用してクラス名を入力するというアイデアがありました。ただし、「前」の形式は変更されます。残念ながら、テキストをクラスとして追加できる「日」に細分度を設定することはできません。つまり、過去2週間のdate1からdate24までです。

アップデート#2

私のジェネシスサブテーマは、プリプロセッサルーチンを無視しています。詳細はこちら こちら ただし、ルーチンをベースのtemplate.phpに追加できます。

アップデート#3

作業コードの ЕлинЙ。 に感謝します。

function genesis_preprocess_views_view_list(&$variables) {
  $view = $variables['view'];
  if ($view->name == 'recent_news_widget') {
    foreach ($view->result as $key => $result) {
      if (time() - strtotime($result->node_created_day) < 14 * 24 * 60 * 60) {
        $variables['classes'][$key][] = 'new';
        $variables['classes_array'][$key] = isset($variables['classes'][$key]) ? implode(' ', $variables['classes'][$key]) : '';
      }
    }
  }
}

オフラインのディスカッションでは、 ЕлинЙ。 がこれが機能する理由を説明しています。 「views theme.incを調べたところ、classes配列が 'classes_array'と呼ばれる別の変数にフラット化されていることがわかりました。この配列にも新しいクラスを追加するために、それを行う必要があります。

6
Screenack

これは、作成したビューのプリプロセッサ関数を使用して行うことができます。ビューを前処理して、各行のノードの作成日を確認し、関連するクラスを指定する必要があります。

ビューのマシン名がrecent_news_widgetであるとすると、表示形式はHTMLリストであり、テーマ名はgenesisです。 /sites/all/themes/genesis/template.php filetemplate_preprocess_views_view_list() 関数を使用する必要があります

genesis_preprocess_views_view_list(&$variables) {
  $view = $variables['view'];
  if ($view->name == 'recent_news_widget') {
    // dpm($view);
    // Here comes your logic
  }
}

上記のコードでは、2行がコメント化されています。 1つ目は、開発者が特定の配列/オブジェクト/文字列などをブラウズ可能なスタイルで出力するのに役立つ関数です。この関数には Devel モジュールが付属しています。これをインストールすることを強くお勧めします。

変数を参照すると、結果がリストされている場所と、行のクラスが割り当てられている場所が見つかるはずです。ノードの「作成日」など、新しいクラスを割り当てるためのロジックを構築するために必要なすべての値が見つかるまで、変数を参照する必要があります。必要なすべての変数を取得したら、結果をループして、作成日を確認し、関連するクラスを追加できます。

更新:HTMLリスト以外の表示タイプの前処理関数:

グリッド:template_preprocess_views_view_grid()テーブル:template_preprocess_views_view_table()書式なし:template_preprocess_views_view_unformatted()

更新#2(チャットに関する議論と質問に対する更新に従って):更新#3のコードは正しい方向にありましたが、いくつかの間違いがありました。修正されたバージョンは次のようになります。

function genesis_preprocess_views_view_list(&$variables) {
  $view = $variables['view'];
  if ($view->name == 'recent_news_widget') {
    foreach ($view->result as $key => $result) {
      if (time() - strtotime($result->node_created_day) < 14 * 24 * 60 * 60) {
        $variables['classes'][$key][] = 'new';
        $variables['classes_array'][$key] = isset($variables['classes'][$key]) ? implode(' ', $variables['classes'][$key]) : '';
      }
    }
  }
}

コードの2つの間違いは次のとおりです。

  1. 引数を&$ variablesとして関数に渡しましたが、$ varsを使用してクラスを割り当てました。$ varsは関数で定義されていないため、クラスは追加されませんでした。

  2. 結果のキー番号を使用したかったのですが、foreachでは値のみをループし、$result変数はオブジェクトです。上記のコードの修正バージョンでは、ループを定義して$key => $resultを使用し、キー番号にもアクセスできるようにしました。

更新#3クラスを平坦化する新しい行をclasses_arrayに追加しました。

4
Елин Й.

これがあなたを助けることを願っています!!

クラスを行に追加する必要があるため、デフォルトのビューテンプレートファイルをオーバーライドすることで達成できます。

次の手順でこれを達成できます

  • ビューを開き、詳細タブ + その他カテゴリに移動すると、テーマ-情報クリック情報リンクを表示できます。

    enter image description here

  • 要件に従って、行スタイルをオーバーライドする必要があります。 Rowスタイルの出力が表示されます。デフォルトのテンプレートファイルはviews-view-fields.tpl.phpで、強調表示されています。このテンプレートファイルが現在アクティブであることを意味します。また、tplsのリストが表示されるので、tpl名のいずれかを選択(たとえば、views-view-fields--comments-recent.tpl.phpまたはviews-view- fields--comments-recent--page.tpl.php)新しいテンプレートファイルの場合。

    enter image description here

  • このテンプレートファイルを上書きする必要があるため、VIEWSモジュール+ THEMEフォルダーに移動して、上書きするtplファイルを取得します(ここでは、views-view-fields.tpl.php)。

    enter image description here

  • テンプレートファイルをテーマテンプレートフォルダー(sites/themes/your_theme/templates /)にコピーして貼り付け、名前をchoose template nameに変更します

  • テンプレートファイルの再スキャンをクリックして、新しいテンプレートファイルをアクティブにします。

    enter image description here

    • いいえ、テンプレートファイルを変更してクラスを追加することはできません。
3
inizio
function genesis_preprocess_views_view_list(&$vars) {
  $view = $vars['view'];
  $rows = $vars['rows'];

  if ($view->name == 'recent_news_widget') {
    foreach ($rows as $id => $row) {
      $data = $view->result[$id];
      // Assumption this if condition works and node_created_day exist in row
      if (time() - strtotime($data->node_created_day) < 14 * 24 * 60 * 60) {
       // Add custom class if condition satisfies
       $vars['classes'][$id][] = 'custom-new';
      } 
    }
  }
}

また、クラス行をこの行に置き換えてみて、うまくいくかどうか教えてください。 $ vars ['row_classes'] [$ id] [] = 'custom-new';

1
junedkazi