From b03efbf5e469025f008cd85f92b0f04114914cdb Mon Sep 17 00:00:00 2001
From: catch <catch@35733.no-reply.drupal.org>
Date: Thu, 4 Apr 2013 21:35:14 +0100
Subject: [PATCH] Issue #1785318 by peterpoe, dawehner, dagmar, damiankloip:
 Fixed Grouped filter doesn't allow you to use fields without a value.

---
 .../Plugin/views/filter/FilterPluginBase.php  |  4 +-
 .../views/Tests/Plugin/ExposedFormTest.php    | 11 +++++
 .../views.view.test_exposed_admin_ui.yml      | 40 +++++++++++++++++++
 3 files changed, 54 insertions(+), 1 deletion(-)

diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/filter/FilterPluginBase.php b/core/modules/views/lib/Drupal/views/Plugin/views/filter/FilterPluginBase.php
index e93b0de2f482..6d262c4748f3 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/filter/FilterPluginBase.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/filter/FilterPluginBase.php
@@ -635,11 +635,13 @@ function build_group_validate($form, &$form_state) {
     }
 
     if (!empty($form_state['values']['options']['group_info']['group_items'])) {
+      $operators = $this->operators();
+
       foreach ($form_state['values']['options']['group_info']['group_items'] as $id => $group) {
         if (empty($group['remove'])) {
 
           // Check if the title is defined but value wasn't defined.
-          if (!empty($group['title'])) {
+          if (!empty($group['title']) && $operators[$group['operator']]['values'] > 0) {
             if ((!is_array($group['value']) && trim($group['value']) == "") ||
                 (is_array($group['value']) && count(array_filter($group['value'], 'static::arrayFilterZero')) == 0)) {
               form_error($form['group_info']['group_items'][$id]['value'],
diff --git a/core/modules/views/lib/Drupal/views/Tests/Plugin/ExposedFormTest.php b/core/modules/views/lib/Drupal/views/Tests/Plugin/ExposedFormTest.php
index e4755bc1c2cd..4454101a1988 100644
--- a/core/modules/views/lib/Drupal/views/Tests/Plugin/ExposedFormTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/Plugin/ExposedFormTest.php
@@ -180,6 +180,17 @@ function testExposedAdminUi() {
     $edit["options[group_info][group_items][3][value][page]"] = TRUE;
     $this->drupalPost(NULL, $edit, t('Apply'));
 
+    // Select the empty operator, so the empty value should not trigger a form
+    // error.
+    $this->drupalGet('admin/structure/views/nojs/config-item/test_exposed_admin_ui/default/filter/body_value');
+    $edit = array();
+    $edit["options[group_info][group_items][1][title]"] = $this->randomName();
+    $edit["options[group_info][group_items][1][operator]"] = 'empty';
+    $this->drupalPost(NULL, $edit, t('Apply'));
+    $this->assertUrl('admin/structure/views/view/test_exposed_admin_ui/edit/default', array(), 'Validation did not run for the empty operator.');
+    // Test the validation error message text is not shown.
+    $this->assertNoText(t('The value is required if title for this item is defined.'));
+
     // Validate that all the titles are defined for each group
     $this->drupalGet('admin/structure/views/nojs/config-item/test_exposed_admin_ui/default/filter/type');
     $edit = array();
diff --git a/core/modules/views/tests/views_test_config/test_views/views.view.test_exposed_admin_ui.yml b/core/modules/views/tests/views_test_config/test_views/views.view.test_exposed_admin_ui.yml
index 804620c5cf10..e4dde6f038ce 100644
--- a/core/modules/views/tests/views_test_config/test_views/views.view.test_exposed_admin_ui.yml
+++ b/core/modules/views/tests/views_test_config/test_views/views.view.test_exposed_admin_ui.yml
@@ -23,6 +23,46 @@ display:
           id: type
           table: node
           plugin_id: node_type
+        body_value:
+          id: body_value
+          table: field_data_body
+          field: body_value
+          relationship: none
+          group_type: group
+          admin_label: ''
+          operator: '='
+          value: ''
+          group: '1'
+          exposed: '1'
+          expose:
+            operator_id: body_value_op
+            label: 'Body (body)'
+            description: ''
+            use_operator: '0'
+            operator: body_value_op
+            identifier: body_value
+            required: '0'
+            remember: '0'
+            multiple: '0'
+            remember_roles:
+              authenticated: authenticated
+          is_grouped: '1'
+          group_info:
+            label: 'Body (body)'
+            description: ''
+            identifier: body_value
+            optional: '1'
+            widget: select
+            multiple: '0'
+            remember: '0'
+            default_group: All
+            default_group_multiple: {  }
+            group_items:
+              1:
+                title: Test
+                operator: empty
+                value: ''
+          plugin_id: string
       pager:
         type: full
       sorts:
-- 
GitLab