ILIAS  release_8 Revision v8.24
class.ilBuddySystemRelationsTableGUI.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
26{
27 private const APPLY_FILTER_CMD = 'applyContactsTableFilter';
28 private const RESET_FILTER_CMD = 'resetContactsTableFilter';
29 public const STATE_FILTER_ELM_ID = 'relation_state_type';
30
32 protected bool $hasAccessToMailSystem = false;
33 protected bool $isChatEnabled = false;
34 protected ilObjUser $user;
36 protected array $filter = [];
37
42 public function __construct(object $a_parent_obj, string $a_parent_cmd)
43 {
44 global $DIC;
45
46 $this->containerTemplate = $DIC['tpl'];
47 $this->user = $DIC['ilUser'];
48
49 $this->setId('buddy_system_tbl');
50 parent::__construct($a_parent_obj, $a_parent_cmd);
51
52 $this->lng->loadLanguageModule('buddysystem');
53
54 $this->hasAccessToMailSystem = $DIC->rbac()->system()->checkAccess(
55 'internal_mail',
57 );
58
59 $chatSettings = new ilSetting('chatroom');
60 $this->isChatEnabled = (bool) $chatSettings->get('chat_enabled', '0');
61
62 $this->setDefaultOrderDirection('ASC');
63 $this->setDefaultOrderField('public_name');
64
65 $this->setTitle($this->lng->txt('buddy_tbl_title_relations'));
66
67 if ($this->hasAccessToMailSystem || $this->isChatEnabled) {
68 $this->addColumn('', 'chb', '1%', true);
69 $this->setSelectAllCheckbox('usr_id');
70 if ($this->hasAccessToMailSystem) {
71 $this->addMultiCommand('mailToUsers', $this->lng->txt('send_mail_to'));
72 }
73 if ($this->isChatEnabled) {
74 $this->addMultiCommand('inviteToChat', $this->lng->txt('invite_to_chat'));
75 }
76 }
77
78 $this->addColumn($this->lng->txt('name'), 'public_name');
79 $this->addColumn($this->lng->txt('login'), 'login');
80 $this->addColumn($this->lng->txt('buddy_tbl_state_actions_col_label'), '', '', false, 'ilRight');
81
82 $this->setRowTemplate('tpl.buddy_system_relation_table_row.html', 'Services/Contact/BuddySystem');
83 $this->setFormAction($this->ctrl->getFormAction($a_parent_obj, $a_parent_cmd));
84
85 $this->setFilterCommand(self::APPLY_FILTER_CMD);
86 $this->setResetCommand(self::RESET_FILTER_CMD);
87
88 $this->initFilter();
89 }
90
94 public function initFilter(): void
95 {
96 $this->filters = [];
97 $this->filter = [];
98
99 $relations_state_selection = new ilSelectInputGUI(
100 $this->lng->txt('buddy_tbl_filter_state'),
101 self::STATE_FILTER_ELM_ID
102 );
103
104 $options = [];
106 foreach ($state_factory->getValidStates() as $state) {
107 if ($state->isInitial()) {
108 continue;
109 }
110
111 $state_filter_mapper = $state_factory->getTableFilterStateMapper($state);
112 $options += $state_filter_mapper->optionsForState();
113 }
114 $relations_state_selection->setOptions(['' => $this->lng->txt('please_choose')] + $options);
115 $this->addFilterItem($relations_state_selection);
116 $relations_state_selection->readFromSession();
117 $this->filter['relation_state_type'] = $relations_state_selection->getValue();
118
119 $public_name = new ilTextInputGUI($this->lng->txt('name'), 'public_name');
120 $this->addFilterItem($public_name);
121 $public_name->readFromSession();
122 $this->filter['public_name'] = $public_name->getValue();
123 }
124
130 public function applyFilterValue(string $filterKey, $value): void
131 {
132 foreach ([$this->getFilterItems(), $this->getFilterItems(true)] as $filterItems) {
133 foreach ($filterItems as $item) {
135 if ($item->getPostVar() === $filterKey) {
136 $item->setValueByArray([$filterKey => $value]);
137 $item->writeToSession();
138 break 2;
139 }
140 }
141 }
142 }
143
144 public function populate(): void
145 {
146 $this->setExternalSorting(false);
147 $this->setExternalSegmentation(false);
148
149 $data = [];
150
151 $relations = ilBuddyList::getInstanceByGlobalUser()->getRelations();
152
153 $state_filter = (string) $this->filter[self::STATE_FILTER_ELM_ID];
155 $relations = $relations->filter(function (ilBuddySystemRelation $relation) use ($state_filter, $state_factory): bool {
156 $state_filter_mapper = $state_factory->getTableFilterStateMapper($relation->getState());
157 return $state_filter === '' || $state_filter_mapper->filterMatchesRelation($state_filter, $relation);
158 });
159
160 $public_names = ilUserUtil::getNamePresentation($relations->getKeys(), false, false, '', false, true, false);
161 $logins = ilUserUtil::getNamePresentation($relations->getKeys(), false, false, '', false, false, false);
162
163 $logins = array_map(static function (string $value): string {
164 $matches = null;
165 preg_match_all('/\[([^\[]+?)\]/', $value, $matches);
166 return (
167 is_array($matches) &&
168 isset($matches[1]) &&
169 is_array($matches[1]) &&
170 isset($matches[1][count($matches[1]) - 1])
171 ) ? $matches[1][count($matches[1]) - 1] : '';
172 }, $logins);
173
174 $public_name_query = (string) ($this->filter['public_name'] ?? '');
175 $relations = $relations->filter(static function (ilBuddySystemRelation $relation) use (
176 $public_name_query,
177 $relations,
178 $public_names,
179 $logins
180 ): bool {
181 $usrId = $relations->getKey($relation);
182
183 $hasMatchingName = (
184 0 === ilStr::strlen($public_name_query) ||
185 ilStr::strpos(
186 ilStr::strtolower($public_names[$usrId]),
187 ilStr::strtolower($public_name_query)
188 ) !== false ||
189 ilStr::strpos(ilStr::strtolower($logins[$usrId]), ilStr::strtolower($public_name_query)) !== false
190 );
191
192 if (!$hasMatchingName) {
193 return false;
194 }
195
196 return ilObjUser::_lookupActive($usrId);
197 });
198
199 foreach ($relations->toArray() as $usr_id => $relation) {
200 $data[] = [
201 'usr_id' => $usr_id,
202 'public_name' => $public_names[$usr_id],
203 'login' => $logins[$usr_id]
204 ];
205 }
206
207 $this->setData($data);
208 }
209
213 protected function fillRow(array $a_set): void
214 {
215 if ($this->hasAccessToMailSystem) {
216 $a_set['chb'] = ilLegacyFormElementsUtil::formCheckbox(false, 'usr_id[]', (string) $a_set['usr_id']);
217 }
218
219 $public_profile = ilObjUser::_lookupPref($a_set['usr_id'], 'public_profile');
220 if ((!$this->user->isAnonymous() && $public_profile === 'y') || $public_profile === 'g') {
221 $this->ctrl->setParameterByClass(ilPublicUserProfileGUI::class, 'user', $a_set['usr_id']);
222 $profile_target = $this->ctrl->getLinkTargetByClass(
223 ilPublicUserProfileGUI::class,
224 'getHTML'
225 );
226 $a_set['profile_link'] = $profile_target;
227 $a_set['linked_public_name'] = $a_set['public_name'];
228
229 $a_set['profile_link_login'] = $profile_target;
230 $a_set['linked_login'] = $a_set['login'];
231 } else {
232 $a_set['unlinked_public_name'] = $a_set['public_name'];
233 $a_set['unlinked_login'] = $a_set['login'];
234 }
235
236 $a_set['contact_actions'] = ilBuddySystemLinkButton::getInstanceByUserId((int) $a_set['usr_id'])->getHtml();
237 parent::fillRow($a_set);
238 }
239
243 public function render(): string
244 {
245 $listener_tpl = new ilTemplate(
246 'tpl.buddy_system_relation_table_listener.html',
247 true,
248 true,
249 'Services/Contact/BuddySystem'
250 );
251 $listener_tpl->setVariable('TABLE_ID', $this->getId());
252 $listener_tpl->setVariable('FILTER_ELM_ID', self::STATE_FILTER_ELM_ID);
253 $listener_tpl->setVariable(
254 'NO_ENTRIES_TEXT',
255 $this->getNoEntriesText() ?: $this->lng->txt('no_items')
256 );
257
258 return parent::render() . $listener_tpl->get();
259 }
260}
static getInstanceByGlobalUser()
Class ilBuddySystemRelation.
__construct(object $a_parent_obj, string $a_parent_cmd)
static formCheckbox(bool $checked, string $varname, string $value, bool $disabled=false)
User class.
static _lookupActive(int $a_usr_id)
static _lookupPref(int $a_usr_id, string $a_keyword)
This class represents a selection list property in a property form.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
setFilterCommand(string $a_val, string $a_caption="")
setTitle(string $a_title, string $a_icon="", string $a_icon_alt="")
setExternalSegmentation(bool $a_val)
addFilterItem(ilTableFilterItem $a_input_item, bool $a_optional=false)
addMultiCommand(string $a_cmd, string $a_text)
setFormAction(string $a_form_action, bool $a_multipart=false)
addColumn(string $a_text, string $a_sort_field="", string $a_width="", bool $a_is_checkbox_action_column=false, string $a_class="", string $a_tooltip="", bool $a_tooltip_with_html=false)
setDefaultOrderField(string $a_defaultorderfield)
setSelectAllCheckbox(string $a_select_all_checkbox, bool $a_select_all_on_top=false)
getFilterItems(bool $a_optionals=false)
setExternalSorting(bool $a_val)
setRowTemplate(string $a_template, string $a_template_dir="")
Set row template.
setId(string $a_val)
setDefaultOrderDirection(string $a_defaultorderdirection)
setResetCommand(string $a_val, string $a_caption="")
setData(array $a_data)
Set table data.
special template class to simplify handling of ITX/PEAR
This class represents a text property in a property form.
static getNamePresentation( $a_user_id, bool $a_user_image=false, bool $a_profile_link=false, string $a_profile_back_link="", bool $a_force_first_lastname=false, bool $a_omit_login=false, bool $a_sortable=true, bool $a_return_data_array=false, $a_ctrl_path="ilpublicuserprofilegui")
Default behaviour is:
global $DIC
Definition: feed.php:28
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc