แบบสอบถามที่กำหนดเองใน Views?


24

ในบางจุดฉันพบว่าจำเป็นต้องแก้ไขแบบสอบถาม SQL ที่สร้างโดย Views ในที่สุดฉันก็ข้ามviews_pre_executeและเปลี่ยนแบบสอบถามสำหรับมุมมองเฉพาะนั้น

รู้สึกเหมือนแฮ็คที่น่าเกลียดสำหรับฉันและฉันสงสัยว่ามีวิธีที่สง่างามและบำรุงรักษาได้มากกว่านี้หรือไม่ อุดมคติจะเป็นวิธีที่อนุญาตให้ฉันแก้ไขคิวรีได้โดยตรงจาก Views UI


1
ขึ้นอยู่กับว่าคุณต้องการแก้ไขคิวรีนั้นอย่างไร คุณพยายามทำอะไรให้สำเร็จ
Jason Smith

@ Jason ฉันโพสต์คำถามไปที่ SO ในเวลานั้น: stackoverflow.com/questions/3147916/แต่ปัญหานั้นได้รับการแก้ไขแล้วตอนนี้ฉันแค่มองหาวิธีที่สวยงามในการปรับแต่งแบบสอบถาม Views ใด ๆ ถ้าฉันต้องการ
นักวิทยาศาสตร์บ้า

ฉันไม่มั่นใจว่าคุณไม่สามารถทำสิ่งที่คุณพยายามทำในเธรดอื่นโดยใช้มุมมอง ที่กล่าวว่ามีมากกว่าหนึ่งวิธีในการดูแลแมวตัวนี้
Jason Smith

หากคำตอบใด ๆ ด้านล่างเป็นสิ่งที่คุณกำลังมองหาคุณควรยอมรับ (คลิกที่เครื่องหมายถูกด้านล่างนับคะแนน)
Chaulky

hook_views_pre_execute อาจไม่ได้สวยที่สุด แต่มันมีที่สำหรับแทนที่การสืบค้นที่ซับซ้อน (ดูCustom Views 3 แบบสอบถามใน Drupal 7 )
mrP

คำตอบ:


25

คุณสามารถใช้hook_views_query_alter()เพื่อแก้ไขแบบสอบถามก่อนที่จะเรียกใช้ ฉันคิดว่านี่คล้ายกับhook_views_pre_executeแต่ทำให้ง่ายต่อการปรับเปลี่ยนแบบสอบถาม โดยทั่วไปคุณสามารถเข้าถึงแต่ละส่วนของแบบสอบถามผ่านอาร์เรย์ที่มีคีย์ ฉันไม่ได้พบเอกสารที่เป็นทางการมาก แต่มีตัวอย่างที่ดีงามของมันที่https://www.appnovation.com/blog/using-hook-views-query-alter นี่เป็นวิธีที่ฉันต้องใช้เพื่อแก้ไขข้อบกพร่องวันที่ในโมดูลปฏิทิน


สิ่งนี้จะทำงานกับ Views-3 ได้หรือไม่
markdorison

@markdorison ฉันเชื่ออย่างนั้น แต่ยังไม่ได้รับการยืนยัน
Chaulky

3
ฉันยืนยันว่าสิ่งนี้ใช้ได้ใน Views-3
markdorison

1
@Fabian คุณควรยอมรับคำตอบนี้ถ้ามันมีประโยชน์สำหรับคุณหรือแสดงความคิดเห็นว่าทำไมมันถึงไม่เป็นเช่นนั้นเราจึงสามารถทำให้ดีขึ้นได้
Chaulky

อีกตัวอย่างการอ้างอิงสำหรับแบบสอบถามแบบกำหนดเอง 3 มุมมองใน Drupal 7 ที่ใช้hook_views_pre_execute()ในโมดูลแบบกำหนดเองอย่างง่าย
mrP

4

โดยทั่วไปแล้วขึ้นอยู่กับกรณีการใช้งานของคุณ

หากคุณต้องการมีฟิลด์ / ตัวกรอง / อาร์กิวเมนต์ซึ่งควรทำงานในลักษณะใดวิธีหนึ่งขอแนะนำให้เขียนตัวจัดการ ดูความช่วยเหลือขั้นสูงสำหรับมุมมองสำหรับข้อมูลเพิ่มเติม

หากคุณต้องการที่จะเปลี่ยนบางส่วนของแบบสอบถามคุณยังสามารถใช้hook_views_query_alter () สิ่งที่ไม่ดีเกี่ยวกับhook_views_query_alter()คือคุณไม่สามารถใช้รหัสซ้ำอีกครั้งได้

นี่คือตัวอย่างรหัสที่แสดงจากเอกสารประกอบ มันเป็นตัวอย่างของสิ่งที่ตะขอสามารถทำได้

function mymodule_views_query_alter(&$view, &$query) {
  // (Example assuming a view with an exposed filter on node title.)
  // If the input for the title filter is a positive integer, filter against
  // node ID instead of node title.
  if ($view->name == 'my_view' && is_numeric($view->exposed_raw_input['title']) && $view->exposed_raw_input['title'] > 0) {
    // Traverse through the 'where' part of the query.
    foreach ($query->where as &$condition_group) {
      foreach ($condition_group['conditions'] as &$condition) {
        // If this is the part of the query filtering on title, chang the
        // condition to filter on node ID.
        if ($condition['field'] == 'node.title') {
          $condition = array(
            'field' => 'node.nid', 
            'value' => $view->exposed_raw_input['title'], 
            'operator' => '=',
          );
        }
      }
    }
  }
}

3

ฉันได้ใช้hook_views_query_alter()เพื่อแก้ไขแบบสอบถาม mysql มุมมอง ตัวอย่างต่อไปนี้ได้รับการทดสอบภายใต้ Drupal 7 ด้วย7.x-3.0จะเพิ่มส่วนORDER BYคำสั่งที่กำหนดเองลงในแบบสอบถาม:

 function MYTHEME_views_query_alter(&$view, &$query) {
   // check so it's the correct view
   if($view->name == 'product_view') {
     // set a custom 'ORDER BY' clause in the query
     $query->orderby[0] = array(
       'field' => 'SUBSTR(taxonomy_term_data_name,3,4)',
       'direction' => 'ASC'
     );
     $query->orderby[1] = array(
       'field' => 'SUBSTR(taxonomy_term_data_name,1,2)',
       'direction' => 'ASC'
     );
   }
 }

1

ฉันไม่รู้ว่าคุณสามารถเปลี่ยน sql ได้โดยตรงหรือไม่ แต่คุณสามารถเขียนตัวจัดการฟิลด์ของคุณเองและสร้างคิวรีของคุณเอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.