diff options
| author | Philipp Schüttlöffel <schuettloeffel@zqs.uni-hannover.de> | 2024-09-24 10:53:31 +0200 |
|---|---|---|
| committer | Philipp Schüttlöffel <schuettloeffel@zqs.uni-hannover.de> | 2024-09-24 10:53:31 +0200 |
| commit | 4459dd7917f4d1c34f40bb68f0e991e9c3d53e4c (patch) | |
| tree | 5c07151ae61276d334e88f6309c30d439a85c12e /lib/classes/MultiPersonSearch.php | |
| parent | da0022e5c1abbf9825ae76debaabdff7e8623bb4 (diff) | |
| parent | 97a188592c679890a25c37ab78463add76a52ff7 (diff) | |
Merge branch 'main' into issue-3911issue-3911
Diffstat (limited to 'lib/classes/MultiPersonSearch.php')
| -rw-r--r-- | lib/classes/MultiPersonSearch.php | 548 |
1 files changed, 548 insertions, 0 deletions
diff --git a/lib/classes/MultiPersonSearch.php b/lib/classes/MultiPersonSearch.php new file mode 100644 index 0000000..3ca617b --- /dev/null +++ b/lib/classes/MultiPersonSearch.php @@ -0,0 +1,548 @@ +<?php +/** + * MultiPersonSearch.php + * + * This class provides a GUI-element for searching, adding and removing + * multiple persons. If JavaScript is enabled the GUI-element is shown + * as a dialog on the current page. Otherwise the GUI-element is shown + * on a separate page. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * he License, or (at your option) any later version. + * + * @author Sebastian Hobert <sebastian.hobert@uni-goettingen.de> + * @license http://www.gnu.org/licenses/gpl-2.0.html GPL version 2 + * @category Stud.IP + * @link http://docs.studip.de/develop/Entwickler/MultiPersonSearch + */ +class MultiPersonSearch { + + private $name; + private $linkIconPath = ""; + private $linkText = ""; + private $title = ""; + private $description = ""; + private $executeURL; + private $jsFunction = null; + private $pageURL = null; + private $quickfilterIds = []; + private $defaultSelectableUsersIDs = []; + private $defaultSelectedUsersIDs = []; + private $searchObject = null; + private $additionalHMTL = ""; + private $navigationItem = ""; + private $dataDialogStatus = false; + + /** + * restores a MultiPersonSearch object. + * + * @param string name of the object + * + * @return MultiPersonSearch + */ + public static function load($name) + { + $mp = new MultiPersonSearch($name); + $mp->restoreFromSession(); + return $mp; + } + + /** + * returns a MultiPersonSearch object. + * + * @param string name of the object + * + * @return MultiPersonSearch + */ + public static function get($name) + { + $mp = new MultiPersonSearch($name); + return $mp; + } + + /** + * contsructs a new MultiPersonSearch object. + * + * @param string name of the object and html ids + */ + public function __construct($name) + { + $this->name = $name; + $_SESSION['multipersonsearch'][$this->name]['lastUse'] = time(); + $this->collectGarbage(); + $this->setDefaultValues(); + + } + + /** + * returns the newly added persons. The array will contain all + * persons which are selected (on the right side of the dialog) but + * without the defaultSelectedUsers. + * + * @return array containing all new persons + */ + public function getAddedUsers() { + return $_SESSION['multipersonsearch'][$this->name]['added'] ?? []; + } + + /** + * saves the added persons to $_SESSION. + */ + public function saveAddedUsersToSession() { + $addedUsers = []; + foreach (Request::optionArray($this->name . '_selectbox') as $selected) { + if (!in_array($selected, $_SESSION['multipersonsearch'][$this->name]['defaultSelectedUsersIDs'])) { + $addedUsers[] = $selected; + } + } + $_SESSION['multipersonsearch'][$this->name]['added'] = $addedUsers; + $_SESSION['multipersonsearch'][$this->name]['additional'] = Request::optionArray('additional'); + } + + /** + * returns the removed persons. The array will contain all + * persons which were selected by default (on the right side of the + * dialog) and then removed by the user. + * + * @return array containing all removed persons + */ + public function getRemovedUsers() { + return $_SESSION['multipersonsearch'][$this->name]['removed']; + } + + /** + * saves the removed persons to $_SESSION. + */ + public function saveRemovedUsersToSession() { + $removedUsers = []; + foreach ($this->defaultSelectedUsersIDs as $default) { + if (!in_array($default, Request::optionArray($this->name . '_selectbox'))) { + $removedUsers[] = $default; + } + } + $_SESSION['multipersonsearch'][$this->name]['removed'] = $removedUsers; + } + + /** + * renders a link to open the multipersonsearch dialog. + * + * @param string $with_link_text include link text in output + */ + public function render($with_link_text = true) { + $template = $GLOBALS['template_factory']->open('multipersonsearch/link.php'); + + $template->set_attribute('linkIconPath', $this->linkIconPath); + $template->set_attribute('linkText', $with_link_text ? $this->linkText : ''); + $template->set_attribute('title', $this->title); + $template->set_attribute('name', $this->name); + $template->set_attribute('description', $this->description); + $template->set_attribute('executeURL', $this->executeURL); + $template->set_attribute('jsFunction', $this->jsFunction); + $this->storeToSession(); + return $template->render(); + } + + /** + * sets the icon of the link to open the dialog. To hide the icon an + * empty string can be set. + * + * @param string path ot the icon + * + * @return MultiPersonSearch + */ + public function setLinkIconPath($path) { + $this->linkIconPath = $path; + + return $this; + } + + /** + * returns the icon of the link to open the dialog. + * + * @return string path ot the icon. + */ + public function getLinkIconPath() { + return $this->linkIconPath; + } + + /** + * sets the link text of the link to open the dialog. To hide the + * text an empty string can be set. + * + * @param string text of the link + * + * @return MultiPersonSearch + * + */ + public function setLinkText($text = "") { + $this->linkText = $text; + + return $this; + } + + /** + * returns the link text of the link. + * + * @return string text of the link. + */ + public function getLinkText() { + return $this->linkText; + } + + /** + * sets the action which will handle the added and removed persons after saving the dialog. + * + * @param string action + * + * @return MultiPersonSearch + */ + public function setExecuteURL($action) { + $this->executeURL = $action; + + return $this; + } + + /** + * returns the action which will handle the added and removed persons after saving the dialog. + * + * @return string action which will handle the form data. + */ + public function getExecuteURL() { + return $this->executeURL; + } + + /** + * sets a JavaScript-function to be fired when the user has pressed the submit-button. + * Arguments are: + * function fireme(id_of_item, text_of_item) + * example setting: MPS->setJSFunctionOnSubmit('fireme'); + * + * @param string $function_name the name of the javascript function + * + * @return MultiPersonSearch + */ + public function setJSFunctionOnSubmit($function_name) + { + $this->jsFunction = $function_name; + return $this; + } + + /** + * returns a JavaScript-function which should be fired when the user has pressed the submit button. + * + * @return string function name + */ + public function getJSFunctionOnSubmit() + { + return $this->jsFunction; + } + + /** + * sets the search object. + * + * @param SearchType object of type SearchType (e.g. SQLSearch.php) + * + * @return MultiPersonSearch + */ + public function setSearchObject($searchType) { + $this->searchObject = $searchType; + + return $this; + } + + /** + * returns the search object. + * + * @return SearchType + */ + public function getSearchObject() { + return $this->searchObject; + } + + /** + * sets html code which will be shown inside the form element. + * + * @param string html code + * + * @return MultiPersonSearch + */ + public function setAdditionalHTML($html) { + $this->additionalHMTL = $html; + + return $this; + } + + + /** + * enables or disabled data-dialog + * @param boolean $status + * @return $this + */ + public function setDataDialogStatus($status) { + $this->dataDialogStatus = $status; + + return $this; + } + + /** + * returns if data-dialog is enabled or disabled + * @return bool + */ + public function getDataDialogStatus() { + return $this->dataDialogStatus; + } + /** + * returns html code which will be shown inside the form element. + * + * @return string html code + */ + public function getAdditionHTML() { + return $this->additionalHMTL; + } + + /** + * returns an additional option array. + * + * @return string html code + */ + public function getAdditionalOptionArray() { + return $_SESSION['multipersonsearch'][$this->name]['additional']; + } + + /** + * sets the persons which will be shown as selectable by default on + * the left side of the dialoag. + * + * @param array array containing user-ids + */ + public function setDefaultSelectableUser($userArray) { + $userArray = array_unique($userArray); + $this->defaultSelectableUsersIDs = []; + if (is_array($userArray)) { + foreach ($userArray as $userId) { + $this->defaultSelectableUsersIDs[] = $userId; + } + } + return $this; + } + /** + * returns the ids of defaultselectable users. + * + * @return array + */ + public function getDefaultSelectableUsersIDs() { + return $this->defaultSelectableUsersIDs; + } + + /** + * sets the persons which will be shown as selected by default on + * the right side of the dialoag. + * + * @param array array containing user-ids + */ + public function setDefaultSelectedUser($userArray) { + $userArray = array_unique($userArray); + $this->defaultSelectedUsersIDs = []; + if (is_array($userArray)) { + foreach ($userArray as $userId) { + $this->defaultSelectedUsersIDs[] = $userId; + } + } + return $this; + } + + /** + * returns the ids of defaultselected users. + * + * @return array + */ + public function getDefaultSelectedUsersIDs() { + return $this->defaultSelectedUsersIDs; + } + + + /** + * sets the title of the dialog. + * + * @param string $title title of the dialog + * + * @return MultiPersonSearch + */ + public function setTitle($title) { + $this->title = $title; + return $this; + } + + /** + * returns the title. + * + * @return string + */ + public function getTitle() { + return $this->title; + } + + + /** + * sets the description of the dialog. + * + * @param string $desc description of the dialog + * + * @return MultiPersonSearch + */ + public function setDescription($desc) { + $this->description = $desc; + return $this; + } + + /** + * returns the description. + * + * @return string + */ + public function getDescription() { + return $this->description; + } + + /** + * returns the url of the page where the GUI element is added. + * + * @return string + */ + public function getPageUrl() { + return $this->pageURL; + } + + /** + * adds a new quickfilter. + * + * @param string $title title of the new quickfilter + * @param array $userArray containing all user-ids belonging to the quickfilter + * + * @return MultiPersonSearch + */ + public function addQuickfilter($title, $userArray) { + $users = []; + $usersIds = []; + if (is_array($userArray)) { + foreach ($userArray as $userId) { + $usersIds[] = $userId; + } + } + $this->quickfilterIds[(string) $title] = $usersIds; + + return $this; + } + + /** + * returns the ids of quickfilters. + * + * @return array + */ + public function getQuickfilterIds() + { + return $this->quickfilterIds ?: []; + } + + /** + * clears all quickfilters. + * + * @return MultiPersonSearch + */ + public function clearQuickfilters() { + $this->quickfilterIds = []; + + return $this; + } + + /** + * sets the navigation item. + * + * @param string $navigationItem navigation item + * + * @return MultiPersonSearch + */ + public function setNavigationItem($navigationItem) { + $this->navigationItem = $navigationItem; + + return $this; + } + + /** + * returns the navigation item. + * + * @return string + */ + public function getNavigationItem() { + return $this->navigationItem; + } + + /** + * stores the internal data to a session. + */ + public function storeToSession() { + $_SESSION['multipersonsearch'][$this->name]['title'] = $this->title; + $_SESSION['multipersonsearch'][$this->name]['description'] = $this->description; + $_SESSION['multipersonsearch'][$this->name]['additionalHMTL'] = $this->additionalHMTL; + $_SESSION['multipersonsearch'][$this->name]['executeURL'] = $this->executeURL; + $_SESSION['multipersonsearch'][$this->name]['jsFunction'] = $this->jsFunction; + $_SESSION['multipersonsearch'][$this->name]['pageURL'] = Request::url(); + $_SESSION['multipersonsearch'][$this->name]['defaultSelectableUsersIDs'] = $this->defaultSelectableUsersIDs; + $_SESSION['multipersonsearch'][$this->name]['defaultSelectedUsersIDs'] = $this->defaultSelectedUsersIDs; + $_SESSION['multipersonsearch'][$this->name]['quickfilterIds'] = $this->quickfilterIds; + $_SESSION['multipersonsearch'][$this->name]['searchObject'] = serialize($this->searchObject); + $_SESSION['multipersonsearch'][$this->name]['navigationItem'] = $this->navigationItem; + $_SESSION['multipersonsearch'][$this->name]['dataDialogStatus'] = $this->dataDialogStatus; + } + + /** + * restores the internal data from a session. + */ + public function restoreFromSession() { + if (isset($_SESSION['multipersonsearch'][$this->name])) { + $this->title = $_SESSION['multipersonsearch'][$this->name]['title'] ?? ''; + $this->description = $_SESSION['multipersonsearch'][$this->name]['description'] ?? ''; + $this->quickfilterIds = $_SESSION['multipersonsearch'][$this->name]['quickfilterIds'] ?? []; + $this->additionalHMTL = $_SESSION['multipersonsearch'][$this->name]['additionalHMTL'] ?? ''; + $this->executeURL = html_entity_decode($_SESSION['multipersonsearch'][$this->name]['executeURL'] ?? ''); + $this->jsFunction = $_SESSION['multipersonsearch'][$this->name]['jsFunction'] ?? ''; + $this->pageURL = $_SESSION['multipersonsearch'][$this->name]['pageURL'] ?? ''; + $this->defaultSelectableUsersIDs = $_SESSION['multipersonsearch'][$this->name]['defaultSelectableUsersIDs'] ?? []; + $this->defaultSelectedUsersIDs = $_SESSION['multipersonsearch'][$this->name]['defaultSelectedUsersIDs'] ?? []; + $this->searchObject = unserialize($_SESSION['multipersonsearch'][$this->name]['searchObject'] ?? null); + $this->navigationItem = $_SESSION['multipersonsearch'][$this->name]['navigationItem'] ?? null; + $this->dataDialogStatus = $_SESSION['multipersonsearch'][$this->name]['dataDialogStatus'] ?? ''; + } + } + + /** + * clears the session data. + */ + public function clearSession() { + unset($_SESSION['multipersonsearch'][$this->name]); + } + + /** + * sets default values of the internal variables. + */ + private function setDefaultValues() { + $this->title = ''; + $this->description = _('Bitte wählen Sie aus, wen Sie hinzufügen möchten.'); + $this->linkIconPath = Icon::create('add'); + } + + /** + * clear unused sessions. + */ + private function collectGarbage() { + $maxLifeTime = 30; // minutes + foreach ($_SESSION['multipersonsearch'] as $key=>$value) { + if (time() - $value['lastUse'] > $maxLifeTime * 60) { + unset($_SESSION['multipersonsearch'][$key]); + } + } + } + +} |
