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 Realname ユーザーIDではなくニックネーム等を表示したい
ユーザ 7.44 Quickbar 会員の種別(役割)別にメニューを設けたい
SSH 7.50 ProxyCommand SSH IP制限を1コマンドで通過する
Proxy 7.59 Proxy Apache settings.php リバースプロキシ(Apache)+バックグランドWeb(Drupal 7 )でログインセッションを維持する方法
サイトの構築 7.19 Plesk Pleskでdrupal7(プライベートファイルシステム)を使う場合の注意点
コンテンツの作成 8.4x PhpSpreadsheet Excelを読み書きする方法
Database 7.34 PHP データベースクエリ(SELECT)時のSQL関数
コンテンツの作成 7.26 PHP ノード内の一部(フィールド)を変更する
ユーザの管理 7.27 PHP 新規ユーザーの追加ができない
PHP 7.22 PHP ノードに付いたコメントを好きな場所に表示する
PHP-FPM 8.9.x PHP PHP-FPM 環境で .htaccess に php_value を 書いてもダメ
JavaScript 8.5.x PHP Commerce決済モジュール設定をJavaScriptにデータに渡す方法
JavaScript 7.34 PHP PHPからJavaScriptに変数値を渡したい
ユーザ 7.23 PHP user_load_multiple()の復帰値
PHP 8.9.x PHP YamlをPHP配列にする方法
PHP 8.3x PHP drupa8でhook_init()する方法
チューニング 7.26 PHP DrupalはNginxで動く?
コンテンツの管理 7.16 PHP 好きなところにノードを埋め込みたい
アップデート 8.9.x PHP CentosでPHPのバージョンアップ(例:5.3->5.6)を行う方法
ユーザの管理 7.50 Paypal continued billing drupal7のPaypal継続課金モジュールについて

ページ