ビューのレンダリング前にフィルターの値を変更し、出力を変更するにはどうすればよいですか?


15

Drupal 7とViews 3を使用する場合、Viewsフィルター値を変更して、レンダリングされるコンテンツに影響を与える正しい方法は何ですか?

ここで言及したすべてをD6で試しました。

少数の人々がそれを機能させたにもかかわらず、Merlinはdisplay_optionsを変更することがこれを達成するための間違った方法であると述べていますが、彼は何をすべきかについての彼の応答があいまいです(http://drupal.org/node/789710#comment- 2927556)。

私が試してみました:

function pages_views_pre_view($view){
    $view = views_get_view('north_carolina');
    $view->set_display('default');

    $view->display_handler->options['filters']['province']['value'] = 'Georgia';
    dsm($view->display_handler->options['filters']['province']);
}

ノート:

1)north_carolinaページとブロック(page_1とblock_1)の2種類のディスプレイを持つビューを作成しました。

2)ディスプレイ間でフィルターが同じであるため、すべてのフィルターに影響するように「デフォルト」ディスプレイを変更しようとしています。

3)私のフィルターのデフォルト値は「ノースカロライナ」です(これはViews UIで設定します)が、「Georgia」に変更しようとしていることに注意してください

4)直後にDSMを実行すると、フィルターが変更されたことがわかりますが、結果には「ノースカロライナ」の結果が表示されます。キャッシュはオフになっていますが、drush cc allを実行した後も同じ結果が得られます。

また、同じコードをhook_views_pre_buildとで実行しようとしましたhook_views_pre_execute

助言がありますか?

編集:

示唆されているように、追加情報が役立つ場合があります。ビューのダンプは次のとおりです。

$view = new view();
$view->name = 'north_carolina';
$view->description = '';
$view->tag = 'default';
$view->base_table = 'node';
$view->human_name = 'North Carolina';
$view->core = 7;
$view->api_version = '3.0';
$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */

/* Display: Master */
$handler = $view->new_display('default', 'Master', 'default');
$handler->display->display_options['title'] = 'test nc block';
$handler->display->display_options['use_more_always'] = FALSE;
$handler->display->display_options['access']['type'] = 'perm';
$handler->display->display_options['cache']['type'] = 'none';
$handler->display->display_options['query']['type'] = 'views_query';
$handler->display->display_options['exposed_form']['type'] = 'basic';
$handler->display->display_options['pager']['type'] = 'full';
$handler->display->display_options['style_plugin'] = 'default';
$handler->display->display_options['row_plugin'] = 'fields';
/* Field: Content: Title */
$handler->display->display_options['fields']['title']['id'] = 'title';
$handler->display->display_options['fields']['title']['table'] = 'node';
$handler->display->display_options['fields']['title']['field'] = 'title';
$handler->display->display_options['fields']['title']['label'] = '';
$handler->display->display_options['fields']['title']['alter']['word_boundary'] = FALSE;
$handler->display->display_options['fields']['title']['alter']['ellipsis'] = FALSE;
/* Sort criterion: Content: Post date */
$handler->display->display_options['sorts']['created']['id'] = 'created';
$handler->display->display_options['sorts']['created']['table'] = 'node';
$handler->display->display_options['sorts']['created']['field'] = 'created';
$handler->display->display_options['sorts']['created']['order'] = 'DESC';
/* Filter criterion: Content: Published */
$handler->display->display_options['filters']['status']['id'] = 'status';
$handler->display->display_options['filters']['status']['table'] = 'node';
$handler->display->display_options['filters']['status']['field'] = 'status';
$handler->display->display_options['filters']['status']['value'] = 1;
$handler->display->display_options['filters']['status']['group'] = 1;
$handler->display->display_options['filters']['status']['expose']['operator'] = FALSE;
/* Filter criterion: Location: Province */
$handler->display->display_options['filters']['province']['id'] = 'province';
$handler->display->display_options['filters']['province']['table'] = 'location';
$handler->display->display_options['filters']['province']['field'] = 'province';
$handler->display->display_options['filters']['province']['value'] = 'North Carolina';
$handler->display->display_options['filters']['province']['exposed'] = TRUE;
$handler->display->display_options['filters']['province']['expose']['operator_id'] = 'province_op';
$handler->display->display_options['filters']['province']['expose']['label'] = 'State';
$handler->display->display_options['filters']['province']['expose']['operator'] = 'province_op';
$handler->display->display_options['filters']['province']['expose']['identifier'] = 'province';
$handler->display->display_options['filters']['province']['expose']['remember_roles'] = array(
  2 => '2',
  1 => 0,
  3 => 0,
  4 => 0,
);

