Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
Stud.IP
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Jan-Hendrik Willms
Stud.IP
Commits
873c8841
Commit
873c8841
authored
2 years ago
by
Jan-Hendrik Willms
Committed by
Jan-Hendrik Willms
2 years ago
Browse files
Options
Downloads
Patches
Plain Diff
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
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
app/controllers/course/members.php
+4
-6
4 additions, 6 deletions
app/controllers/course/members.php
lib/classes/searchtypes/MyCoursesSearch.class.php
+87
-92
87 additions, 92 deletions
lib/classes/searchtypes/MyCoursesSearch.class.php
with
91 additions
and
98 deletions
app/controllers/course/members.php
+
4
−
6
View file @
873c8841
...
@@ -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.
...
...
This diff is collapsed.
Click to expand it.
lib/classes/searchtypes/MyCoursesSearch.class.php
+
87
−
92
View file @
873c8841
...
@@ -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.
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment