diff --git a/core/modules/views/src/Plugin/views/display/EntityReference.php b/core/modules/views/src/Plugin/views/display/EntityReference.php index eb5f04c..126b5d8 100644 --- a/core/modules/views/src/Plugin/views/display/EntityReference.php +++ b/core/modules/views/src/Plugin/views/display/EntityReference.php @@ -2,6 +2,7 @@ namespace Drupal\views\Plugin\views\display; +use Drupal\Core\Database\Database; use Drupal\Core\Database\Query\Condition; /** @@ -127,7 +128,7 @@ public function query() { // Restrict the autocomplete options based on what's been typed already. if (isset($options['match'])) { $style_options = $this->getOption('style'); - $value = db_like($options['match']); + $value = Database::getConnection()->escapeLike($options['match']) . '%'; if ($options['match_operator'] !== '=') { $value = $value . '%'; if ($options['match_operator'] != 'STARTS_WITH') { diff --git a/core/modules/views/src/Plugin/views/filter/StringFilter.php b/core/modules/views/src/Plugin/views/filter/StringFilter.php index a9ab5a1..a3f4208 100644 --- a/core/modules/views/src/Plugin/views/filter/StringFilter.php +++ b/core/modules/views/src/Plugin/views/filter/StringFilter.php @@ -4,6 +4,7 @@ use Drupal\Core\Database\Query\Condition; use Drupal\Core\Form\FormStateInterface; +use Symfony\Component\DependencyInjection\ContainerInterface; /** * Basic textfield filter to handle string filtering commands @@ -23,6 +24,43 @@ class StringFilter extends FilterPluginBase { // exposed filter options protected $alwaysMultiple = TRUE; + /** + * The database connection. + * + * @var \Drupal\Core\Database\Connection + */ + protected $connection; + + /** + * Constructs a new StringFilter object. + * + * @param array $configuration + * A configuration array containing information about the plugin instance. + * @param string $plugin_id + * The plugin_id for the plugin instance. + * @param mixed $plugin_definition + * The plugin implementation definition. + * @param \Drupal\Core\Database\Connection $connection + * The database connection. + */ + public function __construct(array $configuration, $plugin_id, $plugin_definition, Connection $connection) { + parent::__construct($configuration, $plugin_id, $plugin_definition); + + $this->connection = $connection; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { + return new static( + $configuration, + $plugin_id, + $plugin_definition, + $container->get('database') + ); + } + protected function defineOptions() { $options = parent::defineOptions(); @@ -236,8 +274,27 @@ protected function valueForm(&$form, FormStateInterface $form_state) { } } + /** + * Overwrite equal operator for complex expressions. + * + * @return string + * Overwritten, database driver specific operator. + */ public function operator() { - return $this->operator == '=' ? 'LIKE' : 'NOT LIKE'; + return $this->getConditionOperator($this->operator == '=' ? 'LIKE' : 'NOT LIKE'); + } + + /** + * Get specified condition operator mapping value. + * + * @param string $operator + * Condition operator. + * @return string + * Specified condition operator mapping value. + */ + public function getConditionOperator($operator) { + $mapping = $this->connection->mapConditionOperator($operator); + return isset($mapping['operator']) ? $mapping['operator'] : $operator; } /** @@ -262,7 +319,7 @@ public function opEqual($field) { } protected function opContains($field) { - $this->query->addWhere($this->options['group'], $field, '%' . db_like($this->value) . '%', 'LIKE'); + $this->query->addWhere($this->options['group'], $field, '%' . $this->connection->escapeLike($this->value) . '%', 'LIKE'); } protected function opContainsWord($field) { @@ -284,7 +341,7 @@ protected function opContainsWord($field) { $words = trim($match[2], ',?!();:-'); $words = $phrase ? [$words] : preg_split('/ /', $words, -1, PREG_SPLIT_NO_EMPTY); foreach ($words as $word) { - $where->condition($field, '%' . db_like(trim($word, " ,!?")) . '%', 'LIKE'); + $where->condition($field, '%' . $this->connection->escapeLike(trim($word, " ,!?")) . '%', 'LIKE'); } } @@ -298,23 +355,23 @@ protected function opContainsWord($field) { } protected function opStartsWith($field) { - $this->query->addWhere($this->options['group'], $field, db_like($this->value) . '%', 'LIKE'); + $this->query->addWhere($this->options['group'], $field, $this->connection->escapeLike($this->value) . '%', 'LIKE'); } protected function opNotStartsWith($field) { - $this->query->addWhere($this->options['group'], $field, db_like($this->value) . '%', 'NOT LIKE'); + $this->query->addWhere($this->options['group'], $field, $this->connection->escapeLike($this->value) . '%', 'NOT LIKE'); } protected function opEndsWith($field) { - $this->query->addWhere($this->options['group'], $field, '%' . db_like($this->value), 'LIKE'); + $this->query->addWhere($this->options['group'], $field, '%' . $this->connection->escapeLike($this->value), 'LIKE'); } protected function opNotEndsWith($field) { - $this->query->addWhere($this->options['group'], $field, '%' . db_like($this->value), 'NOT LIKE'); + $this->query->addWhere($this->options['group'], $field, '%' . $this->connection->escapeLike($this->value), 'NOT LIKE'); } protected function opNotLike($field) { - $this->query->addWhere($this->options['group'], $field, '%' . db_like($this->value) . '%', 'NOT LIKE'); + $this->query->addWhere($this->options['group'], $field, '%' . $this->connection->escapeLike($this->value) . '%', 'NOT LIKE'); } protected function opShorterThan($field) {