ILIAS  Release_5_0_x_branch Revision 61816
 All Data Structures Namespaces Files Functions Variables Groups Pages
class.ilMailSearchGUI.php
Go to the documentation of this file.
1 <?php
2 /*
3  +-----------------------------------------------------------------------------+
4  | ILIAS open source |
5  +-----------------------------------------------------------------------------+
6  | Copyright (c) 1998-2006 ILIAS open source, University of Cologne |
7  | |
8  | This program is free software; you can redistribute it and/or |
9  | modify it under the terms of the GNU General Public License |
10  | as published by the Free Software Foundation; either version 2 |
11  | of the License, or (at your option) any later version. |
12  | |
13  | This program is distributed in the hope that it will be useful, |
14  | but WITHOUT ANY WARRANTY; without even the implied warranty of |
15  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16  | GNU General Public License for more details. |
17  | |
18  | You should have received a copy of the GNU General Public License |
19  | along with this program; if not, write to the Free Software |
20  | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
21  +-----------------------------------------------------------------------------+
22 */
23 
24 require_once './Services/User/classes/class.ilObjUser.php';
25 require_once 'Services/Mail/classes/class.ilMailbox.php';
26 require_once 'Services/Mail/classes/class.ilFormatMail.php';
27 require_once 'Services/Contact/classes/class.ilAddressbook.php';
28 include_once 'Services/Table/classes/class.ilTable2GUI.php';
29 
37 {
38  private $tpl = null;
39  private $ctrl = null;
40  private $lng = null;
41 
42  private $umail = null;
43 
44  private $errorDelete = false;
45 
46  public function __construct($wsp_access_handler = null, $wsp_node_id = null)
47  {
48  global $tpl, $ilCtrl, $lng, $ilUser;
49 
50  $this->tpl = $tpl;
51  $this->ctrl = $ilCtrl;
52  $this->lng = $lng;
53 
54  // personal workspace
55  $this->wsp_access_handler = $wsp_access_handler;
56  $this->wsp_node_id = $wsp_node_id;
57 
58  $this->ctrl->saveParameter($this, "mobj_id");
59  $this->ctrl->saveParameter($this, "ref");
60 
61  $this->umail = new ilFormatMail($ilUser->getId());
62  }
63 
64  public function executeCommand()
65  {
66  $forward_class = $this->ctrl->getNextClass($this);
67  switch($forward_class)
68  {
69  default:
70  if (!($cmd = $this->ctrl->getCmd()))
71  {
72  $cmd = "showResults";
73  }
74 
75  $this->$cmd();
76  break;
77  }
78  return true;
79  }
80 
81  public function adopt()
82  {
83  // necessary because of select all feature of ilTable2GUI
84  $recipients = array();
85  $recipients = array_merge($recipients, (array)$_POST['search_name_to_addr']);
86  $recipients = array_merge($recipients, (array)$_POST['search_name_to_usr']);
87  $recipients = array_merge($recipients, (array)$_POST['search_name_to_grp']);
88 
89  $recipients = array_unique($recipients);
90 
91  $_SESSION["mail_search_results_to"] = $recipients;
92  $_SESSION["mail_search_results_cc"] = $_POST["search_name_cc"];
93  $_SESSION["mail_search_results_bcc"] = $_POST["search_name_bcc"];
94 
95  if($_GET["ref"] != "wsp")
96  {
97  $this->saveMailData();
98  }
99  else
100  {
101  $this->addPermission($recipients);
102  }
103 
104  $this->ctrl->returnToParent($this);
105  }
106 
107  private function saveMailData()
108  {
109  $mail_data = $this->umail->getSavedData();
110 
111  $this->umail->savePostData(
112  $mail_data["user_id"],
113  $mail_data["attachments"],
114  $mail_data["rcp_to"],
115  $mail_data["rcp_cc"],
116  $mail_data["rcp_bcc"],
117  $mail_data["m_type"],
118  $mail_data["m_email"],
119  $mail_data["m_subject"],
120  $mail_data["m_message"],
121  $mail_data["use_placeholders"]
122  );
123  }
124 
125  public function cancel()
126  {
127  $this->ctrl->returnToParent($this);
128  }
129 
130  function search()
131  {
132  $_SESSION["mail_search_search"] = $_POST["search"];
133 
134  if (strlen(trim($_SESSION["mail_search_search"])) == 0)
135  {
136  ilUtil::sendInfo($this->lng->txt("mail_insert_query"));
137  }
138  else if(strlen(trim($_SESSION["mail_search_search"])) < 3)
139  {
140  $this->lng->loadLanguageModule('search');
141  ilUtil::sendInfo($this->lng->txt('search_minimum_three'));
142  }
143 
144  $this->showResults();
145 
146  return true;
147  }
148 
149  protected function initSearchForm()
150  {
151  global $ilCtrl;
152 
153  if($_GET["ref"] != "wsp")
154  {
155  $this->saveMailData();
156  $title = $this->lng->txt('search_recipients');
157  }
158  else
159  {
160  $this->lng->loadLanguageModule("wsp");
161  $title = $this->lng->txt("wsp_share_search_users");
162  }
163 
164  // searchform
165  include_once 'Services/Form/classes/class.ilPropertyFormGUI.php';
166  $form = new ilPropertyFormGUI();
167  $form->setTitle($title);
168  $form->setId('search_rcp');
169  $form->setFormAction($ilCtrl->getFormAction($this, 'search'));
170 
171  $inp = new ilTextInputGUI($this->lng->txt("search_for"), 'search');
172  $inp->setSize(30);
173  $dsDataLink = $ilCtrl->getLinkTarget($this, 'lookupRecipientAsync', '', true, false);
174  $inp->setDataSource($dsDataLink);
175 
176  if (strlen(trim($_SESSION["mail_search_search"])) > 0)
177  {
178  $inp->setValue(ilUtil::prepareFormOutput(trim($_SESSION["mail_search_search"]), true));
179  }
180  $form->addItem($inp);
181 
182  $form->addCommandButton('search', $this->lng->txt("search"));
183  $form->addCommandButton('cancel', $this->lng->txt("cancel"));
184 
185  return $form;
186  }
187 
188  public function lookupRecipientAsync()
189  {
190  include_once 'Services/JSON/classes/class.ilJsonUtil.php';
191  include_once 'Services/Mail/classes/class.ilMailForm.php';
192 
193  $search = $_REQUEST["term"];
194  $result = array();
195  if (!$search)
196  {
198  exit;
199  }
200 
201  // #14768
202  $quoted = ilUtil::stripSlashes($search);
203  $quoted = str_replace('%', '\%', $quoted);
204  $quoted = str_replace('_', '\_', $quoted);
205 
206  $search_recipients = ($_GET["ref"] != "wsp");
207 
208  $mailFormObj = new ilMailForm;
209  $result = $mailFormObj->getRecipientAsync("%" . $quoted . "%", ilUtil::stripSlashes($search), $search_recipients);
210 
212  exit;
213  }
214 
215 
216  public function showResults()
217  {
218  global $lng, $ilUser, $rbacreview, $ilObjDataCache;
219 
220  $form = $this->initSearchForm();
221 
222  $this->tpl->addBlockFile("ADM_CONTENT", "adm_content", "tpl.mail_search.html", "Services/Contact");
223  $this->tpl->setVariable("ACTION", $this->ctrl->getFormAction($this));
224  $this->tpl->setTitle($this->lng->txt("mail"));
225  $this->tpl->setVariable('SEARCHFORM', $form->getHtml());
226 
227  // #14109
228  if(strlen($_SESSION['mail_search_search']) < 3)
229  {
230  if($_GET["ref"] != "wsp")
231  {
232  $this->tpl->show();
233  }
234  return;
235  }
236 
237  $abook = new ilAddressbook($ilUser->getId());
238  $entries = $abook->searchUsers(addslashes(urldecode($_SESSION['mail_search_search'])));
239 
240  // remove all contacts who are not registered users for personal workspace
241  if($_GET["ref"] == "wsp")
242  {
243  foreach($entries as $idx => $entry)
244  {
245  if(!$entry["login"])
246  {
247  unset($entries[$idx]);
248  }
249  }
250  }
251 
252  if(count($entries))
253  {
254  $tbl_addr = new ilTable2GUI($this);
255  $tbl_addr->setTitle($lng->txt('mail_addressbook'));
256  $tbl_addr->setRowTemplate('tpl.mail_search_addr_row.html', 'Services/Contact');
257 
258  $result = array();
259  $counter = 0;
260  foreach($entries as $entry)
261  {
262  if($_GET["ref"] != "wsp")
263  {
264  $result[$counter]['check'] = ilUtil::formCheckbox(0, 'search_name_to_addr[]', ($entry['login'] ? $entry['login'] : $entry['email'])) .
265  ilUtil::formCheckbox(0, 'search_name_cc[]', ($entry['login'] ? $entry['login'] : $entry['email'])) .
266  ilUtil::formCheckbox(0, 'search_name_bcc[]', ($entry['login'] ? $entry['login'] : $entry['email']));
267  }
268  else
269  {
270  $user_id = ilObjUser::_loginExists($entry["login"]);
271  $result[$counter]['check'] = ilUtil::formCheckbox(0, 'search_name_to_addr[]', $user_id);
272  }
273 
274  $result[$counter]['login'] = $entry['login'];
275  $result[$counter]['firstname'] = $entry['firstname'];
276  $result[$counter]['lastname'] = $entry['lastname'];
277 
278  $id = ilObjUser::_lookupId($entry['login']);
279  if(ilObjUser::_lookupPref($id, 'public_email') == 'y' || !$entry['login'])
280  {
281  $has_mail_addr = true;
282  $result[$counter]['email'] = $entry['email'];
283  }
284 
285  ++$counter;
286  }
287 
288  if($_GET["ref"] != "wsp")
289  {
290  $tbl_addr->addColumn($this->lng->txt('mail_to') . '/' . $this->lng->txt('cc') . '/' . $this->lng->txt('bc'), 'check', '10%');
291  }
292  else
293  {
294  $tbl_addr->addColumn("", "", "1%");
295  }
296  $tbl_addr->addColumn($this->lng->txt('login'), 'login', "15%");
297  $tbl_addr->addColumn($this->lng->txt('firstname'), 'firstname', "15%");
298  $tbl_addr->addColumn($this->lng->txt('lastname'), 'lastname', "15%");
299  if($has_mail_addr)
300  {
301  foreach($result as $key => $val)
302  {
303  if($val['email'] == '') $result[$key]['email'] = '&nbsp;';
304  }
305 
306  $tbl_addr->addColumn($this->lng->txt('email'), 'email', "15%");
307  }
308  $tbl_addr->setData($result);
309 
310  $tbl_addr->setDefaultOrderField('login');
311  $tbl_addr->setPrefix('addr_');
312  $tbl_addr->enable('select_all');
313  $tbl_addr->setSelectAllCheckbox('search_name_to_addr');
314  $tbl_addr->setFormName('recipients');
315 
316  $this->tpl->setVariable('TABLE_ADDR', $tbl_addr->getHTML());
317  }
318 
319  include_once 'Services/Search/classes/class.ilQueryParser.php';
320  include_once 'Services/Search/classes/class.ilObjectSearchFactory.php';
321  include_once 'Services/Search/classes/class.ilSearchResult.php';
322 
323  $all_results = new ilSearchResult();
324 
325  $query_parser = new ilQueryParser(addcslashes($_SESSION['mail_search_search'], '%_'));
326  $query_parser->setCombination(QP_COMBINATION_AND);
327  $query_parser->setMinWordLength(3);
328  $query_parser->parse();
329 
330  $user_search =& ilObjectSearchFactory::_getUserSearchInstance($query_parser);
331  $user_search->enableActiveCheck(true);
332  $user_search->setFields(array('login'));
333  $result_obj = $user_search->performSearch();
334  $all_results->mergeEntries($result_obj);
335 
336  $user_search->setFields(array('firstname'));
337  $result_obj = $user_search->performSearch();
338  $all_results->mergeEntries($result_obj);
339 
340  $user_search->setFields(array('lastname'));
341  $result_obj = $user_search->performSearch();
342  $all_results->mergeEntries($result_obj);
343 
344  $all_results->setMaxHits(100000);
345  $all_results->preventOverwritingMaxhits(true);
346  $all_results->filter(ROOT_FOLDER_ID, true);
347 
348  // Filter users (depends on setting in user accounts)
349  include_once 'Services/User/classes/class.ilUserFilter.php';
350  $users = ilUserFilter::getInstance()->filter($all_results->getResultIds());
351  if(count($users))
352  {
353  $tbl_users = new ilTable2GUI($this);
354  $tbl_users->setTitle($lng->txt('system') . ': ' . $lng->txt('persons'));
355  $tbl_users->setRowTemplate('tpl.mail_search_users_row.html', 'Services/Contact');
356 
357  $result = array();
358  $counter = 0;
359  foreach($users as $user)
360  {
361  $login = ilObjUser::_lookupLogin($user);
362 
363  if($_GET["ref"] != "wsp")
364  {
365  $result[$counter]['check'] = ilUtil::formCheckbox(0, 'search_name_to_usr[]', $login) .
366  ilUtil::formCheckbox(0, 'search_name_cc[]', $login) .
367  ilUtil::formCheckbox(0, 'search_name_bcc[]', $login);
368  }
369  else
370  {
371  $result[$counter]['check'] = ilUtil::formCheckbox(0, 'search_name_to_usr[]', $user);
372  }
373  $result[$counter]['login'] = $login;
374 
375  if(in_array(ilObjUser::_lookupPref($user, 'public_profile'), array('y', "g")))
376  {
377  $name = ilObjUser::_lookupName($user);
378  $result[$counter]['firstname'] = $name['firstname'];
379  $result[$counter]['lastname'] = $name['lastname'];
380  }
381  else
382  {
383  $result[$counter]['firstname'] = '';
384  $result[$counter]['lastname'] = '';
385  }
386 
387  if(ilObjUser::_lookupPref($user, 'public_email') == 'y')
388  {
389  $has_mail_usr = true;
390  $result[$counter]['email'] = ilObjUser::_lookupEmail($user);
391  }
392 
393  ++$counter;
394  }
395 
396  if($_GET["ref"] != "wsp")
397  {
398  $tbl_users->addColumn($this->lng->txt('mail_to') . '/' . $this->lng->txt('cc') . '/' . $this->lng->txt('bc'), 'check', '10%');
399  }
400  else
401  {
402  $tbl_users->addColumn("", "", "1%");
403  }
404  $tbl_users->addColumn($this->lng->txt('login'), 'login', '15%');
405  $tbl_users->addColumn($this->lng->txt('firstname'), 'firstname', '15%');
406  $tbl_users->addColumn($this->lng->txt('lastname'), 'lastname', '15%');
407  if($has_mail_usr == true)
408  {
409  foreach($result as $key => $val)
410  {
411  if($val['email'] == '') $result[$key]['email'] = '&nbsp;';
412  }
413 
414  $tbl_users->addColumn($this->lng->txt('email'), 'email', '15%');
415  }
416  $tbl_users->setData($result);
417 
418  $tbl_users->setDefaultOrderField('login');
419  $tbl_users->setPrefix('usr_');
420  $tbl_users->enable('select_all');
421  $tbl_users->setSelectAllCheckbox('search_name_to_usr');
422  $tbl_users->setFormName('recipients');
423 
424  $this->tpl->setVariable('TABLE_USERS', $tbl_users->getHTML());
425  }
426 
427  include_once 'Services/Search/classes/class.ilQueryParser.php';
428  include_once 'Services/Search/classes/class.ilObjectSearchFactory.php';
429  include_once 'Services/Search/classes/class.ilSearchResult.php';
430  include_once 'Services/Membership/classes/class.ilParticipants.php';
431 
432  $group_results = new ilSearchResult();
433 
434  $query_parser = new ilQueryParser(addcslashes($_SESSION['mail_search_search'], '%_'));
435  $query_parser->setCombination(QP_COMBINATION_AND);
436  $query_parser->setMinWordLength(3);
437  $query_parser->parse();
438 
439  $search = ilObjectSearchFactory::_getObjectSearchInstance($query_parser);
440  $search->setFilter(array('grp'));
441  $result = $search->performSearch();
442  $group_results->mergeEntries($result);
443  $group_results->setMaxHits(PHP_INT_MAX);
444  $group_results->preventOverwritingMaxhits(true);
445  $group_results->setRequiredPermission('read');
446  $group_results->filter(ROOT_FOLDER_ID, true);
447 
448  $visible_groups = array();
449  if($group_results->getResults())
450  {
451  $tbl_grp = new ilTable2GUI($this);
452  $tbl_grp->setTitle($lng->txt('system') . ': ' . $lng->txt('groups'));
453  $tbl_grp->setRowTemplate('tpl.mail_search_groups_row.html', 'Services/Contact');
454 
455  $result = array();
456  $counter = 0;
457 
458  $ilObjDataCache->preloadReferenceCache(array_keys($group_results->getResults()));
459 
460  $groups = $group_results->getResults();
461  foreach($groups as $grp)
462  {
463  if(!ilParticipants::hasParticipantListAccess($grp['obj_id']))
464  {
465  continue;
466  }
467 
468  if($_GET["ref"] != "wsp")
469  {
470  $members = array();
471  $roles = $rbacreview->getAssignableChildRoles($grp['ref_id']);
472  foreach($roles as $role)
473  {
474  if(substr($role['title'], 0, 14) == 'il_grp_member_' ||
475  substr($role['title'], 0, 13) == 'il_grp_admin_'
476  )
477  {
478  // does not work if Pear is enabled and Mailbox Address contain special chars!!
479  //array_push($members, $rbacreview->getRoleMailboxAddress($role['obj_id']));
480  // FIX for Mantis: 7523
481  array_push($members, '#' . $role['title']);
482  }
483  }
484  $str_members = implode(',', $members);
485 
486  $result[$counter]['check'] =
487  ilUtil::formCheckbox(0, 'search_name_to_grp[]', $str_members) .
488  ilUtil::formCheckbox(0, 'search_name_cc[]', $str_members) .
489  ilUtil::formCheckbox(0, 'search_name_bcc[]', $str_members);
490  }
491  else
492  {
493  $result[$counter]['check'] = ilUtil::formCheckbox(0, 'search_name_to_grp[]', $grp['obj_id']);
494  }
495  $result[$counter]['title'] = $ilObjDataCache->lookupTitle($grp['obj_id']);
496  $result[$counter]['description'] = $ilObjDataCache->lookupDescription($grp['obj_id']);
497 
498  ++$counter;
499  $visible_groups[] = $grp;
500  }
501 
502  if($visible_groups)
503  {
504  $tbl_grp->setData($result);
505 
506  if($_GET["ref"] != "wsp")
507  {
508  $tbl_grp->addColumn($this->lng->txt('mail_to') . '/' . $this->lng->txt('cc') . '/' . $this->lng->txt('bc'), 'check', '10%');
509  }
510  else
511  {
512  $tbl_grp->addColumn("", "", "1%");
513  }
514  $tbl_grp->addColumn($this->lng->txt('title'), 'title', '15%');
515  $tbl_grp->addColumn($this->lng->txt('description'), 'description', '15%');
516 
517  $tbl_grp->setDefaultOrderField('title');
518  $tbl_grp->setPrefix('grp_');
519  $tbl_grp->enable('select_all');
520  $tbl_grp->setSelectAllCheckbox('search_name_to_grp');
521  $tbl_grp->setFormName('recipients');
522 
523  $this->tpl->setVariable('TABLE_GRP', $tbl_grp->getHTML());
524  }
525  }
526 
527  if(count($users) || count($visible_groups) || count($entries))
528  {
529  $this->tpl->setVariable("IMG_ARROW", ilUtil::getImagePath("arrow_downright.svg"));
530  $this->tpl->setVariable("ALT_ARROW", '');
531 
532  if($_GET["ref"] != "wsp")
533  {
534  $this->tpl->setVariable('BUTTON_ADOPT', $this->lng->txt('adopt'));
535  }
536  else
537  {
538  $this->tpl->setVariable('BUTTON_ADOPT', $this->lng->txt('wsp_share_with_users'));
539  }
540  }
541  else
542  {
543  $this->lng->loadLanguageModule('search');
544  ilUtil::sendInfo($this->lng->txt('search_no_match'));
545  }
546 
547  if($_GET["ref"] != "wsp")
548  {
549  $this->tpl->show();
550  }
551  }
552 
553  protected function addPermission($a_obj_ids)
554  {
555  if(!is_array($a_obj_ids))
556  {
557  $a_obj_ids = array($a_obj_ids);
558  }
559 
560  $existing = $this->wsp_access_handler->getPermissions($this->wsp_node_id);
561  $added = false;
562  foreach($a_obj_ids as $object_id)
563  {
564  if(!in_array($object_id, $existing))
565  {
566  $added = $this->wsp_access_handler->addPermission($this->wsp_node_id, $object_id);
567  }
568  }
569 
570  if($added)
571  {
572  ilUtil::sendSuccess($this->lng->txt("wsp_share_success"), true);
573  }
574  }
575 }
576 ?>