วิธีกรองช่วงการดูตามวันที่ (เริ่มต้น, สิ้นสุด)


18

ใน Drupal 7 กับผู้ชมโมดูลวันที่เปิดใช้งานมันก็สวยง่ายต่อการกรองมุมมองโดยวันที่: UI เพียงแค่ให้คุณเลือกที่จะทำเช่นนั้น

อย่างไรก็ตามใน Drupal 8 เขตข้อมูลวันที่และมุมมองเป็นส่วนหนึ่งของแกนหลัก แต่ถ้าคุณเลือกเขตข้อมูลช่วงวันที่เป็นตัวกรองในมุมมองจะไม่เสนอตัวเลือกวันที่ให้คุณอีกต่อไป แต่จะแสดงเฉพาะตัวเลือกการกรองสำหรับฟิลด์ข้อความป้อนคำอธิบายรูปภาพที่นี่

อย่างไรก็ตามตัวเลือกเฉพาะวันที่นั้นพร้อมใช้งานสำหรับค่าวันที่ภายในเช่น ´เนื้อหา: เปลี่ยนแล้ว ป้อนคำอธิบายรูปภาพที่นี่

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

ฉันจะกรองมุมมองใน Drupal 8 ตามฟิลด์วันที่ด้วยการดำเนินการเฉพาะวันที่ได้อย่างไร


ตัวกรองมุมมองที่เหมาะสมเป็นปัญหาในกระบวนการสำหรับช่วงวันที่ แพตช์ใช้งานได้ แต่เส้นทางการอัพเดทนั้นยากมาก
mpdonadio

@mpdonadio คุณช่วยฉันด้วยลิงก์ไปยังแพตช์ได้ไหม
user5950

2
เป็นdrupal.org/node/2786577แต่ได้รับการเตือนเส้นทางการอัปเดตไม่ได้รับการทดสอบอย่างสมบูรณ์ ใช้โปรแกรมแก้ไขนี้ด้วยความเสี่ยงของคุณเอง
mpdonadio

@ Pierre.Vriens มันไม่ซ้ำกัน นี่เป็นเรื่องเกี่ยวกับฟิลด์ที่มีวันที่เริ่มต้นและสิ้นสุดและการกรองในฟิลด์เหล่านั้น ไม่ใช่เพียงฟิลด์ค่าเดียว
Neograph734

@ Neograph734 ตกลงที่ช่วยให้เข้าใจความแตกต่างได้ดีขึ้น (ถอนการลงคะแนน) แต่ OPer ควรแก้ไขคำถามนี้เพื่อรวมไว้ในคำถามจริงด้วย (เพื่อหลีกเลี่ยงผู้อื่นจะเห็นว่ามันซ้ำซ้อน) ... ขอให้โชคดี!
Pierre.Vriens

คำตอบ:


14

น่าแปลกใจที่ Drupal 8 ยังไม่สามารถทำได้ แต่มีประวัติศาสตร์อันยาวนานของการพยายามที่จะทำให้มันทำงาน: https://www.drupal.org/node/2786577 แพทช์ที่ผ่านมาคุณจะพบในโพสต์นี้ดูเหมือนว่าจะทำงาน คุณสามารถดาวน์โหลดและใช้งานได้โดยใช้คำสั่งต่อไปนี้:

wget https://www.drupal.org/files/issues/improve_the_views-2786577-76-core.patch
git apply improve_the_views-2786577-76-core.patch

หากgitไม่มีบนเซิร์ฟเวอร์ของคุณลอง:

patch -p1 < improve_the_views-2786577-76-core.patch

ในการใช้งานแพตช์ที่คุณต้องไปที่coreโฟลเดอร์ก่อน และโปรดระวังว่าคุณจะต้องนำ patch นี้ไปใช้ใหม่หลังจากที่ได้ทำการอัพเดทหลัก (สิ่งนี้แย่มาก!) ดังนั้นให้เราหวังว่า Drupal Gods จะเอาสิ่งนี้มาเป็นแกนหลักในไม่ช้า!


ช่วยบอกหน่อยได้ไหมว่าจะใช้งานแพทช์มันไม่ทำงานสำหรับฉัน !! @ user5950
ทำให้ฉันมีชีวิตอยู่

patch -p1 <ปรับปรุง _the_views_integration_for_daterange_fields-2786577-60.patch ทำงานให้ฉันขอบคุณ @ user5950
make-me-alive

ตรวจสอบให้แน่ใจว่าคุณใช้การอัพเดทฐานข้อมูล:drush updatedb --entity-updates
Filipe Miguel Fonseca

หากคุณใช้ผู้แต่งเพื่อใช้แพทช์พวกเขาจะนำไปใช้โดยอัตโนมัติเมื่อคุณอัปเดตโมดูล ที่กล่าวว่าอันนี้จะรวมอยู่ใน 8.6 - แพทช์ได้มุ่งมั่นเมื่อไม่กี่วันที่ผ่านมา!
mortona42

5
ในขณะที่ฟังก์ชั่นนี้จะเริ่มต้นด้วย 8.6.0
Matt Fletcher

0

ฉันต้องกรองประเภทเนื้อหาที่มีวันที่ของการประมูลออกเป็นสามกลุ่ม (ขณะนี้ออนไลน์กำลังจะมาถึงและพร้อมที่จะลงทะเบียน) เนื่องจากสิ่งนี้เกี่ยวข้องกับหลาย daterange ฉันจึงเขียนปลั๊กอินตามบทความนี้: https://www.webomelette.com/creating-custom-views-filter-drupal-8

