Использование hook_form_alter в открытых фильтрах представлений в Drupal 7

12

У меня возникли проблемы с использованием hook_form_alter()с Views 3 и Drupal 7.

Я не могу добавить оператор if, чтобы однозначно идентифицировать представление; что бы я ни вставлял, утверждение if никогда не оказывается верным. Тем не менее, я могу легко использовать form_id, используя следующее, поэтому я не уверен, где я иду не так!

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

Как я могу использовать, hook_form_alter()чтобы уникально изменить один мой взгляд?

Simonk
источник

Ответы:

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
        }
    }
}
Mirroar
источник
это лучшее решение, так как $ form_id недостаточно для открытых форм (в отличие от того, как утверждают другие ответы), к сожалению, current_display может быть недостаточно в некоторых ситуациях со сложными наборами представлений на одной странице
Ротари Раду
Договорились - это более целевое решение. Очень полезно, если вы используете несколько представлений открытых форм фильтра.
Мудрец
Использовать drupal_set_message ($ view-> name); & drupal_set_message ($ view-> current_display); чтобы получить ваши имена. Я был немного смущен, думая, что это были "views_deals", но это были просто "сделки" в моем случае.
Коллинз
Как мы можем сделать то же самое Drupal 8?
Шарик
Лучше использовать mymodule_form_views_exposed_form_alter() вместо mymodule_form_alter, затем вы можете пропустить проверку $form_id.
Беренд де Бур
18

Я бы сделал шаг назад и посмотрю, регистрируешь ли ты этот хук. Часто $form_idменяются.

Процесс отладки:

  • Включите devel
  • Вставьте dsm ($ form_id) внутри крючка, как вы привыкли с D6
  • Очистить кеш

Пример кода (внутри mymodule.moduleили в template.phpфайле) с 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);
  }
}
?>

Вы увидите, как распечатывается куча идентификаторов форм, затем выберите вид, открывающий форму, и работаете оттуда.

Кроме того, с 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

chrisjlee
источник
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(),
    );
  }
}
Влад Мойсеенко
источник