Views 3 ve D7 için özel bir açık filtreyi nasıl oluşturacağımı nereden öğrenebilirim?


18

Katkıda bulunan bir modül (seçme veya diğer) için özel bir maruz kalan filtre oluşturmayı öğrenmek çalışıyorum. Ben Drupal 6 için bu öğretici buldum ama kod Drupal 7 üzerinde kullanıma hazır görünmüyor.

Ayrıca hiyerarşik seçim modülündeki koda bakmayı denedim ama ne yapmaya çalıştığımdan çok daha karmaşık görünüyor.

Herkesin öğrenebileceğim görece basit bir şekilde (ör. Konum modülü gibi çok sayıda özel işleyici değil) özel açık filtreler uygulayan öğreticiler veya modüller için önerileri var mı?

Yanıtlar:


6

Kısa cevap: hiçbir yerde.

Ama burada ve orada bilgi parçaları bulabilirsiniz.

Bakılacak ilk yer Views kaynaklarında, özellikle de daha basit olanlardan başlayarak mevcut filtrelerin uygulanmasıdır.

Personnaly, çok öğretici ama tamamen tatmin edici olmayan bu konuya katıldım . Buradaki bilgilerin yararlı olduğunu düşünüyorum ve en azından yazıldığı anda doğru olduğunu söyleyebilirim.


2
İşte son keşfettiğim ve son derece yararlı bilgiler içeren son Drupalcon konferansından , bilmediğim api.drupal.org belgelerinin Views bölümünden bahsediyoruz. Bu, şimdiye kadar bildiğim Views geliştirme için en iyi başlangıç ​​noktası.
Countzero

10

İnternette aynı soruya cevap bulmaya çalışıyordum ve sonuçta elde ettiğim şey bu:

  1. Özel modülünüze birkaç kanca takın. Değiştir modulenameve filternamegerçek isimlerle.

    /**
     * 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. Adlı klasör oluşturun incModülünüzün klasörünün içindeki ve adlandırılmış dosya oluşturmak modulename_handler_filter_filtername.inc(bu dosyaya örtülü başvuru için yukarıdaki kodu bakınız). Gerçek modül ve filtre adlarını kullanmayı unutmayın.

  3. Aşağıdaki kodu bu modulename_handler_filter_filtername.incdosyaya yapıştırın . Bu örnek için kullandığım kod, yıllar sunan bir dizi radyo düğmesi oluşturur. Böylece, yalnızca düğümlerin oluşturulduğu yılları kullanarak düğümleri oluşturulan yıla göre filtreleyebilirsiniz.

    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));
        }
      }
    }

En basit özel maruz kalan filtre çalışması için ihtiyacınız olan her şey bu!

Sorgu FROM_UNIXTIMEdurumunda kullanmanın SELECTveritabanınızı yavaşlatabileceğini unutmayın.


ilk: teşekkürler! şimdiye kadarki en iyi rehber !, ikinci: daha gelişmiş bir sorgu () kullanımı arayanlar için, bkz. views_handler_filter_numeric.inc
hkoosha

Ayrıca, gibi, elle sorgu ve değiştirmelerin yazmak zorunda değilsiniz daha şık bir kullanım vardır: $this->query->add_where($this->options['group'], $real_field_name, $this->value['value'], $this->operator);. Yukarıdaki bağlantıda bulunabilir.
hkoosha

2
Drupal 7'de benim için çalışıyor. Ancak, bu işi yapmak için 1) hook_views_handler işlevinin uygulanmasını silin ve 2) Bunu .info dosyasına ekleyin: files [] = inc / modulename_handler_filter_filtername.inc 3) Bu iki değişikliği temel aldım üzerine bu yazı 4) Çok teşekkürler!
Roger

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.