มุมมอง 3 ลบตัวกรองแบบเปิดเผยโดยทางโปรแกรม


9

ฉันมีโหนดหลายประเภทแต่ละชนิดอ้างถึงคำศัพท์อนุกรมวิธานที่แตกต่างกัน สำหรับหมวดหมู่ที่แสดงฉันใช้โมดูล taxonomy_display

ตัวอย่างเช่นเรามีสองประเภทคือตัวชี้นำและลูกบิลเลียด

ตัวชี้นำมีราคาตั้งแต่ราคาถึงและตัวกรองชนิดไม้ แต่ลูกบอลไม่มีตัวกรองชนิดไม้

ดังนั้นฉันจำเป็นต้องลบตัวกรองชนิดไม้ถ้า taxonomy_term tid อ้างถึงคำศัพท์ลูกบิลเลียด

ดังนั้นฉันต้องลบหนึ่งในตัวกรองที่เปิดเผยหลายอย่างโดยทางโปรแกรม

function modulename_views_pre_view(&$view, &$display_id, &$args) {
  // Some custom logic wich field_info_instances checking ...
  $filter_field = 'filter_id';
  // Removes from everywhere where i can find filter or filters properties
  unset($view->display[$view->current_display]->display_options['filters'][$filter_field]);
  unset($view->display[$view->current_display]->handler->options['filters'][$filter_field]);
  unset($view->display_handler->display->display_options['filters'][$filter_field]);
  unset($view->display_handler->options['filters'][$filter_field]);
}

ฟิลด์ตัวกรองลบออกสำเร็จ แต่ฉันได้รับการแจ้งเตือนจาก php

  Notice: Undefined index: field_wood_reference_tid in function views_handler_filter_term_node_tid->exposed_validate()

นอกจากนี้ฉันพยายามลบฟิลด์ใน hook_pre_execute () แต่ด้วยผลลัพธ์เดียวกัน:

function modulename_views_pre_execute(&$view) {
  $filter_field = 'filter_id';
  unset($view->display_handler->handlers['filter'][$filter_field]);
  unset($view->filter[$filter_field]);
}

ลองใช้ override_option () method เหมือนกันที่นี่ - http://groups.drupal.org/node/82219แต่ไม่มีผลลัพธ์เลย

ข้อเสนอแนะใด ๆ กรุณาช่วย =)


