Điểm:2

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

lá cờ 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
lá cờ cn
Thay vào đó, bạn có thể cân nhắc tận dụng https://www.drupal.org/project/computed_field và lọc trên trường được tính toán.
Baud avatar
lá cờ sa
@beltouche cảm ơn bạn. Tôi cũng có thể điền vào một trường bình thường trong node_presave, nhưng vì tôi gặp nhiều trường hợp như trường hợp này, nên tôi muốn hiểu cách tạo các loại truy vấn đó. (Tôi thường dùng sql, nó rất dễ, vì vậy tôi cho rằng nó có thể được thực hiện với đối tượng $query)
Điểm:1
lá cờ ua

Bạn có một vài lỗi:

Các 'trường' => 'không', nên là 'trường' => 'entity_id',

Các tham gia $ dòng cần sử dụng Drupal\views\Views::pluginManager('tham gia')


bạn có thể sử dụng addWhereExpression, ví dụ làm việc:

  truy vấn hàm công khai() {

    trường $ = [
      'trường_num1',
      'trường_num2',
    ];

    foreach ($fields as $field) {
      $table_field_name = 'nút__' . trường $;
      $cấu hình = [
        'bảng' => $table_field_name,
        'trường' => 'entity_id',
        'left_table' => 'node_field_data',
        'left_field' => 'không',
        'toán tử' => '=',
      ];
      $join = $this->joinHandler->createInstance('chuẩn', $configuration);
      $this->query->addRelationship($table_field_name, $join, 'node_field_data');
    }

    // Trừ và lọc nhỏ hơn số tiền.
    $this->query->addWhereExpression('AND', 'node__field_num1.field_num1_value - node__field_num2.field_num2_value <' . $this->amount);

  }
Baud avatar
lá cờ sa
Rất cám ơn!, nó hoạt động như một sự quyến rũ! Một lưu ý nhỏ: `$this->joinHandler` không cần thay thế bằng `Drupal\views\Views::pluginManager('join')` vì tôi đã sử dụng DI : `$container->get('plugin.manager .views.join')` đang thực hiện công việc tương tự.
No Sssweat avatar
lá cờ ua
Ồ vâng [Tiêm phụ thuộc](https://www.drupal.org/docs/drupal-apis/services-and-dependency-injection/services-and-dependency-injection-in-drupal-8#s-injecting-dependencies -into-controllers-forms-and-blocks), bằng cách nào đó tôi đã bỏ qua điều đó.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.