Skip to content
Snippets Groups Projects
Commit 873c8841 authored by Jan-Hendrik Willms's avatar Jan-Hendrik Willms Committed by Jan-Hendrik Willms
Browse files

fix and restructure MyCoursesSearch, fixes #1606

Closes #1606

Merge request studip/studip!1033
parent 5d0c715a
No related branches found
No related tags found
No related merge requests found
...@@ -483,15 +483,14 @@ class Course_MembersController extends AuthenticatedController ...@@ -483,15 +483,14 @@ class Course_MembersController extends AuthenticatedController
if (!empty($this->flash['users']) || Request::getArray('users')) { if (!empty($this->flash['users']) || Request::getArray('users')) {
$users = $this->flash['users'] ?: Request::getArray('users'); $users = $this->flash['users'] ?: Request::getArray('users');
// create a usable array // create a usable array
foreach ($this->flash['users'] as $user => $val) { foreach ($users as $user => $val) {
if ($val) { if ($val) {
$this->users[] = $user; $this->users[] = $user;
} }
} }
PageLayout::setTitle( _('Zielveranstaltung auswählen')); PageLayout::setTitle( _('Zielveranstaltung auswählen'));
} else { } elseif (Request::isXhr()) {
if (Request::isXhr()) {
$this->response->add_header('X-Dialog-Close', '1'); $this->response->add_header('X-Dialog-Close', '1');
$this->render_nothing(); $this->render_nothing();
} else { } else {
...@@ -499,7 +498,6 @@ class Course_MembersController extends AuthenticatedController ...@@ -499,7 +498,6 @@ class Course_MembersController extends AuthenticatedController
} }
} }
} }
}
/** /**
* Copies or moves selected users to the selected target course. * Copies or moves selected users to the selected target course.
......
...@@ -16,8 +16,6 @@ ...@@ -16,8 +16,6 @@
class MyCoursesSearch extends StandardSearch class MyCoursesSearch extends StandardSearch
{ {
public $search;
private $perm_level; private $perm_level;
private $parameters; private $parameters;
protected $additional_sql_conditions; protected $additional_sql_conditions;
...@@ -34,18 +32,13 @@ class MyCoursesSearch extends StandardSearch ...@@ -34,18 +32,13 @@ class MyCoursesSearch extends StandardSearch
* *
* @return void * @return void
*/ */
public function __construct( public function __construct($search, $perm_level = 'dozent', $parameters = [], $additional_sql_conditions = '')
$search,
$perm_level = 'dozent',
$parameters = [],
$additional_sql_conditions = ''
)
{ {
$this->avatarLike = $this->search = $search; parent::__construct($search);
$this->perm_level = $perm_level; $this->perm_level = $perm_level;
$this->parameters = $parameters; $this->parameters = $parameters;
$this->additional_sql_conditions = $additional_sql_conditions; $this->additional_sql_conditions = trim($additional_sql_conditions);
$this->sql = $this->getSQL();
} }
...@@ -64,15 +57,14 @@ class MyCoursesSearch extends StandardSearch ...@@ -64,15 +57,14 @@ class MyCoursesSearch extends StandardSearch
* Use the contextual_data variable to send more variables than just the input * Use the contextual_data variable to send more variables than just the input
* to the SQL. QuickSearch for example sends all other variables of the same * to the SQL. QuickSearch for example sends all other variables of the same
* <form>-tag here. * <form>-tag here.
* @param input string: the search-word(s) * @param string $input the search-word(s)
* @param contextual_data array: an associative array with more variables * @param array $contextual_data an associative array with more variables
* @param limit int: maximum number of results (default: all) * @param int $limit maximum number of results (default: all)
* @param offset int: return results starting from this row (default: 0) * @param int $offset return results starting from this row (default: 0)
* @return array: array(array(), ...) * @return array: array(array(), ...)
*/ */
public function getResults($input, $contextual_data = [], $limit = PHP_INT_MAX, $offset = 0) public function getResults($input, $contextual_data = [], $limit = PHP_INT_MAX, $offset = 0)
{ {
$db = DBManager::get();
$sql = $this->getSQL(); $sql = $this->getSQL();
if (!$sql) { if (!$sql) {
return []; return [];
...@@ -80,23 +72,13 @@ class MyCoursesSearch extends StandardSearch ...@@ -80,23 +72,13 @@ class MyCoursesSearch extends StandardSearch
if ($offset || $limit != PHP_INT_MAX) { if ($offset || $limit != PHP_INT_MAX) {
$sql .= sprintf(' LIMIT %d, %d', $offset, $limit); $sql .= sprintf(' LIMIT %d, %d', $offset, $limit);
} }
foreach ($this->parameters + $contextual_data as $name => $value) {
if ($name !== "input" && mb_strpos($sql, ":".$name) !== false) { $statement = DBManager::get()->prepare($sql, [PDO::FETCH_NUM]);
if (is_array($value)) { $statement->execute(array_merge(
if (count($value)) { $this->parameters,
$sql = str_replace(":".$name, implode(',', array_map([$db, 'quote'], $value)), $sql); $contextual_data,
} else { [':input' => "%{$input}%"]
$sql = str_replace(":".$name, "''", $sql); ));
}
} else {
$sql = str_replace(":".$name, $db->quote($value), $sql);
}
}
}
$statement = $db->prepare($sql, [PDO::FETCH_NUM]);
$data = [];
$data[":input"] = "%".$input."%";
$statement->execute($data);
$results = $statement->fetchAll(); $results = $statement->fetchAll();
return $results; return $results;
} }
...@@ -116,47 +98,38 @@ class MyCoursesSearch extends StandardSearch ...@@ -116,47 +98,38 @@ class MyCoursesSearch extends StandardSearch
')' ')'
)"; )";
$conditions = implode(' AND ', $this->getConditions());
switch ($this->perm_level) { switch ($this->perm_level) {
// Roots see everything, everywhere. // Roots see everything, everywhere.
case 'root': case 'root':
$query = "SELECT DISTINCT s.`Seminar_id`, CONCAT_WS(' ', s.`VeranstaltungsNummer`, s.`Name`, " . $semester_text . ") $query = "SELECT DISTINCT
s.`Seminar_id`,
CONCAT_WS(' ', s.`VeranstaltungsNummer`, s.`Name`, {$semester_text})
FROM `seminare` s FROM `seminare` s
LEFT JOIN semester_courses ON (s.Seminar_id = semester_courses.course_id) LEFT JOIN semester_courses ON (s.Seminar_id = semester_courses.course_id)
LEFT JOIN `semester_data` ON (semester_data.semester_id = semester_courses.semester_id) LEFT JOIN `semester_data` ON (semester_data.semester_id = semester_courses.semester_id)
WHERE (s.`VeranstaltungsNummer` LIKE :input WHERE {$conditions}
OR s.`Name` LIKE :input) GROUP BY s.Seminar_id ";
AND s.`status` NOT IN (:semtypes)
AND s.`Seminar_id` NOT IN (:exclude)
AND semester_data.`semester_id` IN (:semesters)
";
if ($this->additional_sql_conditions) {
$query .= ' AND ' . $this->additional_sql_conditions . ' ';
}
$query .= " GROUP BY s.Seminar_id ";
if ($semnumber) { if ($semnumber) {
$query .= " ORDER BY MAX(semester_data.`beginn`) DESC, s.`VeranstaltungsNummer`, s.`Name`"; $query .= " ORDER BY MAX(semester_data.`beginn`) DESC, s.`VeranstaltungsNummer`, s.`Name`";
} else { } else {
$query .= " ORDER BY MAX(semester_data.beginn) DESC, s.`VeranstaltungsNummer`, s.`Name`"; $query .= " ORDER BY MAX(semester_data.beginn) DESC, s.`Name`";
} }
return $query; return $query;
// Admins see everything at their assigned institutes. // Admins see everything at their assigned institutes.
case 'admin': case 'admin':
$sem_inst = Config::get()->ALLOW_ADMIN_RELATED_INST ? 'si' : 's'; $sem_inst = Config::get()->ALLOW_ADMIN_RELATED_INST ? 'si' : 's';
$query = "SELECT DISTINCT s.`Seminar_id`, CONCAT_WS(' ', s.`VeranstaltungsNummer`, s.`Name`, " . $semester_text . ") $query = "SELECT DISTINCT
s.`Seminar_id`,
CONCAT_WS(' ', s.`VeranstaltungsNummer`, s.`Name`, {$semester_text})
FROM `seminare` s FROM `seminare` s
JOIN `seminar_inst` si USING (Seminar_id) JOIN `seminar_inst` si USING (Seminar_id)
LEFT JOIN semester_courses ON (s.Seminar_id = semester_courses.course_id) LEFT JOIN semester_courses ON (s.Seminar_id = semester_courses.course_id)
LEFT JOIN `semester_data` ON (semester_data.semester_id = semester_courses.semester_id) LEFT JOIN `semester_data` ON (semester_data.semester_id = semester_courses.semester_id)
WHERE (s.`VeranstaltungsNummer` LIKE :input WHERE {$conditions}
OR s.`Name` LIKE :input) AND {$sem_inst}.`institut_id` IN (:institutes)
AND s.`status` NOT IN (:semtypes) GROUP BY s.Seminar_id ";
AND $sem_inst.`institut_id` IN (:institutes)
AND s.`Seminar_id` NOT IN (:exclude)
AND semester_data.`semester_id` IN (:semesters)";
if ($this->additional_sql_conditions) {
$query .= ' AND ' . $this->additional_sql_conditions . ' ';
}
$query .= " GROUP BY s.Seminar_id ";
if ($semnumber) { if ($semnumber) {
$query .= " ORDER BY MAX(semester_data.`beginn`) DESC, s.`VeranstaltungsNummer`, s.`Name`"; $query .= " ORDER BY MAX(semester_data.`beginn`) DESC, s.`VeranstaltungsNummer`, s.`Name`";
} else { } else {
...@@ -165,37 +138,38 @@ class MyCoursesSearch extends StandardSearch ...@@ -165,37 +138,38 @@ class MyCoursesSearch extends StandardSearch
return $query; return $query;
// non-admins search all their administrable courses. // non-admins search all their administrable courses.
default: default:
$query = "SELECT DISTINCT s.`Seminar_id`, CONCAT_WS(' ', s.`VeranstaltungsNummer`, s.`Name`, " . $semester_text . "), $query = "SELECT DISTINCT
s.`VeranstaltungsNummer` AS num, s.`Name`, MAX(semester_data.beginn) as beginn s.`Seminar_id`,
CONCAT_WS(' ', s.`VeranstaltungsNummer`, s.`Name`, {$semester_text}),
s.`VeranstaltungsNummer` AS num,
s.`Name`,
MAX(semester_data.beginn) AS beginn
FROM `seminare` s FROM `seminare` s
JOIN `seminar_user` su ON (s.`Seminar_id` = su.`Seminar_id`) JOIN `seminar_user` su ON (s.`Seminar_id` = su.`Seminar_id`)
LEFT JOIN semester_courses ON (s.Seminar_id = semester_courses.course_id) LEFT JOIN semester_courses ON (s.Seminar_id = semester_courses.course_id)
LEFT JOIN `semester_data` ON (semester_data.semester_id = semester_courses.semester_id) LEFT JOIN `semester_data` ON (semester_data.semester_id = semester_courses.semester_id)
WHERE (s.`VeranstaltungsNummer` LIKE :input WHERE {$conditions}
OR s.`Name` LIKE :input)
AND su.`user_id` = :userid AND su.`user_id` = :userid
AND su.`status` IN ('dozent','tutor') AND su.`status` IN ('dozent','tutor')
AND s.`status` NOT IN (:semtypes) GROUP BY s.Seminar_id ";
AND s.`Seminar_id` NOT IN (:exclude)
AND semester_data.`semester_id` IN (:semesters)";
if (Config::get()->DEPUTIES_ENABLE) { if (Config::get()->DEPUTIES_ENABLE) {
$query .= " UNION $query .= " UNION ";
SELECT DISTINCT s.`Seminar_id`, CONCAT_WS(' ', s.`VeranstaltungsNummer`, ' ', s.`Name`, " . $semester_text . "), $query .= "SELECT DISTINCT
s.`VeranstaltungsNummer` AS num, s.`Name`, MAX(semester_data.beginn) AS beginn s.`Seminar_id`,
CONCAT_WS(' ', s.`VeranstaltungsNummer`, ' ', s.`Name`, {$semester_text}),
s.`VeranstaltungsNummer` AS num,
s.`Name`,
MAX(semester_data.beginn) AS beginn
FROM `seminare` s FROM `seminare` s
JOIN `deputies` d ON (s.`Seminar_id` = d.`range_id`) JOIN `deputies` d ON (s.`Seminar_id` = d.`range_id`)
LEFT JOIN semester_courses ON (s.Seminar_id = semester_courses.course_id) LEFT JOIN semester_courses ON (s.Seminar_id = semester_courses.course_id)
LEFT JOIN `semester_data` ON (semester_data.semester_id = semester_courses.semester_id) LEFT JOIN `semester_data` ON (semester_data.semester_id = semester_courses.semester_id)
WHERE (s.`VeranstaltungsNummer` LIKE :input WHERE {$conditions}
OR s.`Name` LIKE :input)
AND d.`user_id` = :userid AND d.`user_id` = :userid
AND s.`Seminar_id` NOT IN (:exclude) GROUP BY s.Seminar_id";
AND semester_data.`semester_id` IN (:semesters)";
}
if ($this->additional_sql_conditions) {
$query .= ' AND ' . $this->additional_sql_conditions . ' ';
} }
$query .= " GROUP BY s.Seminar_id";
if ($semnumber) { if ($semnumber) {
$query .= " ORDER BY beginn DESC, num, `Name`"; $query .= " ORDER BY beginn DESC, num, `Name`";
} else { } else {
...@@ -206,6 +180,27 @@ class MyCoursesSearch extends StandardSearch ...@@ -206,6 +180,27 @@ class MyCoursesSearch extends StandardSearch
} }
} }
/**
* Returns the default conditions use by all searches as a list.
*
* @return array
*/
private function getConditions(): array
{
$conditions = [
'(s.`VeranstaltungsNummer` LIKE :input OR s.`Name` LIKE :input)',
's.`status` NOT IN (:semtypes)',
's.`Seminar_id` NOT IN (:exclude)',
'semester_data.`semester_id` IN (:semesters)'
];
if ($this->additional_sql_conditions) {
$conditions[] = $this->additional_sql_conditions;
}
return $conditions;
}
/** /**
* A very simple overwrite of the same method from SearchType class. * A very simple overwrite of the same method from SearchType class.
* returns the absolute path to this class for autoincluding this class. * returns the absolute path to this class for autoincluding this class.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment