Views 3 및 D7에 대한 사용자 지정 노출 필터를 만드는 방법에 대한 정보는 어디에서 얻을 수 있습니까?


18

기고 된 모듈 (선택 또는 기타)에 대해 사용자 정의 노출 필터를 작성하는 방법을 배우려고합니다. Drupal 6에 대한 이 자습서 를 찾았 지만 코드가 Drupal 7에서 기본적으로 작동하지 않는 것 같습니다.

또한 계층 선택 모듈 에서 코드를 보려고 시도했지만 내가하려고 하는 것보다 훨씬 더 복잡한 것 같습니다.

누구든지 내가 배울 수있는 비교적 간단한 방법 (예 : 위치 모듈과 같은 수많은 사용자 정의 처리기가 아닌)으로 사용자 정의 노출 필터를 구현하는 자습서 또는 모듈에 대한 제안이 있습니까?

답변:


6

짧은 대답 : 어디에도 없습니다.

그러나 여기저기서 약간의 정보를 찾을 수 있습니다.

가장 먼저 살펴볼 곳은보기 소스, 특히 기존 필터의 구현에서 간단한 필터로 시작하는 것입니다.

개인적으로, 나는 당신이 그것을 읽을 수 있는지 알 수 있듯이 매우 유익하지만 완전히 만족스럽지 않은 이 스레드에 참여 했습니다. 나는 여기에있는 정보가 유용하다고 생각하며, 적어도 그것이 쓰여질 때 그것이 정확하다고 말할 수 있습니다.


2
다음은 내가 방금 발견 한 마지막 Drupalcon 의 회의 이며 내가 모르는 api.drupal.org 문서 의 Views 부분에 대한 언급을 포함하여 매우 유용한 정보를 포함 합니다. 지금까지 내가 아는 Views 개발을위한 최고의 출발점입니다.
Countzero

10

나는 같은 질문에 대한 답을 찾으려고 인터넷 주위에 숨어 있었고 이것이 내가 얻은 결과입니다.

  1. 사용자 정의 모듈에 여러 후크를 구현하십시오. 교체 modulenamefiltername실제 이름.

    /**
     * Implements hook_views_api().
     */
    function modulename_views_api() {
      return array(
        'api' => 2,
        'path' => drupal_get_path('module', 'modulename') . '/inc',
      );
    }
    
    /**
     * Implementation of hook_views_handlers() to register all of the basic handlers
     * views uses.
     */
    function modulename_views_handlers() {
      return array(
        'info' => array(
          // path to handler files
          'path' => drupal_get_path('module', 'modulename') . '/inc',
        ),
        'handlers' => array(
          // register our custom filter, with the class/file name and parent class
          'modulename_handler_filter_filtername' => array(
            'parent' => 'views_handler_filter',
          ),
        ),
      );
    }
    
    function modulename_views_data() {
      $data = array();
    
      $data['node']['filtername'] = array(
        'group' => t('Custom'),
        'real field' => 'my_custom_filter_field',
        'title' => t('My custom filter'),
        'help' => t('Some more detailed description if you need it.'),
        'filter' => array(
          'handler' => 'modulename_handler_filter_filtername',
        ),
      );
    
      return $data;
    }
  2. 라는 이름의 폴더를 생성 inc모듈 폴더 안에 명명 된 파일을 생성 modulename_handler_filter_filtername.inc(이 파일에 대한 암시 적 참조 위의 코드를 참조)가있다. 실제 모듈 및 필터 이름을 사용하는 것을 잊지 마십시오.

  3. 다음 코드를 해당 modulename_handler_filter_filtername.inc파일에 붙여 넣습니다 . 이 예제에 사용한 코드는 몇 년이 지난 일련의 라디오 버튼을 만듭니다. 따라서 노드가 작성된 연도 만 사용하여 작성된 연도별로 노드를 필터링 할 수 있습니다.

    class modulename_handler_filter_filtername extends views_handler_filter {
    
      /**
       * Options form subform for setting exposed filter options.
       */
      function value_form(&$form, &$form_state) {
        parent::value_form($form, $form_state);
    
        // get list of years from database
        $query = db_select('node', 'n');
        $query->addExpression("FROM_UNIXTIME(n.created, '%Y')", 'year');
        if (isset($this->view->filter['type'])) {
          $query->condition('n.type', $this->view->filter['type']->value, 'IN');
        }
        $result = $query->orderBy('year', 'ASC')
          ->execute()
          ->fetchAllAssoc('year');
    
        $years = array(
          '0' => t('All'),
        );
        foreach ($result as $k => $v) {
          $years[$k] = $k;
        }
    
        // create form element with options retrieved from database
        $form['value']['year'] = array(
          '#type' => 'radios',
          '#options' => $years,
          '#default_value' => end($years),
        );
      }
    
      /**
       * Alters Views query when filter is used.
       */
      function query() {
        // make sure base table is included in the query
        $this->ensure_my_table();
    
        // retrieve real filter name from view options
        // this requires 'real field' filter option to be set (see code above)
        $real_field_name = $this->real_field;
        // get the value of the submitted filter
        $value = $this->view->exposed_data[$real_field_name];
    
        // finally, alter Views query
        if (is_numeric($value) && $value != 0) {
          /* 
            Having several custom exposed filters, make sure subsitution patterns
            (e.g. :filtername_value below) don't match across different filters.
            I spent some time figuring out why all my filters had the same value.
            It looks like the query skeleton is built first and then all replacements
            are made in bulk. Prefixing value with filter name looks good imo.
          */
          $this->query->add_where_expression($this->options['group'],
            "FROM_UNIXTIME(node.created, '%Y') = :filtername_value",
            array(':filtername_value' => $value));
        }
      }
    }

이것이 가장 간단한 맞춤형 노출 필터 작동을 위해 필요한 전부입니다!

쿼리 FROM_UNIXTIME상태에서 사용 SELECT하면 데이터베이스 속도가 느려질 수 있습니다.


첫째 : 감사합니다! 가장 좋은 가이드!, 둘째 : query ()의 고급 사용법을 찾는 사람들은 views_handler_filter_numeric.inc
hkoosha를

또한 다음과 같이 쿼리 및 대체를 수동으로 작성할 필요가없는보다 고급스러운 사용법이 있습니다 $this->query->add_where($this->options['group'], $real_field_name, $this->value['value'], $this->operator);. 위의 링크에서 찾을 수 있습니다.
hkoosha

2
그것은 Drupal 7에서 저에게 효과적입니다. 그러나이 작업을 수행하려면 1) hook_views_handler 함수의 구현을 삭제하고 2) 이것을 .info 파일에 추가하십시오 : files [] = inc / modulename_handler_filter_filtername.inc 3) 나는이 두 가지 변경 사항을 기반으로했습니다. 에 이 게시물 4) 많은 감사합니다!
Roger

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.