ILIAS  release_8 Revision v8.19
All Data Structures Namespaces Files Functions Variables Modules Pages
class.ilBuddySystemRelationsTableGUI.php
Go to the documentation of this file.
1 <?php
2 
19 declare(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 }
setData(array $a_data)
static getInstanceByGlobalUser()
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:
setFormAction(string $a_form_action, bool $a_multipart=false)
addFilterItem(ilTableFilterItem $a_input_item, bool $a_optional=false)
setResetCommand(string $a_val, string $a_caption="")
setSelectAllCheckbox(string $a_select_all_checkbox, bool $a_select_all_on_top=false)
static _lookupPref(int $a_usr_id, string $a_keyword)
setOptions(array $a_options)
setId(string $a_val)
global $DIC
Definition: feed.php:28
setExternalSorting(bool $a_val)
__construct(object $a_parent_obj, string $a_parent_cmd)
setDefaultOrderField(string $a_defaultorderfield)
setRowTemplate(string $a_template, string $a_template_dir="")
Set row template.
setFilterCommand(string $a_val, string $a_caption="")
setDefaultOrderDirection(string $a_defaultorderdirection)
static formCheckbox(bool $checked, string $varname, string $value, bool $disabled=false)
setTitle(string $a_title, string $a_icon="", string $a_icon_alt="")
__construct(Container $dic, ilPlugin $plugin)
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)
getFilterItems(bool $a_optionals=false)
addMultiCommand(string $a_cmd, string $a_text)
static _lookupActive(int $a_usr_id)
setExternalSegmentation(bool $a_val)