/* Display: Block */
$handler = $view->new_display('block', 'Block', 'block_1');
$handler->display->display_options['block_description'] = 'test nc block';

これらのハンドラーは、ロケーションモジュールによって提供されることに注意してください。特に「Location:Province」フィルターの場合、オートコンプリートフォームが提供されます。ノースカロライナ州で入力すると、ポップアップが表示され、それを選択する必要があります。ただし、ビューが生成するSQLステートメントでは、状態に2文字の略語が使用されていることに注意してください。

SELECT node.title AS node_title, node.nid AS nid, node.created AS node_created
FROM 
{node} node
LEFT JOIN {location_instance} location_instance ON node.vid = location_instance.vid
LEFT JOIN {location} location ON location_instance.lid = location.lid
WHERE (( (node.status = '1') AND (location.province = 'NC') ))
ORDER BY node_created DESC
LIMIT 10 OFFSET 0

回答:


8

変更するビューオブジェクトの正確な部分を把握するのは難しい場合があります。通常、最初にビューをエクスポートし、生​​成されたコードを見て開始します。

以下のスニペットは変更されておらず、実稼働サイトの1つで期待どおりに機能しています。うまくいけば、正しい方向に向かえるのに十分です(明らかに、これはという名前のカスタムモジュールにありますoffer_select)。エクスポートされたビューからコードを提供できる場合、誰かが見てみることができます。

//Alter the End date filter on the offer views
function offer_select_views_pre_view(&$view) {
  if ($view->name == 'active_offers') {
    $view->display['default']->handler->options['filters']['field_end_value']['value']['value'] = time();
  }
}

--UPDATE--
特定のビューについて、Locationモジュールをインストールし、NCにいくつかのノードを作成し、ジョージアにいくつかのノードを作成して、ビューをインポートしてテストしました。カスタムモジュール(名前付きdev)で、次のコード(develをインストール済み)から始めました。

function dev_views_pre_view(&$view) {
  if ($view->name == 'north_carolina') {
    dpm($view->display['default']->handler->options['filters']);
  }
}

そこから、私はここに着くまでkrumoに表示されている明白な値を配列に追加し続けました。

function dev_views_pre_view(&$view) {
  if ($view->name == 'north_carolina') {
    dpm($view->display['default']->handler->options['filters']['province']['value']);
  }
}

これは単にNorth Carolinaクルモで印刷されました。その時点で、値の出力から次のような設定に変更しました。

function dev_views_pre_view(&$view) {
  if ($view->name == 'north_carolina') {
    $view->display['default']->handler->options['filters']['province']['value'] = 'Georgia';
  }
}

そして出来上がり。それはトリックをしました。


涼しい。機会があれば、あなたの意見をいじり、より具体的な答えを思いつくかどうかを確認します。
アダムバルサム

@ blue928上記を参照してください。私はあなたの質問に固有の回答と、私がそこにたどり着くまでの一般的な指示で回答を更新しました。
アダムバルサム

うまくいきました。正解に関する注意:私の問題の一部は、views_get_viewを呼び出したり、表示を設定したりする必要がなかったことです。
blue928

2

D8で同じソリューションを検索中に誰かがこのスレッドをポップアップした場合(私がしたように):

新しいAPIを使用すると、これらのパラメーターをより明確に操作できます。リファレンスについては、このセクションを参照してください。

小さな例

function dev_views_pre_view(ViewExecutable &$view, $display_id, array &$args) {
  if ($display_id === 'my_unique_display_name') {
      $args[0] = 'desired_value';
  }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.