MDL-57920 mod_data: Refactor search array creation
authorJuan Leyva <juanleyvadelgado@gmail.com>
Mon, 13 Feb 2017 13:13:09 +0000 (14:13 +0100)
committerEloy Lafuente (stronk7) <stronk7@moodle.org>
Wed, 29 Mar 2017 23:53:35 +0000 (01:53 +0200)
14 files changed:
mod/data/field/checkbox/field.class.php
mod/data/field/date/field.class.php
mod/data/field/file/field.class.php
mod/data/field/latlong/field.class.php
mod/data/field/menu/field.class.php
mod/data/field/multimenu/field.class.php
mod/data/field/number/field.class.php
mod/data/field/picture/field.class.php
mod/data/field/radiobutton/field.class.php
mod/data/field/text/field.class.php
mod/data/field/textarea/field.class.php
mod/data/field/url/field.class.php
mod/data/locallib.php
mod/data/view.php

index 9bded8d..d43728b 100644 (file)
@@ -114,9 +114,17 @@ class data_field_checkbox extends data_field_base {
         return $str;
     }
 
-    function parse_search_field() {
-        $selected    = optional_param_array('f_'.$this->field->id, array(), PARAM_NOTAGS);
-        $allrequired = optional_param('f_'.$this->field->id.'_allreq', 0, PARAM_BOOL);
+    public function parse_search_field($defaults = null) {
+        $paramselected = 'f_'.$this->field->id;
+        $paramallrequired = 'f_'.$this->field->id.'_allreq';
+
+        if (empty($defaults[$paramselected])) { // One empty means the other ones are empty too.
+            $defaults = array($paramselected => array(), $paramallrequired => 0);
+        }
+
+        $selected    = optional_param_array($paramselected, $defaults[$paramselected], PARAM_NOTAGS);
+        $allrequired = optional_param($paramallrequired, $defaults[$paramallrequired], PARAM_BOOL);
+
         if (empty($selected)) {
             // no searching
             return '';
index 84d3cc4..c488f56 100644 (file)
@@ -93,11 +93,20 @@ class data_field_date extends data_field_base {
         return array(" ({$tablealias}.fieldid = {$this->field->id} AND $varcharcontent = :$name) ", array($name => $value['timestamp']));
     }
 
-    function parse_search_field() {
-        $day   = optional_param('f_'.$this->field->id.'_d', 0, PARAM_INT);
-        $month = optional_param('f_'.$this->field->id.'_m', 0, PARAM_INT);
-        $year  = optional_param('f_'.$this->field->id.'_y', 0, PARAM_INT);
-        $usedate = optional_param('f_'.$this->field->id.'_z', 0, PARAM_INT);
+    public function parse_search_field($defaults = null) {
+        $paramday = 'f_'.$this->field->id.'_d';
+        $parammonth = 'f_'.$this->field->id.'_m';
+        $paramyear = 'f_'.$this->field->id.'_y';
+        $paramusedate = 'f_'.$this->field->id.'_z';
+        if (empty($defaults[$paramday])) {  // One empty means the other ones are empty too.
+            $defaults = array($paramday => 0, $parammonth => 0, $paramyear => 0, $paramusedate => 0);
+        }
+
+        $day   = optional_param($paramday, $defaults[$paramday], PARAM_INT);
+        $month = optional_param($parammonth, $defaults[$parammonth], PARAM_INT);
+        $year  = optional_param($paramyear, $defaults[$paramyear], PARAM_INT);
+        $usedate = optional_param($paramusedate, $defaults[$paramusedate], PARAM_INT);
+
         $data = array();
         if (!empty($day) && !empty($month) && !empty($year) && $usedate == 1) {
             $calendartype = \core_calendar\type_factory::get_calendar_instance();
index 59be112..af45571 100644 (file)
@@ -116,8 +116,12 @@ class data_field_file extends data_field_base {
         return array(" ({$tablealias}.fieldid = {$this->field->id} AND ".$DB->sql_like("{$tablealias}.content", ":$name", false).") ", array($name=>"%$value%"));
     }
 
-    function parse_search_field() {
-        return optional_param('f_'.$this->field->id, '', PARAM_NOTAGS);
+    public function parse_search_field($defaults = null) {
+        $param = 'f_'.$this->field->id;
+        if (empty($defaults[$param])) {
+            $defaults = array($param => '');
+        }
+        return optional_param($param, $defaults[$param], PARAM_NOTAGS);
     }
 
     function get_file($recordid, $content=null) {
index 5f4a182..f4edefa 100644 (file)
@@ -115,8 +115,12 @@ class data_field_latlong extends data_field_base {
        return $return;
     }
 
-    function parse_search_field() {
-        return optional_param('f_'.$this->field->id, '', PARAM_NOTAGS);
+    public function parse_search_field($defaults = null) {
+        $param = 'f_'.$this->field->id;
+        if (empty($defaults[$param])) {
+            $defaults = array($param => '');
+        }
+        return optional_param($param, $defaults[$param], PARAM_NOTAGS);
     }
 
     function generate_sql($tablealias, $value) {
index eb48b86..e4ac3e0 100644 (file)
@@ -108,9 +108,13 @@ class data_field_menu extends data_field_base {
         return $return;
     }
 
-     function parse_search_field() {
-            return optional_param('f_'.$this->field->id, '', PARAM_NOTAGS);
-     }
+    public function parse_search_field($defaults = null) {
+        $param = 'f_'.$this->field->id;
+        if (empty($defaults[$param])) {
+            $defaults = array($param => '');
+        }
+        return optional_param($param, $defaults[$param], PARAM_NOTAGS);
+    }
 
     function generate_sql($tablealias, $value) {
         global $DB;
index 73f496c..fd9c16c 100644 (file)
@@ -146,9 +146,17 @@ class data_field_multimenu extends data_field_base {
 
     }
 
-    function parse_search_field() {
-        $selected    = optional_param_array('f_'.$this->field->id, array(), PARAM_NOTAGS);
-        $allrequired = optional_param('f_'.$this->field->id.'_allreq', 0, PARAM_BOOL);
+    public function parse_search_field($defaults = null) {
+        $paramselected = 'f_'.$this->field->id;
+        $paramallrequired = 'f_'.$this->field->id.'_allreq';
+
+        if (empty($defaults[$paramselected])) { // One empty means the other ones are empty too.
+            $defaults = array($paramselected => array(), $paramallrequired => 0);
+        }
+
+        $selected    = optional_param_array($paramselected, $defaults[$paramselected], PARAM_NOTAGS);
+        $allrequired = optional_param($paramallrequired, $defaults[$paramallrequired], PARAM_BOOL);
+
         if (empty($selected)) {
             // no searching
             return '';
index b292850..d1922b0 100644 (file)
@@ -75,8 +75,12 @@ class data_field_number extends data_field_base {
                'value="'.s($value).'" class="form-control d-inline"/>';
     }
 
-    function parse_search_field() {
-        return optional_param('f_'.$this->field->id, '', PARAM_NOTAGS);
+    public function parse_search_field($defaults = null) {
+        $param = 'f_'.$this->field->id;
+        if (empty($defaults[$param])) {
+            $defaults = array($param => '');
+        }
+        return optional_param($param, $defaults[$param], PARAM_NOTAGS);
     }
 
     // need to cast?
index 9e0e762..53e8662 100644 (file)
@@ -145,8 +145,12 @@ class data_field_picture extends data_field_base {
                'value="' . s($value) . '" class="form-control"/>';
     }
 
-    function parse_search_field() {
-        return optional_param('f_'.$this->field->id, '', PARAM_NOTAGS);
+    public function parse_search_field($defaults = null) {
+        $param = 'f_'.$this->field->id;
+        if (empty($defaults[$param])) {
+            $defaults = array($param => '');
+        }
+        return optional_param($param, $defaults[$param], PARAM_NOTAGS);
     }
 
     function generate_sql($tablealias, $value) {
index 13bf158..2cf8827 100644 (file)
@@ -85,7 +85,7 @@ class data_field_radiobutton extends data_field_base {
         return $str;
     }
 
-     function display_search_field($value = '') {
+    function display_search_field($value = '') {
         global $CFG, $DB;
 
         $varcharcontent = $DB->sql_compare_text('content', 255);
@@ -107,8 +107,12 @@ class data_field_radiobutton extends data_field_base {
         return $return;
     }
 
-    function parse_search_field() {
-        return optional_param('f_'.$this->field->id, '', PARAM_NOTAGS);
+    public function parse_search_field($defaults = null) {
+        $param = 'f_'.$this->field->id;
+        if (empty($defaults[$param])) {
+            $defaults = array($param => '');
+        }
+        return optional_param($param, $defaults[$param], PARAM_NOTAGS);
     }
 
     function generate_sql($tablealias, $value) {
index 74db56b..5cebe66 100644 (file)
@@ -38,8 +38,12 @@ class data_field_text extends data_field_base {
                'name="f_' . $this->field->id . '" value="' . s($value) . '" />';
     }
 
-    function parse_search_field() {
-        return optional_param('f_'.$this->field->id, '', PARAM_NOTAGS);
+    public function parse_search_field($defaults = null) {
+        $param = 'f_'.$this->field->id;
+        if (empty($defaults[$param])) {
+            $defaults = array($param => '');
+        }
+        return optional_param($param, $defaults[$param], PARAM_NOTAGS);
     }
 
     function generate_sql($tablealias, $value) {
index 16893c0..af0c94a 100644 (file)
@@ -175,8 +175,12 @@ class data_field_textarea extends data_field_base {
                'value="' . s($value) . '" class="form-control"/>';
     }
 
-    function parse_search_field() {
-        return optional_param('f_'.$this->field->id, '', PARAM_NOTAGS);
+    public function parse_search_field($defaults = null) {
+        $param = 'f_'.$this->field->id;
+        if (empty($defaults[$param])) {
+            $defaults = array($param => '');
+        }
+        return optional_param($param, $defaults[$param], PARAM_NOTAGS);
     }
 
     function generate_sql($tablealias, $value) {
index f474e29..05774f0 100644 (file)
@@ -120,8 +120,12 @@ class data_field_url extends data_field_base {
                ' name="f_' . $this->field->id . '" value="' . s($value) . '" class="form-control d-inline"/>';
     }
 
-    function parse_search_field() {
-        return optional_param('f_'.$this->field->id, '', PARAM_NOTAGS);
+    public function parse_search_field($defaults = null) {
+        $param = 'f_'.$this->field->id;
+        if (empty($defaults[$param])) {
+            $defaults = array($param => '');
+        }
+        return optional_param($param, $defaults[$param], PARAM_NOTAGS);
     }
 
     function generate_sql($tablealias, $value) {
index ba97d1c..f23bc1b 100644 (file)
@@ -798,6 +798,10 @@ function data_search_entries($data, $cm, $context, $mode, $currentgroup, $search
         $searcharray = array();
     }
 
+    if (core_text::strlen($search) < 2) {
+        $search = '';
+    }
+
     $approvecap = has_capability('mod/data:approve', $context);
     $canmanageentries = has_capability('mod/data:manageentries', $context);
 
@@ -1077,3 +1081,88 @@ function data_get_field_instances($data) {
     }
     return $instances;
 }
+
+/**
+ * Build the search array.
+ *
+ * @param  stdClass $data      the database object
+ * @param  bool $paging        if paging is being used
+ * @param  array $searcharray  the current search array (saved by session)
+ * @param  array $defaults     default values for the searchable fields
+ * @param  str $fn             the first name to search (optional)
+ * @param  str $ln             the last name to search (optional)
+ * @return array               the search array and plain search build based on the different elements
+ * @since  Moodle 3.3
+ */
+function data_build_search_array($data, $paging, $searcharray, $defaults = null, $fn = '', $ln = '') {
+    global $DB;
+
+    $search = '';
+    $vals = array();
+    $fields = $DB->get_records('data_fields', array('dataid' => $data->id));
+
+    if (!empty($fields)) {
+        foreach ($fields as $field) {
+            $searchfield = data_get_field_from_id($field->id, $data);
+            // Get field data to build search sql with.  If paging is false, get from user.
+            // If paging is true, get data from $searcharray which is obtained from the $SESSION (see line 116).
+            if (!$paging) {
+                $val = $searchfield->parse_search_field($defaults);
+            } else {
+                // Set value from session if there is a value @ the required index.
+                if (isset($searcharray[$field->id])) {
+                    $val = $searcharray[$field->id]->data;
+                } else { // If there is not an entry @ the required index, set value to blank.
+                    $val = '';
+                }
+            }
+            if (!empty($val)) {
+                $searcharray[$field->id] = new stdClass();
+                list($searcharray[$field->id]->sql, $searcharray[$field->id]->params) = $searchfield->generate_sql('c'.$field->id, $val);
+                $searcharray[$field->id]->data = $val;
+                $vals[] = $val;
+            } else {
+                // Clear it out.
+                unset($searcharray[$field->id]);
+            }
+        }
+    }
+
+    if (!$paging) {
+        // Name searching.
+        $fn = optional_param('u_fn', $fn, PARAM_NOTAGS);
+        $ln = optional_param('u_ln', $ln, PARAM_NOTAGS);
+    } else {
+        $fn = isset($searcharray[DATA_FIRSTNAME]) ? $searcharray[DATA_FIRSTNAME]->data : '';
+        $ln = isset($searcharray[DATA_LASTNAME]) ? $searcharray[DATA_LASTNAME]->data : '';
+    }
+    if (!empty($fn)) {
+        $searcharray[DATA_FIRSTNAME] = new stdClass();
+        $searcharray[DATA_FIRSTNAME]->sql    = '';
+        $searcharray[DATA_FIRSTNAME]->params = array();
+        $searcharray[DATA_FIRSTNAME]->field  = 'u.firstname';
+        $searcharray[DATA_FIRSTNAME]->data   = $fn;
+        $vals[] = $fn;
+    } else {
+        unset($searcharray[DATA_FIRSTNAME]);
+    }
+    if (!empty($ln)) {
+        $searcharray[DATA_LASTNAME] = new stdClass();
+        $searcharray[DATA_LASTNAME]->sql     = '';
+        $searcharray[DATA_LASTNAME]->params = array();
+        $searcharray[DATA_LASTNAME]->field   = 'u.lastname';
+        $searcharray[DATA_LASTNAME]->data    = $ln;
+        $vals[] = $ln;
+    } else {
+        unset($searcharray[DATA_LASTNAME]);
+    }
+
+    // In case we want to switch to simple search later - there might be multiple values there ;-).
+    if ($vals) {
+        $val = reset($vals);
+        if (is_string($val)) {
+            $search = $val;
+        }
+    }
+    return [$searcharray, $search];
+}
index 2f5e648..1f8399d 100644 (file)
@@ -23,7 +23,7 @@
 ///////////////////////////////////////////////////////////////////////////
 
     require_once(__DIR__ . '/../../config.php');
-    require_once($CFG->dirroot . '/mod/data/lib.php');
+    require_once($CFG->dirroot . '/mod/data/locallib.php');
     require_once($CFG->libdir . '/rsslib.php');
 
 /// One of these is necessary!
 
     if (!empty($advanced)) {
         $search = '';
-        $vals = array();
-        $fields = $DB->get_records('data_fields', array('dataid'=>$data->id));
 
         //Added to ammend paging error. This error would occur when attempting to go from one page of advanced
         //search results to another.  All fields were reset in the page transfer, and there was no way of determining
         else {
             $paging = true;
         }
-        if (!empty($fields)) {
-            foreach($fields as $field) {
-                $searchfield = data_get_field_from_id($field->id, $data);
-                //Get field data to build search sql with.  If paging is false, get from user.
-                //If paging is true, get data from $search_array which is obtained from the $SESSION (see line 116).
-                if(!$paging) {
-                    $val = $searchfield->parse_search_field();
-                } else {
-                    //Set value from session if there is a value @ the required index.
-                    if (isset($search_array[$field->id])) {
-                        $val = $search_array[$field->id]->data;
-                    } else {             //If there is not an entry @ the required index, set value to blank.
-                        $val = '';
-                    }
-                }
-                if (!empty($val)) {
-                    $search_array[$field->id] = new stdClass();
-                    list($search_array[$field->id]->sql, $search_array[$field->id]->params) = $searchfield->generate_sql('c'.$field->id, $val);
-                    $search_array[$field->id]->data = $val;
-                    $vals[] = $val;
-                } else {
-                    // clear it out
-                    unset($search_array[$field->id]);
-                }
-            }
-        }
 
-        if (!$paging) {
-            // name searching
-            $fn = optional_param('u_fn', '', PARAM_NOTAGS);
-            $ln = optional_param('u_ln', '', PARAM_NOTAGS);
-        } else {
-            $fn = isset($search_array[DATA_FIRSTNAME]) ? $search_array[DATA_FIRSTNAME]->data : '';
-            $ln = isset($search_array[DATA_LASTNAME]) ? $search_array[DATA_LASTNAME]->data : '';
-        }
-        if (!empty($fn)) {
-            $search_array[DATA_FIRSTNAME] = new stdClass();
-            $search_array[DATA_FIRSTNAME]->sql    = '';
-            $search_array[DATA_FIRSTNAME]->params = array();
-            $search_array[DATA_FIRSTNAME]->field  = 'u.firstname';
-            $search_array[DATA_FIRSTNAME]->data   = $fn;
-            $vals[] = $fn;
-        } else {
-            unset($search_array[DATA_FIRSTNAME]);
-        }
-        if (!empty($ln)) {
-            $search_array[DATA_LASTNAME] = new stdClass();
-            $search_array[DATA_LASTNAME]->sql     = '';
-            $search_array[DATA_LASTNAME]->params = array();
-            $search_array[DATA_LASTNAME]->field   = 'u.lastname';
-            $search_array[DATA_LASTNAME]->data    = $ln;
-            $vals[] = $ln;
-        } else {
-            unset($search_array[DATA_LASTNAME]);
-        }
-
-        $SESSION->dataprefs[$data->id]['search_array'] = $search_array;     // Make it sticky
-
-        // in case we want to switch to simple search later - there might be multiple values there ;-)
-        if ($vals) {
-            $val = reset($vals);
-            if (is_string($val)) {
-                $search = $val;
-            }
-        }
+        // Now build the advanced search array.
+        list($search_array, $search) = data_build_search_array($data, $paging, $search_array);
+        $SESSION->dataprefs[$data->id]['search_array'] = $search_array;     // Make it sticky.
 
     } else {
         $search = optional_param('search', $SESSION->dataprefs[$data->id]['search'], PARAM_NOTAGS);
         $search = '';
     }
 
-    if (core_text::strlen($search) < 2) {
-        $search = '';
-    }
     $SESSION->dataprefs[$data->id]['search'] = $search;   // Make it sticky
 
     $sort = optional_param('sort', $SESSION->dataprefs[$data->id]['sort'], PARAM_INT);