ขอบคุณทุกคนสำหรับการตอบกลับ แต่ฉันยังไม่มีคำตอบ บางทีสิ่งที่ไม่ชัดเจน? = (


คุณลองใช้hook_views_pre_render () แล้วหรือยัง คุณสามารถแสดง / ซ่อนตัวกรองที่เกี่ยวข้องขึ้นอยู่กับการเลือกด้วย jQuery
enzipher

สวัสดีครับผมเข้าใจว่าวิธีการทำงานของโอเค แต่มีไม่ได้วิธีการที่เหมาะสม ดังนั้นฉันสามารถซ่อนมันโดยใช้ CSS- เงื่อนไข ... พยายามอธิบาย รหัสแต่ละประเภทควรวางไว้ที่ที่ควรจะเป็น สำหรับปัญหานี้หากฉันซ่อนตัวกรองที่เปิดเผยก่อนหรือหลังการแสดงผลมุมมองยังคงประมวลผล และถ้าผมลองเพิ่มสตริงแบบสอบถาม SMT เช่น?filter_id=valมุมมองที่จอแสดงผลที่ว่างเปล่าหรือข้อผิดพลาดทางเลือกที่ผิดกฎหมาย ...
Oleg Sherbakov

คุณลองคำตอบของฉันแล้วหรือยัง?
Mathankumar

ฉันไม่จำเป็นต้องเปลี่ยนรูปแบบ (ฉันรู้ว่าตัวแปรของคุณทำงานได้) ฉันต้องการแก้ไขมุมมองวัตถุที่มีผลคล้ายกับผลลัพธ์ของคุณ แต่เร็วกว่าแบบฟอร์มสร้าง
Oleg Sherbakov

คำตอบ:


5

ฉันจะใช้hook_form_alterโดยใช้ unset บนวัตถุรูปแบบตามที่คุณอยู่ในตัวอย่างของคุณสำหรับองค์ประกอบที่คุณต้องการลบ


1

นี่คือตัวอย่างข้อมูลทดสอบที่จะช่วยให้คุณลบตัวกรองออกจากแบบฟอร์มการดูที่เปิดเผยโดยใช้แบบฟอร์มแก้ไขตามที่ Scott Thomas กล่าวไว้

/**
 *Implements hook_form_FORM_ID_alter().
 */
function hook_form_views_exposed_form_alter(&$form, &$form_state) {
  $filter_field = 'filter_id';
  // Get the filters list for the current view. Here page_1 is the display ID.
  $filters = $form_state['view']->get_items('filter', 'page_1');
  if (isset($filters[$filter_field])) {
    $info_key = 'filter-' . $filter_field;
    unset($form[$filter_field], $form['#info'][$info_key]);
  }     
}

นอกเหนือจากการลบฟิลด์แบบฟอร์มคุณยังต้องลบข้อมูลสำหรับตัวกรองเฉพาะซึ่งมีอยู่ในรูปแบบ $ form ['# info'] เพื่อที่จะลบป้ายกำกับด้วย หากคุณลบองค์ประกอบของฟอร์มเพียงอย่างเดียวป้ายกำกับตัวกรองจะปรากฏขึ้นแม้ว่าจะลบฟิลด์ดังนั้นโปรดตรวจสอบให้แน่ใจว่าคุณได้ลบข้อมูลนี้ด้วย

แก้ไขสิ่งนี้ตามความต้องการของคุณ หากคุณต้องการทำสิ่งนี้สำหรับมุมมองเฉพาะจากนั้นเพิ่มเงื่อนไขสำหรับเช่นกัน

if ($form_state['view']->name == 'view_name') {
  // DO your operation.
}

ที่นี่ $ form_state ['view'] จะให้วัตถุมุมมองปัจจุบันที่กำลังประมวลผล

หวังว่านี่จะช่วยได้


นี่เป็นทางออกเดียวที่ซ่อนป้ายกำกับรวมถึงวิดเจ็ตฟิลด์สำหรับฉันและมันทำงานในรูปแบบตัวกรองแบบเปิดเผยในบล็อก
xenophyle

1

ทำตามขั้นตอนด้านล่าง

  1. ก่อนอื่นให้เขียน hook_form_alter ในโมดูลที่กำหนดเอง
  2. ลองรหัสต่อไปนี้

    ไม่มีการตั้งค่า ($ รูปแบบ [ '# ข้อมูล'] [ 'your_field_name']); $ form ['your_field_name'] ['# access'] = 'FALSE';

หวังว่าจะช่วย


1

คุณสามารถลบตัวกรองที่เปิดเผยโดยใช้ไฟล์เทมเพลตได้เช่นกัน

ใช้คำสั่งนี้:

cp sites/all/modules/contrib/views/theme/views-view.tpl.php sites/all/themes/costa/templates/views/views-view--<machine_name>.tpl.php

ในไฟล์เทมเพลตหารหัสนี้:

  <?php if ($exposed): ?>
    <div class="view-filters">
      <?php print $exposed; ?>
    </div>
  <?php endif; ?>

และลบทิ้ง ตัวกรองที่เปิดเผยของคุณจะถูกลบออกจากการแสดงผล แต่จะทำงานต่อไปเรื่อย ๆ ผ่านการโต้แย้งที่เหมาะสมใน URL


ขอบคุณสำหรับการตอบกลับ แต่ผมกำลังรอ D8 ที่ใช้ API แบบฟอร์มหลักสำหรับการสร้างฟิลเตอร์สัมผัส :)
Oleg Sherbakov

0

แก้ไขฉันหากฉันผิดเพราะฉันไม่แน่ใจว่าจะเข้าใจปัญหาของคุณอย่างเต็มที่ ดังนั้นคุณต้องการซ่อนตัวกรองที่เปิดเผยในมุมมองขึ้นอยู่กับค่าของตัวกรองที่เปิดเผยอื่น ๆ ถ้าเป็นเช่นนั้นคุณสามารถลองใช้โมดูลตัวกรองมุมมองที่อ้างถึง ฉันใช้มันหลายครั้งและใช้งานได้

