drupal8におけるViewsプログラミング

カテゴリ Viewsプログラミング コアバージョン 8.4x 関連モジュール Views

Viewsのパラメータを自由に追加したり、クエリを変更する方法

コメント

ユーザー actbrain の写真

■ 関連API

検索フォームを変更する

function MODULE_NAME_form_views_exposed_form_alter(&$form, FormStateInterface $form_state, $form_id);

検索フォーム入力値を変更する

function MODULE_NAME_views_pre_view(ViewExecutable $view, $display_id, array &$args);

Viewsのクエリを加工する

function MODULE_NAME_views_query_alter(ViewExecutable $view, QueryPluginBase $query);

最終的なクエリを変更する

function MODULE_NAME_query_alter(\Drupal\Core\Database\Query\AlterableInterface $query);

■ 例

プルダウンをチェックボックスに変更する

function MODULE_NAME_form_views_exposed_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  $form[FIELD_NAME]['#type'] = 'checkboxes';
}

空白区切りのtextフィールドを改行区切りのtextareaにする

function MODULE_NAME_form_views_exposed_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  $form[FIELD_NAME]['#type'] = 'textarea';
  $form[FIELD_NAME]['#rows'] = 5;
}
function MODULE_NAME_views_pre_view(ViewExecutable $view, $display_id, array &$args) {
  $_SESSION[MODULE_NAME][ANY_NAME][FIELD_NAME] = $_REQUEST[FIELD_NAME];
  unset($_GET[FIELD_NAME], $_POST[FIELD_NAME], $_REQUEST[FIELD_NAME]);
}
function MODULE_NAME_query_alter(\Drupal\Core\Database\Query\AlterableInterface $query){
  // フィールド内ORの場合
  if ($view->id() == MY_VIEW) {
    $or = new Condition('OR');
    foreach ($_SESSION[MODULE_NAME][ANY_NAME][FIELD_NAME] as $val) {
      $or->condition('node__FIELD_NAME_value', $val);
    }
    $query->addWhere($whereGroup++, $or);
  }
}

hook_views_query_alter()では完結できないクエリ補整を行う

function MODULE_NAME_query_alter(\Drupal\Core\Database\Query\AlterableInterface $query){
  if ($view->id() == MY_VIEW) {
    $query->addTag('this_is_my_views_query');
}
function MODULE_NAME_query_alter(\Drupal\Core\Database\Query\AlterableInterface $query) {
  if ($query->hasTag('this_is_my_views_query')) {
    $tables =& $query->getTables();
    foreach ($tables[ALIAS]['arguments'] as &$value) {
      if ($value == THIS) {
        $value = VALUE;
      }
    }
  }
}

クエリ情報を保存しておいてあとで使う

function MODULE_NAME_query_alter(\Drupal\Core\Database\Query\AlterableInterface $query){
  $q = $query->query();
  $_SESSION[MODULE_NAME][ANY] = [
    'string' => $q->__toString(),
    'arguments' => $q->arguments(),
  ];
}
〜
  $p = $_SESSION[MODULE_NAME][ANY];
  $result = \Drupal::database()->query($p['string'], $p['arguments']);
〜

フォームを持たないViewsに場合に応じて条件を付ける

function MODULE_NAME_query_alter(\Drupal\Core\Database\Query\AlterableInterface $query){
  if ($view->id() == MY_VIEW) {
    $whereGroup = 2;
    $and = new Condition('AND');
    $and->condition(
      "watchdog.timestamp",
      \Drupal::configFactory()->getEditable('image_manager.setting')->get('log_error_mailed_datetime'),
      '>');
    $query->addWhere($whereGroup++, $and);
  }
}

ページ

OTHER FAQ

Drupal開発・運用の疑問/質問の答えはここに

無料ユーザー登録すると質問できます。

カテゴリ降順で並び替える Core Ver. 関連モジュール タイトル
サイトの構築 7.38 Content Template ページテンプレートが反映されません。
サイトの構築 7.59 Drupal.ajax drupal 7 で Uncaught TypeError: Drupal.ajax is undefined となったときの対応方法
サイトの構築 7.22 Views フィールドセットの伸縮をノンプログラミングでやりたい
サイトの構築 7.41 Rules Paygent モジュールについて
サイトの構築 7.34 ECK Entityの使い方について
サイトの構築 7.31 Views ブロックViewsの絞り込みが表示されない
サイトの環境設定 7.23 Pathauto 自動生成されるURLエイリアスがおかしい
サイトの環境設定 7.38 Views Bulk Operation VBO(Views Bulk Operation)で指定したアクションが表示されない
サイトの環境設定 7.59 さくらのレンタルサーバー php Options さくらのレンタルサーバーで パブリック/プライベートディレクトリにファイルが書き込まれないとき
サイトの環境設定 7.23 Image Style 画像スタイルの使い方(Crop)
サイトの環境設定 8.9.x 編集
サイトの環境設定 7.15 Secure Pages Secure Pagesが急に機能しなくなった
サイトの環境設定 7.15 トップ(ホーム)ページを変更するには?
サイトの環境設定 8.6.x Simhony Yaml yamlファイルを読み込む方法
サイト情報 8.9.x api Drupal::request() メモ
サイト情報 8.4x JavaScript JavaScriptに変数を渡す方法
タクソノミー 7.15 Entity_Trarnslation Taxonomy TaxonomyのEntity Translation
タクソノミー 7.15 Taxonomy manager タームを他のボキャブラリ配下に移動したい
タクソノミー 7.15 Taxonomy manager タクソノミーを効率よく管理したい
タクソノミー 7.15 Hirarchical Select タクソノミー(ターム)の選択を楽にできないでしょうか

ページ