回答:
にアクセスすることで、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
}
}
}
mymodule_form_views_exposed_form_alter()
代わりに使用する方がよいmymodule_form_alter
場合は、のチェックをスキップできます$form_id
。
私がやることは、一歩下がって、このフックを登録しているかどうかを確認することです。しばしば$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フックから変更する方法
最近、私もこの問題にぶつかりましたが、カスタムモジュールではなく機能モジュールを使用しています。これは私が問題を解決するのに役立ちました。
/**
* 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(),
);
}
}