โดยทั่วไปแล้วจะมีสามสิ่ง: - แปลงวันที่ในฟิลด์เป็นวันที่และเวลาท้องถิ่น - ตัวกรองมีการตั้งค่าสามแบบที่เป็นไปได้ 'ขณะนี้ออนไลน์', 'กำลังจะมาถึง' และ 'อื่น ๆ ' - ขึ้นอยู่กับการตั้งค่าซึ่งจะเพิ่มความเป็นไปได้ที่คำสั่งในแบบสอบถาม

มันใช้งานได้และดูเหมือนจะแข็งแกร่งสำหรับการอัปเดตในอนาคต

    <?php

    /**
     * @file
     * Definition of Drupal\d8views\Plugin\views\filter\NodeTitles.
     */

    namespace Drupal\d8views\Plugin\views\filter;

    use Drupal\views\Plugin\views\filter\FilterPluginBase;
    use Drupal\views\Plugin\views\filter\InOperator;
    use Drupal\views\Plugin\views\filter\ManyToOne;
    use Drupal\views\ViewExecutable;
    use Drupal\views\Views;
    /**
     * Filters by given list of node title options.
     *
     * @ingroup views_filter_handlers
     *
     * @ViewsFilter("d8views_node_titles")
     */
    class NodeTitles extends FilterPluginBase {
        // exposed filter options
        protected $alwaysMultiple = TRUE;

        /**
         * Provide simple equality operator
         */
        public function operatorOptions() {
            return [
                'nu_online' => $this->t('Nu online'),
                'binnenkort' => $this->t('Binnenkort'),
                'anders' => $this->t('Anders'),
            ];
        }


        public function query() {
            //Get the current domain.  
            //$domain = domain_get_domain();
            $nu_in_utc = new \DateTime('now', new \DateTimezone('UTC'));
            $nu_in_utc_in_iso = $nu_in_utc->format('Y-m-d\TH:i:s');
            $nu_date = $nu_in_utc->format('Y-m-d');
            /* 
            * Voeg relatie met datum veiling toe
            */
            $configuration = [
                'table'      => 'node__field_datum_veiling',
                'left_table' => 'node_field_data',
                'left_field' => 'nid',
                'field'      => 'entity_id',
                'type'       => 'LEFT',
                'extra_operator'   => 'AND',
            ];
            $join = Views::pluginManager('join')->createInstance('standard', $configuration);
            $this->query->addRelationship('node__field_datum_veiling', $join, 'node_field_data');

            /* 
            * Voeg relatie met online datum van de veiling
            */
            $configuration = [
                'table'      => 'node__field_datum_online',
                'left_table' => 'node_field_data',
                'left_field' => 'nid',
                'field'      => 'entity_id',
                'type'       => 'LEFT',
                'extra_operator'   => 'AND',
            ];

            $join = Views::pluginManager('join')->createInstance('standard', $configuration);
            $this->query->addRelationship('node__field_datum_online', $join, 'node_field_data');
            switch($this->operator) {
                case 'nu_online':
                    /* 
                    * Condities voor 'Nu online'
                    */
                    //dpm('Nu online');
                    $this->query->addWhere('AND', 'node__field_datum_veiling.field_datum_veiling_end_value', $nu_in_utc_in_iso, '>');
                    $this->query->addWhere('AND', 'node__field_datum_online.field_datum_online_value', $nu_date, '<=');
                    break;
                case 'binnenkort':
                    /* 
                    * Condities voor 'Binnenkort'
                    */
                    //dpm('Binnenkort');
                    $this->query->addWhere('AND', 'node__field_datum_veiling.field_datum_veiling_end_value', $nu_in_utc_in_iso, '>');
                    $this->query->addWhere('AND', 'node__field_datum_online.field_datum_online_value', $nu_date, '>');
                    break;
                case 'anders':
                    /* 
                    * Condities voor 'Anders' (dwz online, binnenkort, maar nog niet geweest)
                    */
                    $this->query->addWhere('AND', 'node__field_datum_veiling.field_datum_veiling_end_value', $nu_in_utc_in_iso, '>');
                    break;
            }
        }
    }

0

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

ลองดูที่: https://github.com/barsan-ds/interval-filterสำหรับตัวอย่าง


0

มุมมองปัจจุบันไม่ได้ตระหนักถึงช่วงวันที่มากนัก สามารถกรองวันที่เริ่มต้นหรือวันที่สิ้นสุดเป็นตัวกรองแยกกัน แต่ไม่รวมช่วงวันที่ทั้งหมด

เพื่อเปิดใช้การกรองขึ้นอยู่กับช่วงวันที่ฉันสร้างโมดูลชมวันกรองช่วง ขณะนี้มีตัวกรองเพิ่มเติม 3 รายการสำหรับเขตข้อมูลช่วงเวลา:

รวม

กรองตามช่วงวันที่ซึ่งรวมถึงวันที่ให้

การทับซ้อน

กรองตามช่วงวันที่ทับซ้อนกับช่วงวันที่ที่ให้มา

จบโดย

กรองตามช่วงวันที่ซึ่งสิ้นสุดตามวันที่ที่ให้มา เทียบเท่ากับ "วันที่สิ้นสุด <= วันที่ให้" มีประโยชน์สำหรับตัวกรองที่มีการจัดกลุ่มเมื่อใช้ "วันที่เริ่มต้น"


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