Score:2

How to create a view filter which display nodes if "field1" - "field2"

ธง sa

I have a content type with 2 fields: field1 and field2

I would like to create a view filter which display node based on a calculation on those two fields.

The filter should display only nodes if field1 - field2 is lower then a given amount.

Here is my try: At the end of the code, I don't know how to create the query

 class Myfilter extends FilterPluginBase implements ContainerFactoryPluginInterface {

  protected ViewsHandlerManager $joinHandler;

  private int $amount;

  public function __construct(array $configuration, $plugin_id, $plugin_definition, RouteMatchInterface $route_match, ViewsHandlerManager $join_handler) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    $this->joinHandler = $join_handler;
    $this->amount = 0;
    if (($node = $route_match->getParameter('node')) && ($node->bundle()=='my_bundle')) {
      $this->amount = $node->get('field_inv_amount')->value;
    }

  }

  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $configuration, $plugin_id, $plugin_definition,
      $container->get('current_route_match'),
      $container->get('plugin.manager.views.join')
    );
  }

  public function query() {
    //parent::query();
    
    $fields = [
      'field1',
      'field2',
    ];
    foreach ($fields as $field) {
      $table_field_name = 'node__' . $field;
      $configuration = [
        'table' => $table_field_name,
        'field' => 'nid',
        'left_table' => 'node_field_data',
        'left_field' => 'nid',
        'operator' => '=',
      ];
      $join = $this->joinHandler->createInstance('standard', $configuration);
      $this->query->addRelationship($table_field_name, $join, 'node_field_data');
    }
    // I am stuck here... field1-field2 should be < $this->amount
    $this->query->addWhere( ???? );
  }

}

Any hint will be appreciated

beltouche avatar
cn flag
อีกทางเลือกหนึ่ง คุณอาจลองใช้ประโยชน์จาก https://www.drupal.org/project/computed_field และกรองข้อมูลในฟิลด์ที่คำนวณ
Baud avatar
sa flag
@beltouche ขอบคุณค่ะ ฉันยังสามารถเติมฟิลด์ปกติระหว่าง node_presave ได้ แต่เนื่องจากฉันมีหลายกรณีเช่นนี้ ฉันจึงต้องการทำความเข้าใจวิธีสร้างข้อความค้นหาประเภทนั้น (ฉันปกติ sql มันง่ายดังนั้นฉันคิดว่ามันสามารถทำได้ด้วยวัตถุ $query)
Score:1
ธง ua

คุณมีข้อผิดพลาดเล็กน้อย:

เดอะ 'field' => 'นิด', ควรจะเป็น 'field' => 'entity_id',

เดอะ $เข้าร่วม = เส้นต้องใช้ Drupal\views\Views::pluginManager('เข้าร่วม')


คุณสามารถใช้ เพิ่ม WhereExpression, ตัวอย่างการทำงาน:

  แบบสอบถามฟังก์ชันสาธารณะ () {

    $ฟิลด์ = [
      'field_num1',
      'field_num2',
    ];

    foreach ($fields เป็น $field) {
      $table_field_name = 'node__' $ฟิลด์;
      $การกำหนดค่า = [
        'ตาราง' => $table_field_name,
        'field' => 'entity_id',
        'left_table' => 'node_field_data',
        'left_field' => 'นิด',
        'ตัวดำเนินการ' => '=',
      ];
      $join = $this->joinHandler->createInstance('มาตรฐาน', $configuration);
      $this->query->addRelationship($table_field_name, $join, 'node_field_data');
    }

    // ลบและกรองให้น้อยกว่าจำนวน
    $this->query->addWhereExpression('AND', 'node__field_num1.field_num1_value - node__field_num2.field_num2_value <' . $this->amount);

  }
Baud avatar
sa flag
ขอบคุณมาก! มันใช้งานได้เหมือนจับใจ! หมายเหตุเล็กน้อย: `$this->joinHandler` ไม่จำเป็นต้องแทนที่ด้วย `Drupal\views\Views::pluginManager('join')` เพราะฉันใช้ DI : `$container->get('plugin.manager .views.join')` กำลังทำงานเดียวกัน
No Sssweat avatar
ua flag
โอ้ ใช่ [Dependency Injection](https://www.drupal.org/docs/drupal-apis/services-and-dependency-injection/services-and-dependency-injection-in-drupal-8#s-injecting-dependencies -to-controllers-forms-and-blocks) ฉันมองข้ามสิ่งนั้นไป

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา