From c8a804ff688fe2ef25e4f7d6db8708898d9f31d6 Mon Sep 17 00:00:00 2001 From: Juan Leyva Date: Mon, 13 Feb 2017 14:13:09 +0100 Subject: [PATCH] MDL-57920 mod_data: Refactor search array creation --- mod/data/field/checkbox/field.class.php | 14 ++++- mod/data/field/date/field.class.php | 19 +++++-- mod/data/field/file/field.class.php | 8 ++- mod/data/field/latlong/field.class.php | 8 ++- mod/data/field/menu/field.class.php | 10 +++- mod/data/field/multimenu/field.class.php | 14 ++++- mod/data/field/number/field.class.php | 8 ++- mod/data/field/picture/field.class.php | 8 ++- mod/data/field/radiobutton/field.class.php | 10 +++- mod/data/field/text/field.class.php | 8 ++- mod/data/field/textarea/field.class.php | 8 ++- mod/data/field/url/field.class.php | 8 ++- mod/data/locallib.php | 89 ++++++++++++++++++++++++++++++ mod/data/view.php | 74 ++----------------------- 14 files changed, 185 insertions(+), 101 deletions(-) diff --git a/mod/data/field/checkbox/field.class.php b/mod/data/field/checkbox/field.class.php index 9bded8de5c3..d43728bd379 100644 --- a/mod/data/field/checkbox/field.class.php +++ b/mod/data/field/checkbox/field.class.php @@ -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 ''; diff --git a/mod/data/field/date/field.class.php b/mod/data/field/date/field.class.php index 84d3cc49a7f..c488f562cf9 100644 --- a/mod/data/field/date/field.class.php +++ b/mod/data/field/date/field.class.php @@ -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(); diff --git a/mod/data/field/file/field.class.php b/mod/data/field/file/field.class.php index 59be112f07a..af455718aac 100644 --- a/mod/data/field/file/field.class.php +++ b/mod/data/field/file/field.class.php @@ -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) { diff --git a/mod/data/field/latlong/field.class.php b/mod/data/field/latlong/field.class.php index 5f4a182e63f..f4edefa8e6f 100644 --- a/mod/data/field/latlong/field.class.php +++ b/mod/data/field/latlong/field.class.php @@ -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) { diff --git a/mod/data/field/menu/field.class.php b/mod/data/field/menu/field.class.php index eb48b8647d4..e4ac3e0a74e 100644 --- a/mod/data/field/menu/field.class.php +++ b/mod/data/field/menu/field.class.php @@ -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; diff --git a/mod/data/field/multimenu/field.class.php b/mod/data/field/multimenu/field.class.php index 73f496c2a35..fd9c16c383f 100644 --- a/mod/data/field/multimenu/field.class.php +++ b/mod/data/field/multimenu/field.class.php @@ -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 ''; diff --git a/mod/data/field/number/field.class.php b/mod/data/field/number/field.class.php index b29285017cc..d1922b0a7ac 100644 --- a/mod/data/field/number/field.class.php +++ b/mod/data/field/number/field.class.php @@ -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? diff --git a/mod/data/field/picture/field.class.php b/mod/data/field/picture/field.class.php index 9e0e762867d..53e8662c092 100644 --- a/mod/data/field/picture/field.class.php +++ b/mod/data/field/picture/field.class.php @@ -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) { diff --git a/mod/data/field/radiobutton/field.class.php b/mod/data/field/radiobutton/field.class.php index 13bf158d1dc..2cf8827dd2c 100644 --- a/mod/data/field/radiobutton/field.class.php +++ b/mod/data/field/radiobutton/field.class.php @@ -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) { diff --git a/mod/data/field/text/field.class.php b/mod/data/field/text/field.class.php index 74db56b90e3..5cebe66c85f 100644 --- a/mod/data/field/text/field.class.php +++ b/mod/data/field/text/field.class.php @@ -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) { diff --git a/mod/data/field/textarea/field.class.php b/mod/data/field/textarea/field.class.php index 16893c035f9..af0c94a59f2 100644 --- a/mod/data/field/textarea/field.class.php +++ b/mod/data/field/textarea/field.class.php @@ -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) { diff --git a/mod/data/field/url/field.class.php b/mod/data/field/url/field.class.php index f474e2992df..05774f032a3 100644 --- a/mod/data/field/url/field.class.php +++ b/mod/data/field/url/field.class.php @@ -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) { diff --git a/mod/data/locallib.php b/mod/data/locallib.php index ba97d1c156c..f23bc1bc595 100644 --- a/mod/data/locallib.php +++ b/mod/data/locallib.php @@ -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]; +} diff --git a/mod/data/view.php b/mod/data/view.php index 2f5e648656c..1f8399db8cd 100644 --- a/mod/data/view.php +++ b/mod/data/view.php @@ -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! @@ -132,8 +132,6 @@ 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 @@ -155,71 +153,10 @@ 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); @@ -232,9 +169,6 @@ $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); -- 2.11.4.GIT