Sử dụng hook_form_alter trên các bộ lọc chế độ xem được hiển thị trên Drupal 7


12

Tôi gặp một số rắc rối khi sử dụng hook_form_alter()với Chế độ xem 3 và Drupal 7.

Tôi không thể thêm câu lệnh if để xác định duy nhất một khung nhìn; bất cứ điều gì tôi đưa vào, câu lệnh if không bao giờ được tìm thấy là đúng. Tuy nhiên, tôi có thể dễ dàng sử dụng form_id bằng cách sử dụng sau đây vì vậy tôi không chắc mình sẽ sai ở đâu!

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

Làm cách nào để sử dụng hook_form_alter()để thay đổi duy nhất một chế độ xem của tôi?

Câu trả lời:


25

Bạn có thể có quyền truy cập vào đối tượng xem trong hook_form_alter bằng cách truy cập $form_state['view']. Điều đó cho phép bạn xác định một chế độ xem cụ thể:

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

đây là một giải pháp tốt hơn kể từ $ form_id là không đủ cho các hình thức tiếp xúc (không giống như cách khác câu trả lời nhà nước), current_display unfortunetly có thể không đủ là một số tình huống với bộ phức tạp của quan điểm trên cùng một trang
Rotari Radu

Đồng ý - đây là giải pháp được nhắm mục tiêu nhiều hơn. Rất hữu ích nếu bạn đang sử dụng nhiều dạng xem bộ lọc.
Hiền nhân

Sử dụng drupal_set_message ($ view-> name); & drupal_set_message ($ view-> current_display); để có được tên của bạn. Tôi hơi bối rối khi nghĩ đó là "lượt xem", nhưng đó chỉ là "thỏa thuận" trong trường hợp của tôi.
Collins

Làm thế nào chúng ta có thể làm điều tương tự Drupal 8?
Sharique

Tốt hơn để sử dụng mymodule_form_views_exposed_form_alter() thay vì mymodule_form_alter, sau đó bạn có thể bỏ qua kiểm tra cho $form_id.
Berend de Boer

18

Những gì tôi sẽ làm là lùi lại một bước và xem bạn thậm chí có đăng ký móc này không. Thường $form_idlà sự thay đổi.

Quá trình gỡ lỗi:

  • Bật phát
  • Chèn dsm ($ form_id) vào trong hook của bạn như bạn đã sử dụng với D6
  • Xóa bộ nhớ ẩn của bạn đi

Mã ví dụ (bên trong mymodule.modulehoặc template.phptệp) từ 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);
  }
}
?>

Bạn sẽ thấy một loạt các id của biểu mẫu được in ra sau đó chọn móc biểu mẫu hiển thị của bạn và làm việc từ đó.

Ngoài ra, với drupal 7, bạn có thể nhắm mục tiêu các biểu mẫu cụ thể bằng ID trực tiếp .

Thí dụ:

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

Lưu ý rằng nếu bạn đang sử dụng nhiều biểu mẫu được hiển thị, bạn có thể kiểm tra chế độ xem cụ thể bằng cách kiểm tra $ form ['# id'] trong chức năng thay đổi biểu mẫu.

Cuối cùng, nếu điều đó không hiệu quả, tôi khuyên bạn nên xem lại hàng đợi vấn đề này: Cách thay đổi bộ lọc trong bộ lọc tiếp xúc với máng form_alter hook


2

Gần đây tôi cũng gặp vấn đề này, nhưng tôi đang sử dụng mô-đun tính năng thay vì tùy chỉnh. Điều này đã giúp tôi giải quyết vấn đề.

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

Và sau đó, bạn có thể sử dụng hook_form_view_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(),
    );
  }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.