ভিউ 3 এবং ডি 7 এর জন্য কাস্টম এক্সপোজড ফিল্টার কীভাবে তৈরি করবেন সে সম্পর্কে আমি কোথায় শিখতে পারি?


18

আমি একটি অবদানযুক্ত মডিউল (নির্বাচন বা অন্যান্য) এর জন্য কাস্টম এক্সপোজড ফিল্টার তৈরি করতে শেখার চেষ্টা করছি। আমি এই টিউটোরিয়ালটি ড্রুপাল 6 এর জন্য পেয়েছি কিন্তু কোডটি ড্রুপাল 7-এ-বক্স-অফ-বক্স-এর বাইরে কাজ করে না বলে মনে হচ্ছে।

আমি শ্রেণিবদ্ধ সিলেক্ট মডিউলটিতে কোডটি দেখার চেষ্টা করেছি তবে আমি যা করার চেষ্টা করছি তার থেকে এটি অনেক জটিল বলে মনে হচ্ছে।

আমি কি শিখতে পারি এমন তুলনামূলক সহজ উপায়ে (উদাহরণস্বরূপ, লোকাল মডিউলের মতো বিশাল সংখ্যক কাস্টম হ্যান্ডলার নয়) টিউটোরিয়াল বা মডিউলগুলির জন্য কি কোনও পরামর্শ আছে?

উত্তর:


6

সংক্ষিপ্ত উত্তর: কোথাও নেই।

তবে আপনি তথ্যের বিটগুলি এখানে এবং সেখানে খুঁজে পেতে পারেন।

দেখার প্রথম স্থানটি ভিউজ উত্সগুলিতে, বিশেষত সহজ ফিল্টারগুলির সাথে শুরু করে বিদ্যমান ফিল্টারগুলির বাস্তবায়ন।

ব্যক্তিগতভাবে, আমি এই থ্রেডে অংশ নিয়েছি যা অত্যন্ত শিক্ষণীয় কিন্তু পুরোপুরি সন্তোষজনক নয়, আপনি এটি পড়তে যান কিনা তা আপনি দেখতে পাবেন। আমি মনে করি যে এখানে তথ্যটি দরকারী তবে আমি কমপক্ষে বলতে পারি যে এটি লেখার সময় এটি যথাযথ ছিল।


2
এখানে সর্বশেষ ড্রুপালকনের একটি সম্মেলন রয়েছে যা আমি সবেমাত্র আবিষ্কার করেছি এবং অবিশ্বাস্যরূপে দরকারী তথ্য সহ , এপিআইড্রপাল.আর.অর্গ ডকুমেন্টেশনের ভিউস অংশের উল্লেখ সহ আমি জানি না। আমি এখনও অবধি জানি ভিউজ বিকাশের জন্য এটি শুরু করার সেরা জায়গা।
কাউন্টজারো

10

আমি একই প্রশ্নের উত্তর খোঁজার চেষ্টা করে ইন্টারনেটে ঘুরে বেড়াচ্ছিলাম এবং ফলস্বরূপ আমি এটি পেয়েছি:

  1. আপনার কাস্টম মডিউলে কয়েকটি হুক প্রয়োগ করুন। প্রতিস্থাপন করুন modulenameএবং filternameআপনার প্রকৃত নাম সহ।

    /**
     * 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আপনার ডাটাবেসকে ধীর করতে পারে।


প্রথম: ধন্যবাদ! সর্বকালের সেরা গাইড !, দ্বিতীয়: যাঁরা কোয়েরি () এর আরও উন্নত ব্যবহারের সন্ধান করছেন তাদের জন্য ভিউ_হ্যান্ডলার_ফিল্টার_নামারিক.ইনক দেখুন
hkoosha

এছাড়াও, একটি আরো মার্জিত ব্যবহার যেখানে আপনি প্রশ্নের সাথে এবং বদল নিজে লিখতে মত হবে না হল: $this->query->add_where($this->options['group'], $real_field_name, $this->value['value'], $this->operator);। এটি উপরের লিঙ্কে পাওয়া যাবে।
hkoosha

2
এটি ড্রুপাল on. এ আমার জন্য কাজ করে তবে যাইহোক, এই কাজটি করার জন্য আমাকে ১) হুক_ভিউ_হ্যান্ডলার ফাংশনটির বাস্তবায়ন মুছতে হবে এবং ২) এটি .info ফাইলটিতে যুক্ত করুন: ফাইলগুলি [] = ইনক / মডিউলনাম_হ্যান্ডলার_ফিল্টার_ফিল্টারনেম.আইএন 3) আমি এই দুটি পরিবর্তনকে ভিত্তি করে রেখেছি উপর পোস্টটি 4) অনেক ধন্যবাদ!
রজার

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.