Bagaimana saya bisa mengubah nilai filter dan hasilnya diubah sebelum tampilan dirender?

15

Saat menggunakan Drupal 7 dan Views 3, apa cara yang benar untuk mengubah nilai filter Views sehingga mempengaruhi konten yang baru saja akan dirender?

Saya mencoba semua yang disebutkan sini untuk D6.

Meskipun beberapa orang berhasil, Merlin menyatakan bahwa memodifikasi display_options adalah cara yang salah untuk mencapai ini, tetapi dia tidak jelas dalam tanggapannya mengenai apa yang harus dilakukan ( http://drupal.org/node/789710#comment- 2927556 ).

Saya telah mencoba:

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']);
}

Catatan:

1) Saya memiliki pandangan yang dibuat bernama north_carolina yang memiliki dua jenis tampilan - halaman dan blok (halaman_1 dan blok_1).

2) filter saya sama di seluruh pajangan saya jadi saya mencoba mengubah tampilan 'default' sehingga memengaruhi semuanya.

3) Nilai default dari filter saya adalah 'North Carolina' (yang saya atur di UI Views) tetapi perhatikan saya mencoba mengubahnya menjadi 'Georgia'

4) Jika saya menjalankan DSM segera setelah itu, saya melihat bahwa filter telah diubah, namun, hasil saya masih menunjukkan hasil 'North Carolina'. Caching dimatikan, dan saya masih mendapatkan hal yang sama setelah menjalankan cc drush semua.

Saya juga mencoba menjalankan kode yang sama melalui hook_views_pre_builddan hook_views_pre_execute.

Ada saran?

EDIT:

Seperti yang disarankan itu mungkin membantu untuk memiliki informasi tambahan. Berikut ini adalah dump view:

$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';

Perhatikan bahwa penangan ini disediakan oleh modul lokasi. Khusus untuk filter "Lokasi: Provinsi" saya diberikan formulir lengkapi otomatis. Ketika saya mengetik di North Carolina, itu muncul, dan saya harus memilih itu. Namun, pemberitahuan dalam pernyataan SQL yang dilihatnya menghasilkan menggunakan singkatan dua karakter untuk status:

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
blue928
sumber

Jawaban:

8

Mungkin sulit untuk mengetahui bagian yang tepat dari objek tampilan untuk dimodifikasi. Saya biasanya mengekspor tampilan terlebih dahulu dan melihat kode yang dihasilkan untuk memulai.

Cuplikan di bawah ini tidak dimodifikasi dan berfungsi seperti yang diharapkan di salah satu lokasi produksi saya. Mudah-mudahan itu cukup untuk membuat Anda menuju ke arah yang benar (jelas, ini dalam modul khusus bernama offer_select). Jika Anda dapat memberikan kode dari tampilan yang diekspor, seseorang mungkin dapat melihatnya.

//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--
Untuk tampilan spesifik Anda, saya memasang modul Lokasi dan membuat beberapa node di NC dan beberapa di Georgia dan mengimpor tampilan Anda untuk diuji. Dalam modul khusus saya (bernama dev) saya mulai dengan kode ini (dengan devel diinstal):

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

Dari sana, saya terus menambahkan nilai-nilai jelas yang ditampilkan di krumo ke array sampai saya tiba di sini:

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

Yang hanya dicetak North Carolinadi Krumo. Pada saat itu saya berubah dari mencetak nilai ke pengaturan seperti ini:

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

Dan voila. Itu berhasil.

Adam Balsam
sumber
Keren. Ketika saya memiliki kesempatan, saya akan bermain-main dengan pandangan Anda dan melihat apakah saya dapat menemukan jawaban yang lebih konkret.
Adam Balsam
@ blue928 lihat di atas. Saya telah memperbarui jawaban saya dengan jawaban khusus untuk pertanyaan Anda dan instruksi umum tentang bagaimana saya sampai di sana.
Adam Balsam
itu bekerja dengan baik. Catatan tentang jawaban yang benar: Bagian dari masalah saya adalah bahwa saya tidak perlu memanggil views_get_view atau mengatur tampilan.
blue928
2

Jika seseorang memiliki utas ini muncul saat mencari solusi yang sama pada D8 (seperti yang saya lakukan):

API baru memungkinkan untuk memanipulasi parameter ini dengan cara yang jauh lebih jelas. Lihat bagian ini untuk referensi.

Contoh kecil

function dev_views_pre_view(ViewExecutable &$view, $display_id, array &$args) {
  if ($display_id === 'my_unique_display_name') {
      $args[0] = 'desired_value';
  }
}
Der Zinger
sumber