MDL-57920 mod_data: Refactor search array creation

This commit is contained in:
Juan Leyva 2017-02-13 14:13:09 +01:00 committed by Eloy Lafuente (stronk7)
parent 4f164a3e2d
commit c8a804ff68
14 changed files with 185 additions and 101 deletions

View 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 '';

View 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();

View 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) {

View 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) {

View 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;

View 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 '';

View 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?

View 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) {

View 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) {

View 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) {

View 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) {

View 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) {

View 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];
}

View 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!
@ -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);