diff --git a/mod/data/lib.php b/mod/data/lib.php index d80314cf1aa..54e247c98b6 100644 --- a/mod/data/lib.php +++ b/mod/data/lib.php @@ -32,6 +32,7 @@ define ('DATA_LASTNAME', -2); define ('DATA_APPROVED', -3); define ('DATA_TIMEADDED', 0); define ('DATA_TIMEMODIFIED', -4); +define ('DATA_TAGS', -5); define ('DATA_CAP_EXPORT', 'mod/data:viewalluserpresets'); @@ -680,10 +681,11 @@ function data_generate_default_template(&$data, $template, $recordid=0, $form=fa /** * Build the form elements to manage tags for a record. * - * @param int $recordid + * @param int|bool $recordid + * @param string[] $selected raw tag names * @return string */ -function data_generate_tag_form($recordid) { +function data_generate_tag_form($recordid = false, $selected = []) { global $CFG, $DB, $PAGE; $tagtypestoshow = \core_tag_area::get_showstandard('mod_data', 'data_records'); @@ -694,22 +696,31 @@ function data_generate_tag_form($recordid) { $namefield = empty($CFG->keeptagnamecase) ? 'name' : 'rawname'; - $existingtags = core_tag_tag::get_item_tags_array('mod_data', 'data_records', $recordid); + $tagcollid = \core_tag_area::get_collection('mod_data', 'data_records'); + $tags = []; + $selectedtags = []; if ($showstandard) { - $tags = $DB->get_records_menu('tag', array( - 'isstandard' => 1, - 'tagcollid' => \core_tag_area::get_collection('mod_data', 'data_records') - ), $namefield, 'id,' . $namefield . ' as fieldname'); - - $tags = $existingtags + $tags; - } else { - $tags = $existingtags; + $tags += $DB->get_records_menu('tag', array('isstandard' => 1, 'tagcollid' => $tagcollid), + $namefield, 'id,' . $namefield . ' as fieldname'); } + if ($recordid) { + $selectedtags += core_tag_tag::get_item_tags_array('mod_data', 'data_records', $recordid); + } + + if (!empty($selected)) { + list($sql, $params) = $DB->get_in_or_equal($selected, SQL_PARAMS_NAMED); + $params['tagcollid'] = $tagcollid; + $sql = "SELECT id, $namefield FROM {tag} WHERE tagcollid = :tagcollid AND rawname $sql"; + $selectedtags += $DB->get_records_sql_menu($sql, $params); + } + + $tags += $selectedtags; + $str .= ''; @@ -1894,6 +1905,12 @@ function data_print_preference_form($data, $perpage, $search, $sort='', $order=' $replacement[] = '' . ''; + if (core_tag_tag::is_enabled('mod_data', 'data_records')) { + $patterns[] = "/##tags##/"; + $selectedtags = isset($search_array[DATA_TAGS]->rawtagnames) ? $search_array[DATA_TAGS]->rawtagnames : []; + $replacement[] = data_generate_tag_form(false, $selectedtags); + } + // actual replacement of the tags $newtext = preg_replace($patterns, $replacement, $data->asearchtemplate); @@ -3853,14 +3870,14 @@ function data_get_recordids($alias, $searcharray, $dataid, $recordids) { } list($insql, $params) = $DB->get_in_or_equal($recordids, SQL_PARAMS_NAMED); $nestselect = 'SELECT c' . $alias . '.recordid - FROM {data_content} c' . $alias . ', - {data_fields} f, - {data_records} r, - {user} u '; - $nestwhere = 'WHERE u.id = r.userid - AND f.id = c' . $alias . '.fieldid - AND r.id = c' . $alias . '.recordid - AND r.dataid = :dataid + FROM {data_content} c' . $alias . ' + INNER JOIN {data_fields} f + ON f.id = c' . $alias . '.fieldid + INNER JOIN {data_records} r + ON r.id = c' . $alias . '.recordid + INNER JOIN {user} u + ON u.id = r.userid '; + $nestwhere = 'WHERE r.dataid = :dataid AND c' . $alias .'.recordid ' . $insql . ' AND '; @@ -3871,6 +3888,25 @@ function data_get_recordids($alias, $searcharray, $dataid, $recordids) { } else if ($searchcriteria == DATA_TIMEMODIFIED) { $nestsql = $nestselect . $nestwhere . $nestsearch->field . ' >= :timemodified GROUP BY c' . $alias . '.recordid'; $params['timemodified'] = $nestsearch->data; + } else if ($searchcriteria == DATA_TAGS) { + if (empty($nestsearch->rawtagnames)) { + return []; + } + $i = 0; + $tagwhere = []; + $tagselect = ''; + foreach ($nestsearch->rawtagnames as $tagrawname) { + $tagselect .= " INNER JOIN {tag_instance} AS ti_$i + ON ti_$i.component = 'mod_data' + AND ti_$i.itemtype = 'data_records' + AND ti_$i.itemid = r.id + INNER JOIN {tag} AS t_$i + ON ti_$i.tagid = t_$i.id "; + $tagwhere[] = " t_$i.rawname = :trawname_$i "; + $params["trawname_$i"] = $tagrawname; + $i++; + } + $nestsql = $nestselect . $tagselect . $nestwhere . implode(' AND ', $tagwhere); } else { // First name or last name. $thing = $DB->sql_like($nestsearch->field, ':search1', false); $nestsql = $nestselect . $nestwhere . $thing . ' GROUP BY c' . $alias . '.recordid'; diff --git a/mod/data/locallib.php b/mod/data/locallib.php index afedf5ce132..9ad9b3d7fe5 100644 --- a/mod/data/locallib.php +++ b/mod/data/locallib.php @@ -1147,26 +1147,7 @@ function data_search_entries($data, $cm, $context, $mode, $currentgroup, $search $initialparams['myid3'] = $params['myid2']; } - if (!empty($advanced)) { // If advanced box is checked. - $i = 0; - foreach ($searcharray as $key => $val) { // what does $searcharray hold? - if ($key == DATA_FIRSTNAME or $key == DATA_LASTNAME) { - $i++; - $searchselect .= " AND ".$DB->sql_like($val->field, ":search_flname_$i", false); - $params['search_flname_'.$i] = "%$val->data%"; - continue; - } - if ($key == DATA_TIMEMODIFIED) { - $searchselect .= " AND $val->field >= :timemodified"; - $params['timemodified'] = $val->data; - continue; - } - $advtables .= ', {data_content} c'.$key.' '; - $advwhere .= ' AND c'.$key.'.recordid = r.id'; - $advsearchselect .= ' AND ('.$val->sql.') '; - $advparams = array_merge($advparams, $val->params); - } - } else if ($search) { + if ($search) { $searchselect = " AND (".$DB->sql_like('c.content', ':search1', false)." OR ".$DB->sql_like('u.firstname', ':search2', false)." OR ".$DB->sql_like('u.lastname', ':search3', false)." ) "; @@ -1204,26 +1185,8 @@ function data_search_entries($data, $cm, $context, $mode, $currentgroup, $search $params['myid2'] = $USER->id; $initialparams['myid3'] = $params['myid2']; } - $i = 0; - if (!empty($advanced)) { // If advanced box is checked. - foreach ($searcharray as $key => $val) { // what does $searcharray hold? - if ($key == DATA_FIRSTNAME or $key == DATA_LASTNAME) { - $i++; - $searchselect .= " AND ".$DB->sql_like($val->field, ":search_flname_$i", false); - $params['search_flname_'.$i] = "%$val->data%"; - continue; - } - if ($key == DATA_TIMEMODIFIED) { - $searchselect .= " AND $val->field >= :timemodified"; - $params['timemodified'] = $val->data; - continue; - } - $advtables .= ', {data_content} c'.$key.' '; - $advwhere .= ' AND c'.$key.'.recordid = r.id AND c'.$key.'.fieldid = '.$key; - $advsearchselect .= ' AND ('.$val->sql.') '; - $advparams = array_merge($advparams, $val->params); - } - } else if ($search) { + + if ($search) { $searchselect = " AND (".$DB->sql_like('c.content', ':search1', false)." OR ".$DB->sql_like('u.firstname', ':search2', false)." OR ".$DB->sql_like('u.lastname', ':search3', false)." ) "; @@ -1385,6 +1348,15 @@ function data_build_search_array($data, $paging, $searcharray, $defaults = null, } } + $rawtagnames = optional_param_array('tags', false, PARAM_TAGLIST); + + if ($rawtagnames) { + $searcharray[DATA_TAGS] = new stdClass(); + $searcharray[DATA_TAGS]->params = []; + $searcharray[DATA_TAGS]->rawtagnames = $rawtagnames; + $searcharray[DATA_TAGS]->sql = ''; + } + if (!$paging) { // Name searching. $fn = optional_param('u_fn', $fn, PARAM_NOTAGS);