Menggunakan hook_form_alter pada filter tampilan terbuka di Drupal 7


12

Saya mengalami masalah dalam menggunakan hook_form_alter()dengan Views 3 dan Drupal 7.

Saya tidak dapat menambahkan pernyataan if untuk mengidentifikasi tampilan secara unik; apa pun yang saya masukkan, pernyataan if tidak pernah terbukti benar. Namun, saya dapat dengan mudah menggunakan form_id menggunakan yang berikut ini jadi saya tidak yakin di mana saya salah!

if ($form_id == 'views_exposed_form') {
}

Bagaimana saya menggunakannya hook_form_alter()untuk secara unik mengubah satu pandangan saya?

Jawaban:


25

Anda bisa mendapatkan akses ke objek tampilan dalam hook_form_alter dengan mengakses $form_state['view']. Itu memungkinkan Anda untuk mengidentifikasi tampilan tertentu:

function mymodule_form_alter(&$form, &$form_state, $form_id) {
    if ($form_id == 'views_exposed_form') {
        $view = $form_state['view'];
        if ($view->name == 'my_view_machine_name' && $view->current_display == 'display_name') {
            // alter your exposed form here
        }
    }
}

ini adalah solusi yang lebih baik karena $ form_id tidak cukup untuk formulir yang terbuka (tidak seperti cara jawaban lainnya), sayangnya current_display mungkin tidak cukup adalah beberapa situasi dengan rangkaian tampilan kompleks pada halaman yang sama
Rotari Radu

Setuju - ini adalah solusi yang lebih tepat sasaran. Sangat berguna jika Anda menggunakan beberapa bentuk filter tampilan terpapar.
Sage

Gunakan drupal_set_message ($ view-> name); & drupal_set_message ($ view-> current_display); untuk mendapatkan nama Anda. Saya sedikit bingung berpikir itu adalah "views_deals", tapi itu hanya "transaksi" dalam kasus saya.
Collins

Bagaimana kita bisa melakukan hal yang sama Drupal 8?
Sharique

Lebih baik digunakan mymodule_form_views_exposed_form_alter() daripada mymodule_form_alter, Anda kemudian dapat melewati pemeriksaan $form_id.
Berend de Boer

18

Apa yang akan saya lakukan adalah mengambil langkah mundur dan melihat apakah Anda bahkan mendaftarkan hook ini. Seringkali $form_idberubah.

Proses debug:

  • Aktifkan devel
  • Masukkan dsm ($ form_id) di dalam hook Anda seperti yang Anda lakukan sebelumnya dengan D6
  • Bersihkan cache Anda

Contoh kode (di dalam mymodule.moduleatau template.phpfile) dari drupal.org :

<?php
/**
 * Implements hook_form_alter().
 */
function mymodule_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'form_views_exposed_form') {
    drupal_set_message("Form ID is : " . $form_id);
  }
}
?>

Anda akan melihat banyak id formulir yang dicetak lalu pilih tampilan Anda yang terkena hook formulir dan hasilkan dari sana.

Juga, dengan drupal 7 Anda dapat menargetkan formulir tertentu dengan ID secara langsung .

Contoh:

<?php
/**
 * Implements hook_form_alter().
 */
function mymodule_form_views_exposed_form_alter(&$form, &$form_state, $form_id) {
  drupal_set_message("Form ID is : " . $form_id);
}
?>

Perhatikan bahwa jika Anda menggunakan beberapa formulir yang terbuka, Anda dapat memeriksa tampilan tertentu dengan memeriksa $ form ['# id'] pada fungsi form change.

Akhirnya, jika itu tidak berhasil, saya akan merekomendasikan untuk meninjau antrian masalah ini: Cara mengubah filter dalam bentuk filter terbuka melalui kait form_alter


2

Baru-baru ini saya juga mengalami masalah ini, tetapi saya menggunakan modul fitur alih-alih yang khusus. Ini membantu saya untuk menyelesaikan masalah.

/**
 * Implements hook_views_api_alter()
 */
function MY_FEATURE_views_api_alter(&$vars) {
  if (isset($vars['MY_FEATURE'])) {
    $vars['MY_FEATURE']['path'] = drupal_get_path('module', 'MY_FEATURE');
  }
}

Dan kemudian Anda dapat menggunakan hook_form_views_exposed_form_alter ():

/**
 * Implements hook_form_views_exposed_form_alter().
 */
function MY_FEATURE_form_views_exposed_form_alter(&$form, &$form_state) {
  if($form['#id'] == 'views-exposed-form-search-products-page') {
    $form['price'] = array(
      '#type'    => 'select',
      '#size'    => NULL,
      '#options' => _getPriceOptions(),
    );
  }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.