LIKE clause ไม่ทำงานในการเปลี่ยนแปลงการสืบค้น hook


9

ฉันกำลังพยายามแทนที่การค้นหาเริ่มต้นด้วยคำสั่ง LIKE ใน Drupal 7 ฉันพยายามที่จะเปลี่ยนการสืบค้นตามการเพิ่มเงื่อนไข OR ในการสืบค้นที่มีอยู่ :

function MYMODULE_query_node_access_alter(QueryAlterableInterface $query) {
  foreach ($query->getTables() as $table) {
    // LIKE for search results.
    if ($table['table'] == 'search_index') {
      // Get the query args and then the search term
      $args =& $query->getArguments();
      $search = $args[':db_condition_placeholder_1'];

      // Get a reference to the existing query conditions.
      $conditions =& $query->conditions();

      // Save the former conditions
      $former_conditions = $conditions;

      // Reset the condition array. It needs a default #conjunction for which AND is fine
      $conditions = array('#conjunction' => array_shift($former_conditions));

      // Replace the search condition in the query
      foreach ($former_conditions as $key => $condition) {
        if ($key != 1) {
          $query->condition($condition['field'], $condition['value'], $condition['operator']);
        }
        else {
          $query->condition('i.word', '%' . db_like($search) . '%', 'LIKE');
        }
      }
    }
  }
}

การค้นหาด้วยคำว่า "declaration" จะแสดงผลลัพธ์เหมือนกับการค้นหา drupal เริ่มต้น แต่การค้นหาด้วย "decl" จะไม่พบผลลัพธ์ใด ๆ

ความคิดเห็นใด ๆ ที่ทำให้รหัสของฉันไม่ทำงาน


1
โมดูลdrupal.org/project/fuzzysearchควรแก้ปัญหาของคุณ คุณสามารถลองดู ..
Anil Sagar

ขอบคุณ. ฉันต้องการโซลูชันที่มี hook_query_alter (ถ้าเป็นไปได้) เนื่องจากฟอร์มการค้นหาและหน้าผลลัพธ์ได้รับการตั้งค่าแล้ว ฉันอยากรู้เช่นกันว่าทำไมโค้ดของฉันจึงไม่ทำงานสำหรับกรณีการใช้งานอื่น
user9932

1
ดูเหมือนว่าคุณ 90% ของวิธีการมีและเพียงแค่ต้องชิ้นสุดท้ายนี้เพื่อให้ทำงานได้ แต่ฉันคิดว่าคุณจะไปในทางที่ผิด มีโมดูลการค้นหาจำนวนมากที่จะจัดการกับกรณีการใช้งานทุกประเภทและฉันแน่ใจว่าคุณจะพบหนึ่งในการแก้ปัญหาของคุณ การใช้การแทรกแซงแบบนี้อาจนำไปสู่ความสับสนและความไม่แน่นอน
Alan Dixon

คุณเคยลองพิมพ์สิ่งที่ถือเป็น$searchตัวแปรหรือไม่? $ search = $ args [': db_condition_placeholder_1']; ถ้ามันมาจากมุมมองไปhook_views_query_alter()มันจะง่าย

คำตอบ:


0

คุณลองเปลี่ยนตะขอที่ใช้อยู่MYMODULE_query_alterหรือไม่?

คุณกำลังใช้งาน hook_query_TAG_alter () และฉันไม่เห็นว่าแท็กการค้นหาอยู่ที่ไหน

ต่อNode API :

นี่คือ hook_query_alter () สำหรับการสืบค้นที่ติดแท็กด้วย 'node_access' จะเพิ่มการตรวจสอบการเข้าถึงโหนดสำหรับบัญชีผู้ใช้ที่กำหนดโดย meta-data 'บัญชี' (หรือผู้ใช้ $ ทั่วโลกหากไม่ได้ระบุไว้) สำหรับการดำเนินการที่กำหนดโดย meta-data 'op' (หรือ 'ดู' หากไม่ได้ระบุไว้อื่น ๆ ค่าที่เป็นไปได้คือ 'อัพเดต' และ 'ลบ')


0
module_query_tagName_tag_alter(QueryAlterableInterface $query)

ใช้สิ่งนี้และตั้งชื่อแท็กในview->queryการตั้งค่า ด้วยการใช้สิ่งนี้คุณสามารถแยกแยะมุมมองต่างๆ


0

หากต้องการเพิ่มเงื่อนไขใหม่คุณสามารถลองด้านบนด้วยadd_where

$query->add_where(1,'i.word', '%' . db_like($search) . '%', 'LIKE');

ฉันหวังว่านี่จะให้ผลลัพธ์ที่คุณต้องการ

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