การใช้ hook_form_alter บนตัวกรองมุมมองที่เปิดเผยบน Drupal 7


12

ฉันมีปัญหาในการใช้งานhook_form_alter()กับ Views 3 และ Drupal 7

ฉันไม่สามารถเพิ่มคำสั่ง 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 ไม่เพียงพอสำหรับรูปแบบสัมผัส (ซึ่งแตกต่างจากวิธีอื่น ๆ คำตอบรัฐ) current_display unfortunetly อาจจะไม่เพียงพอเป็นสถานการณ์บางอย่างกับชุดที่ซับซ้อนของมุมมองในหน้าเดียวกัน
Rotari Radu

เห็นด้วย - นี่คือทางออกที่ตรงเป้าหมายยิ่งขึ้น มีประโยชน์มากถ้าคุณกำลังใช้ฟอร์มตัวกรองที่เปิดเผยหลายมุมมอง
Sage

ใช้ drupal_set_message ($ view-> ชื่อ); & drupal_set_message ($ view-> current_display); เพื่อรับชื่อของคุณ ฉันสับสนเล็กน้อยคิดว่ามันเป็น "views_deals" แต่มันก็เป็นแค่ "ข้อตกลง" ในกรณีของฉัน
Collins

เราจะทำสิ่งเดียวกัน Drupal 8 ได้อย่างไร
Sharique

ดีกว่าที่จะใช้mymodule_form_views_exposed_form_alter() แทนแล้วคุณสามารถข้ามกาเครื่องหมายสำหรับmymodule_form_alter $form_id
Berend de Boer

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 hook


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.