Viewsのパラメータを自由に追加したり、クエリを変更する方法
drupal8におけるViewsプログラミング
OTHER FAQ
| カテゴリ | Core Ver. | 関連モジュール | タイトル |
|---|---|---|---|
| タクソノミー | 7.15 | Entity_Trarnslation Taxonomy | TaxonomyのEntity Translation |
| 言語 | 7.15 | Entity Translation | nodeのEntity Translation |
| 言語 | 6.x | i18n | 多言語対応サイトのサイト名やスローガン/ミッションなどを多言語化する方法を教えてください |
| 言語 | 6.22 | URLエイリアスを使った場合に、翻訳したページで同じURLエイリアスが使えないという不具合 | |
| サイトの環境設定 | 7.15 | Secure Pages | Secure Pagesが急に機能しなくなった |
| 見栄え | 7.15 | js Injector | 簡単にJavascriptを追加する方法は? |
| ダウンロード | 6.x | Views Bonus Pack | Viewsで表示した内容をCSVダウンロード |
| サイトの環境設定 | 7.15 | トップ(ホーム)ページを変更するには? | |
| ユーザの管理 | 7.15 | Devel | 簡単に指定ユーザにログインしなおす方法 |
| コンテンツの作成 | 7.15 | Darty Form | 編集ページでの操作ミス |
| コンテンツの管理 | 7.15 | Views Bulk Operation | 標準のコンテンツ編集/ユーザ一覧ページが物足りません |
| 権限 | 7.15 | Path_Access Content_Access | 特定のページ(パス)をアクセス制限したい |
| フォーム | 7.15 | DefaultTextForNode | 新しいページの作成方法を一から教えてください |
| コンテンツの管理 | 7.15 | Pagenation | 一つの長いページをBookなどのように連続して読ませることはできますか? |
| コンテンツの作成 | 7.15 | Mailhandler | メールを通じてnodeの投稿をするには |
| コンテンツの作成 | 6.x | Insert Block | ブロックの内容を本文中に表示するには? |
| タクソノミー | 7.15 | Taxonomy manager | タームを他のボキャブラリ配下に移動したい |
| タクソノミー | 7.15 | Hirarchical Select | タクソノミー(ターム)の選択を楽にできないでしょうか |
| タクソノミー | 7.15 | Taxonomy manager | タクソノミーを効率よく管理したい |
| ブロック | 7.15 | Views | ひとつのViewsをページやブックページ中で再利用する方法は? |
コメント
■ 関連API
パーマリンク Submitted by actbrain on 2018/05/02 11:45.
■ 関連API
検索フォームを変更する
検索フォーム入力値を変更する
Viewsのクエリを加工する
最終的なクエリを変更する
■ 例
プルダウンをチェックボックスに変更する
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); } }ページ