Drupal 7の公開ビューフィルターでhook_form_alterを使用する


12

hook_form_alter()Views 3およびDrupal 7で使用する際に問題が発生します。

ビューを一意に識別するifステートメントを追加することはできません。私が入れたものは何でも、ifステートメントが真実であるとは決してわかりません。ただし、次を使用してform_idを簡単に使用できるため、どこが間違っているのかわかりません!

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

私のhook_form_alter()単一のビューを一意に変更するにはどうすればよいですか?

回答:


25

にアクセスすることで、hook_form_alter内のビューオブジェクトにアクセスでき$form_state['view']ます。これにより、特定のビューを識別できます。

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
        }
    }
}

これは$ form_id以来、よりよい解決策は、十分ではないかもしれないunfortunetly current_displayが同じページ上のビューの複雑なセットを持ついくつかの状況である(どのように他の回答の状態とは違って)暴露フォームのために十分ではないです
Rotariラドゥを

合意-これは、よりターゲットを絞ったソリューションです。複数のビューがフィルターフォームを公開している場合に非常に便利です。
セージ

drupal_set_message($ view-> name);を使用します。&drupal_set_message($ view-> current_display); あなたの名前を取得します。「views_deals」だと思って少し混乱していましたが、私の場合は「deals」でした。
コリンズ

Drupal 8と同じことをどのように行うことができますか?
シャリケ

mymodule_form_views_exposed_form_alter() 代わりに使用する方がよいmymodule_form_alter場合は、のチェックをスキップできます$form_id
ベレンドボーア

18

私がやることは、一歩下がって、このフックを登録しているかどうかを確認することです。しばしば$form_id変更されます。

デバッグプロセス:

  • 開発をオンにする
  • D6で使用したように、フック内にdsm($ form_id)を挿入します
  • キャッシュをクリアする

drupal.orgのサンプルコード(内部mymodule.moduleまたはtemplate.phpファイル):

<?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);
  }
}
?>

多数のフォームIDが出力された後、表示されているフォームフックを選択して、そこから作業します。

また、drupal 7では、IDによって特定のフォームを直接ターゲットにできます。

例:

<?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);
}
?>

複数の公開されたフォームを使用している場合は、フォーム変更関数で$ form ['#id']を調べることで特定のビューを確認できることに注意してください。

最後に、それがうまくいかない場合は、この問題キューを確認することをお勧めします: 露出されたフィルタのフィルタをform_alterフックから変更する方法


2

最近、私もこの問題にぶつかりましたが、カスタムモジュールではなく機能モジュールを使用しています。これは私が問題を解決するのに役立ちました。

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

それから、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(),
    );
  }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.