Використання гачок_форма_алтер у фільтрах відкритого виду на Drupal 7


12

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

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

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

Як я можу hook_form_alter()однозначно змінити один погляд на моє?

Відповіді:


25

Ви можете отримати доступ до об’єкта перегляду в межах кука_форма_алтера, отримавши доступ $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 недостатньо для оголених форм (на відміну від того, як інші відповіді), на жаль, поточного_дисплея, можливо, недостатньо, є деякі ситуації зі складними наборами поглядів на одній сторінці
Rotari Radu

Погоджено - це більш цілеспрямоване рішення. Дуже корисно, якщо ви використовуєте кілька переглянутих форм фільтрів.
Мудрець

Використовуйте drupal_set_message ($ view-> ім'я); & 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 ви можете безпосередньо націлювати конкретні форми за ідентифікатором .

Приклад:

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

І тоді ви можете використовувати вашу гачку_форма_візування_експорту_форма_алтер ():

/**
 * 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(),
    );
  }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.