View source
<?php
namespace Drupal\opigno_messaging\Plugin\views\filter;
use Drupal\Core\Database\Query\Condition;
use Drupal\Core\Session\AccountInterface;
use Drupal\views\Plugin\views\filter\StringFilter;
use Drupal\views\Plugin\views\query\Sql;
use Drupal\views\Plugin\ViewsHandlerManager;
use Symfony\Component\DependencyInjection\ContainerInterface;
class OpignoMessageThreadNameFilter extends StringFilter {
protected $joinManager;
protected $currentUid;
public function __construct(ViewsHandlerManager $join_manager, AccountInterface $account, ...$default) {
parent::__construct(...$default);
$this->joinManager = $join_manager;
$this->currentUid = (int) $account
->id();
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($container
->get('plugin.manager.views.join'), $container
->get('current_user'), $configuration, $plugin_id, $plugin_definition, $container
->get('database'));
}
public function query() {
if (!$this->query instanceof Sql) {
return;
}
$this
->ensureMyTable();
$members_join_definition = [
'left_table' => $this->tableAlias,
'left_field' => $this->realField,
'table' => 'private_message_thread__members',
'field' => 'entity_id',
'extra' => [
[
'field' => 'members_target_id',
'value' => $this->currentUid,
'operator' => '!=',
],
],
];
$members_join = $this->joinManager
->createInstance('standard', $members_join_definition);
$members_alias = $this->query
->addTable('private_message_thread__members', NULL, $members_join);
$first_name_join_definition = [
'left_table' => $members_alias,
'left_field' => 'members_target_id',
'table' => 'user__field_first_name',
'field' => 'entity_id',
];
$first_name_join = $this->joinManager
->createInstance('standard', $first_name_join_definition);
$first_name_alias = $this->query
->addTable('user__field_first_name', NULL, $first_name_join);
$last_name_join_definition = [
'left_table' => $members_alias,
'left_field' => 'members_target_id',
'table' => 'user__field_last_name',
'field' => 'entity_id',
];
$last_name_join = $this->joinManager
->createInstance('standard', $last_name_join_definition);
$last_name_alias = $this->query
->addTable('user__field_last_name', NULL, $last_name_join);
$username_join_definition = [
'left_table' => $members_alias,
'left_field' => 'members_target_id',
'table' => 'users_field_data',
'field' => 'uid',
];
$username_join = $this->joinManager
->createInstance('standard', $username_join_definition);
$username_alias = $this->query
->addTable('users_field_data', NULL, $username_join);
$subject_join_definition = [
'left_table' => $this->tableAlias,
'left_field' => $this->realField,
'table' => 'private_message_thread__field_pm_subject',
'field' => 'entity_id',
];
$subject_join = $this->joinManager
->createInstance('standard', $subject_join_definition);
$subject_alias = $this->query
->addTable('private_message_thread__field_pm_subject', NULL, $subject_join);
$condition = new Condition('OR');
$val = $this->connection
->escapeLike($this->value);
$condition
->condition("{$first_name_alias}.field_first_name_value", "%{$val}%", 'LIKE');
$condition
->condition("{$last_name_alias}.field_last_name_value", "%{$val}%", 'LIKE');
$condition
->condition("{$username_alias}.name", "%{$val}%", 'LIKE');
$condition
->condition("{$subject_alias}.field_pm_subject_value", "%{$val}%", 'LIKE');
$this->query
->addWhere($this->options['group'], $condition);
}
}