คุณสามารถตรวจสอบ Lullabot อสูรของเราตรวจสอบเกี่ยวกับโมดูลนี้

หากคุณต้องการทำในรหัสตัวเลือกที่เปิดเผยควรใช้งานได้: ตัวกรอง [$ filter_id] -> ตัวเลือก ['exposed'] = FALSE;


ฉันต้องการซ่อนตัวกรองแบบเปิดเผยหากประเภทเนื้อหาปัจจุบันไม่มีฟิลด์ (กรอง) นี้ พยายามที่ตัวอย่างของคุณ$view->display_handler->handlers['filter'][$filter_field]->options['exposed'] = FALSE;ฉันมีข้อผิดพลาดร้ายแรง PHP Fatal error: Call to undefined method stdClass::access() in .../view.inc on line 766- ฉันคิดว่ามันเป็นพฤติกรรมที่ถูกต้องเพราะหากตัวกรองไม่ได้รับการสัมผัสมันก็จำเป็นต้องใช้ค่าเริ่มต้น ความคิดใด ๆ
Oleg Sherbakov

pastebin.com/f1FKg ใช้นี่คือรหัสของฉันบางทีมันอาจจะชัดเจนกว่าภาษาอังกฤษของฉัน
Oleg Sherbakov

0

ต่อไปนี้มันสำหรับฉันภายใน hook_form_alter:

$info_key = 'filter-' . $fieldName;
unset($form[$fieldName], $form['#info'][$info_key], $form_state['view']->display_handler->options['filters'][$fieldName], $form_state['view']->display_handler->handlers['filter'][$fieldName], $form_state['view']->filter[$fieldName]);

0

วิธีที่ 1

โดยใช้ hook_views_query_alter () ดูตัวอย่างต่อไปนี้:

<?php
/**
 * Implements hook_views_query_alter().
 */
function foo_views_query_alter(&$view, &$query) {

  if ($view->name == 'foo_view') {

    // Allow any distance when the postcode it is not specified.
    if (empty($_GET['postcode']['postal_code']) || $_GET['postcode']['postal_code'] === 'All') { 
      // Scan through the query.
      foreach ($query->where as $condition_group_key => &$condition_group) {
        foreach ($condition_group['conditions'] as $condition_key => &$condition) {
          $search_name = '(COALESCE(ACOS(';
          if (is_string($condition['field']) && strstr($condition['field'], $search_name) !== FALSE) {
            // Remove filter from the query.
            unset($query->where[$condition_group_key]['conditions'][$condition_key]);
          }
        } // end: foreach
      } // end: foreach
    } // end: if


    /*
     * Change the field conditions.
     * Possible field values: 1, 2, 3
     * Logic: When 3 is selected, then display 1, 2 and 3.
     */
    switch (@$view->display_handler->handlers['filter']['field_123_value']->value[0]) {

      case 3:
        foreach ($query->where as $condition_group_key => &$condition_group) {
          foreach ($condition_group['conditions'] as $condition_key => &$condition) {
            if($condition['field'] == 'field_data_field_123.field_123_value') {
              unset($query->where[$condition_group_key]['conditions'][$condition_key]);
              $query->where[] = array(
                  'conditions' => array(
                      array(
                          'field' => 'field_data_field_123.field_123_value',
                          'value' => 1,
                          'operator' => "=",
                      ),
                      array(
                          'field' => 'field_data_field_123.field_123_value',
                          'value' => 2,
                          'operator' => "=",
                      ),
                      array(
                          'field' => 'field_data_field_123.field_123_value',
                          'value' => 3,
                          'operator' => "=",
                      ),
                  ),
                  'args' => array(),
                  'type' => 'OR',
              );
            }
          }
        } // end: foreach
        break;

    } // end: switch

  } // end: if
}

วิธีที่ 2

ดูตัวอย่างโดยใช้ hook_views_pre_execute และฟังก์ชันแบบกำหนดเองซึ่งพยายามค้นหาเงื่อนไขของฟิลด์ที่ถูกต้องและส่งคืนการอ้างอิงถึงมัน:

