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.22 Views フィールドセットの伸縮をノンプログラミングでやりたい
ユーザ 7.22 Realname ユーザーIDではなくニックネーム等を表示したい
コンテンツの作成 7.22 node Views ノードに付いたコメントに関する情報を得る
サイトの構築 7.22 Views Devel Viewsの設定ページが変に?
PHP 7.22 PHP ノードに付いたコメントを好きな場所に表示する
サイトの構築 7.19 Plesk Pleskでdrupal7(プライベートファイルシステム)を使う場合の注意点
コンテンツの管理 7.16 PHP 好きなところにノードを埋め込みたい
フォーム 7.16 Webform, Mail System, Mime Mail, Jp Mail Helper 送信メールのサブジェクトが長いと文字化けする
アップデート 7.16 Core 7.15→7.16アップデート
言語 7.15 Entity Translation 各フィールドのラベルの多言語切り替え漏れ(フィールド・ラベル)
コンテンツの作成 7.15 Mailhandler メールを通じてnodeの投稿をするには
言語 7.15 Entity Translation nodeのEntity Translation
タクソノミー 7.15 Hirarchical Select タクソノミー(ターム)の選択を楽にできないでしょうか
サイトの環境設定 7.15 Secure Pages Secure Pagesが急に機能しなくなった
言語 7.15 Language まだ翻訳されていない英語文、どうにかならない?
サイトの環境設定 7.15 トップ(ホーム)ページを変更するには?
フォーム 7.15 Webform Webformで確認画面
フォーム 7.15 Webform Webform - 確認ページの多言語化
フォーム 7.15 system mail()での送信が失敗する
コンテンツの管理 7.15 Views Bulk Operation 標準のコンテンツ編集/ユーザ一覧ページが物足りません

ページ