/**
 * Implements hook_views_pre_execute().
 */
function foo_views_pre_execute(&$view) {

  if ($view->name == 'foo_view') {


    foo_get_view_filter_recursively(
      $view,
      $view->build_info['query']->conditions(),
      'field_data_field_123.field_123_value',
      $filter
    );

    // We want our filter to work as a bit mask.
    $filter[0]['operator'] = '&';

    unset ($filter);

    // Example of finding Proximity filter condition
    $search_name = '(COALESCE(ACOS(';

    foo_get_view_filter_recursively(
      $view,
      $view->build_info['query']->conditions(),
      $search_name,
      $filter
    );

    if (empty($_GET['postcode']['postal_code']) || $_GET['postcode']['postal_code'] === 'All') {
      // Allowing any distance.
      $filter[0]['value'][':distance'] = 10000000;
    }
    else {
      $filter[0]['value'][':distance'] = 80000;
    }

    unset ($filter);


    // Fetching single record?

    foo_get_view_filter_recursively(
      $view,
      $view->build_info['query']->conditions(),
      'node.nid',
      $filter
    );

    if (!empty($_GET['nid'])) {
      $filter[0]['value'] = (int) $_GET['nid'];
    }
    else {
      $filter[0]['operator'] = '<>';
    }

    unset ($filter);                                                        

    // echo '<pre style="font-size:11px;font-family: Monaco">'; print_r($view->build_info['query']); exit;
  }
}

/**
 * Custom function to find the field condition within the view
 */
function foo_get_view_filter_recursively($view, &$conditions, $field_name, &$filter) {

  if (!empty($conditions)) {

    foreach ($conditions as &$condition) {
      if ($condition instanceof DatabaseCondition) {
        if (foo_get_view_filter_recursively($view, $condition->conditions(), $field_name, $filter)) {
          return TRUE;
        }
      } else if ($condition['field'] instanceof DatabaseCondition) {
        if (foo_get_view_filter_recursively($view, $condition['field']->conditions(), $field_name, $filter)) {
          return TRUE;
        }
      } elseif (is_string($condition['field']) && strstr($condition['field'], $field_name) !== FALSE) {
        @$filter = array(&$condition);
        return TRUE;
      }
    } // end: foreach

  } // end: if

  return FALSE;
}

0

ฉันลบมันออกจากไฟล์เทมเพลต แทนที่ views-view.tpl.php และลบรหัสต่อไปนี้ออกจากมัน:

  <?php if ($exposed): ?>
    <div class="view-filters">
      <?php print $exposed; ?>
    </div>
  <?php endif; ?>

0

ฉันคิดว่า op อยู่ในเส้นทางที่ถูกต้อง ฉันมีสถานการณ์ที่คล้ายกันโดยไม่มีตัวกรองแบบเปิดเผยดังนั้นฉันจึงไม่สามารถใช้วิธีการ hook_form_alter นี่คือตัวอย่างรหัสสำหรับคนอื่นที่เจอสิ่งนี้:

$view->set_item($view->current_display, 'filter', $filter_id, null);

วัตถุมุมมองที่ไม่ได้มีremove_itemฟังก์ชั่น แต่เพียงระบุในรหัสที่คุณสามารถตั้งค่าให้ null เพื่อที่จะลบรายการรวมทั้งตัวกรอง: ในบรรทัดviews/includes/view.inc2526

นี่คือตัวอย่างเต็มรูปแบบสำหรับทุกคนที่กำหนดเป้าหมายมุมมองและการแสดงผลที่เฉพาะเจาะจง:

/**
 * Implements HOOK_views_pre_view().
 */
function HOOK_views_pre_view(&$view) {
  if($view->name == 'VIEW_MACHINE_NAME') {
    switch($view->current_display) {
      case 'VIEW_DISPLAY_MACHINE_NAME':
        $view_filters = $view->display_handler->get_option('filters');
        foreach ($view_filters as $filter_id => $filter) {
          if ($filter_id == 'my_filter') {
            $view->set_item($view->current_display, 'filter', $filter_id, null);
          }
        }
      break;
    }
  }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.