ILIAS  release_4-3 Revision
 All Data Structures Namespaces Files Functions Variables Groups Pages
class.ilLinkInputGUI.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2012 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
16 {
17  const BOTH = "both";
18  const INT = "int";
19  const EXT = "ext";
21  protected $int_link_default_type = "RepositoryItem";
22  protected $int_link_default_obj = 0;
23  protected $int_link_filter_types = array("RepositoryItem");
24 
31  function __construct($a_title = "", $a_postvar = "")
32  {
33  parent::__construct($a_title, $a_postvar);
34  $this->setType("link");
35  }
36 
42  function setAllowedLinkTypes($a_val)
43  {
44  $this->allowed_link_types = $a_val;
45  }
46 
53  {
55  }
56 
63  function setInternalLinkDefault($a_type, $a_obj = 0)
64  {
65  $this->int_link_default_type = $a_type;
66  $this->int_link_default_obj = $a_obj;
67  }
68 
74  function setInternalLinkFilterTypes(array $a_val)
75  {
76  $this->int_link_filter_types = $a_val;
77  }
78 
82  function executeCommand()
83  {
84  global $ilCtrl, $lng;
85 
86  $next_class = $ilCtrl->getNextClass($this);
87  $cmd = $ilCtrl->getCmd();
88 
89  switch($next_class)
90  {
91  case "ilinternallinkgui":
92  $lng->loadLanguageModule("content");
93  require_once("./Modules/LearningModule/classes/class.ilInternalLinkGUI.php");
94  $link_gui = new ilInternalLinkGUI($this->int_link_default_type,
95  $this->int_link_default_obj);
96  foreach ($this->int_link_filter_types as $t)
97  {
98  $link_gui->filterLinkType($t);
99  }
100  $link_gui->setFilterWhiteList(true);
101  $link_gui->setMode("asynch");
102 
103  $ret = $ilCtrl->forwardCommand($link_gui);
104  break;
105 
106  default:
107  var_dump($cmd);
108  //exit();
109  }
110 
111  return $ret;
112  }
113 
119  function setValue($a_value)
120  {
121  $this->value = $a_value;
122  }
123 
129  function getValue()
130  {
131  return $this->value;
132  }
133 
139  function setValueByArray($a_values)
140  {
141  switch($a_values[$this->getPostVar()."_mode"])
142  {
143  case "int":
144  if($a_values[$this->getPostVar()."_ajax_type"] &&
145  $a_values[$this->getPostVar()."_ajax_id"])
146  {
147  $val = $a_values[$this->getPostVar()."_ajax_type"]."|".
148  $a_values[$this->getPostVar()."_ajax_id"];
149  if ($a_values[$this->getPostVar()."_ajax_target"] != "")
150  {
151  $val.= "|".$a_values[$this->getPostVar()."_ajax_target"];
152  }
153  $this->setValue($val);
154  }
155  break;
156 
157  default:
158  if($a_values[$this->getPostVar()])
159  {
160  $this->setValue($a_values[$this->getPostVar()]);
161  }
162  break;
163  }
164  }
165 
171  function checkInput()
172  {
173  global $lng;
174 
175  // debugging
176  // return false;
177 
178  if($this->getRequired())
179  {
180  switch($_POST[$this->getPostVar()."_mode"])
181  {
182  case "ext":
183  if(!$_POST[$this->getPostVar()])
184  {
185  $this->setAlert($lng->txt("msg_input_is_required"));
186  return false;
187  }
188  break;
189 
190  case "int":
191  if(!$_POST[$this->getPostVar()."_ajax_type"] ||
192  !$_POST[$this->getPostVar()."_ajax_id"])
193  {
194  $this->setAlert($lng->txt("msg_input_is_required"));
195  return false;
196  }
197  break;
198 
199  default:
200  $this->setAlert($lng->txt("msg_input_is_required"));
201  return false;
202  }
203  }
204 
205  if($_POST[$this->getPostVar()."_mode"] == "int")
206  {
207  // overwriting post-data so getInput() will work
208  $val = $_POST[$this->getPostVar()."_ajax_type"]."|".
209  $_POST[$this->getPostVar()."_ajax_id"];
210  if ($_POST[$this->getPostVar()."_ajax_target"] != "")
211  {
212  $val.= "|".$_POST[$this->getPostVar()."_ajax_target"];
213  }
214 
215  $_POST[$this->getPostVar()] = $val;
216  };
217 
218  return true;
219  }
220 
224  function render()
225  {
226  global $lng, $ilCtrl;
227 
228  // parse settings
229  $has_int = $has_ext = $has_radio = false;
230  switch($this->getAllowedLinkTypes())
231  {
232  case self::EXT:
233  $has_ext = true;
234  break;
235 
236  case self::INT:
237  $has_int = true;
238  break;
239 
240  case self::BOTH:
241  $has_int = true;
242  $has_ext = true;
243  $has_radio = true;
244  break;
245  }
246 
247  // external
248  if($has_ext)
249  {
250  $title = $has_radio ? $lng->txt("url") : "";
251 
252  // external
253  $ti = new ilTextInputGUI($title, $this->getPostVar());
254  $ti->setMaxLength(200);
255  $ti->setSize(50);
256  }
257 
258  // internal
259  if($has_int)
260  {
261  $ilCtrl->setParameterByClass("ilformpropertydispatchgui", "postvar", $this->getPostVar());
262  $link = array(get_class($this->getParent()), "ilformpropertydispatchgui", get_class($this), "ilinternallinkgui");
263  $link = $ilCtrl->getLinkTargetByClass($link, "", false, true, false);
264  $ilCtrl->setParameterByClass("ilformpropertydispatchgui", "postvar", "");
265 
266  $no_disp_class = (strpos($this->getValue(), "|"))
267  ? ""
268  : " ilNoDisplay";
269 
270  $itpl = new ilTemplate('tpl.prop_link.html',true,true,'Services/Form');
271  $itpl->setVariable("VAL_ID", $this->getPostVar());
272  $itpl->setVariable("URL_EDIT", $link);
273  $itpl->setVariable("TXT_EDIT", $lng->txt("form_get_link"));
274  $itpl->setVariable("CSS_REMOVE", $no_disp_class);
275  $itpl->setVariable("TXT_REMOVE", $lng->txt("remove"));
276 
277  $ne = new ilNonEditableValueGUI($lng->txt("object"), $this->getPostVar()."_val", true);
278 
279  // hidden field for selected value
280  $hidden_type = new ilHiddenInputGUI($this->getPostVar()."_ajax_type");
281  $hidden_id = new ilHiddenInputGUI($this->getPostVar()."_ajax_id");
282  $hidden_target = new ilHiddenInputGUI($this->getPostVar()."_ajax_target");
283  }
284 
285  // mode
286  if ($has_radio)
287  {
288  $ext = new ilRadioOption($lng->txt("form_link_external"), "ext");
289  $ext->addSubItem($ti);
290 
291  $int = new ilRadioOption($lng->txt("form_link_internal"), "int");
292  $int->addSubItem($ne);
293 
294  $mode = new ilRadioGroupInputGUI("", $this->getPostVar()."_mode");
295  $mode->addOption($ext);
296  $mode->addOption($int);
297  }
298  else
299  {
300  $mode = new ilHiddenInputGUI($this->getPostVar()."_mode");
301  if ($has_int)
302  {
303  $mode->setValue("int");
304  }
305  else
306  {
307  $mode->setValue("ext");
308  }
309  }
310 
311  // value
312  $value = $this->getValue();
313  if($value)
314  {
315  // #15647
316  if($has_int && self::isInternalLink($value))
317  {
318  $mode->setValue("int");
319 
320  $value_trans = self::getTranslatedValue($value);
321 
322  $value = explode("|", $value);
323  $hidden_type->setValue($value[0]);
324  $hidden_id->setValue($value[1]);
325  $hidden_target->setValue($value[2]);
326 
327  $itpl->setVariable("VAL_OBJECT_TYPE", $value_trans["type"]);
328  $itpl->setVariable("VAL_OBJECT_NAME", $value_trans["name"]);
329  }
330  else if($has_ext)
331  {
332  $mode->setValue("ext");
333 
334  $ti->setValue($value);
335  }
336  }
337 
338  // #10185 - default for external urls
339  if($has_ext && !$ti->getValue())
340  {
341  $ti->setValue("http://");
342  }
343 
344  $ne->setValue($itpl->get());
345 
346  // to html
347  if ($has_radio)
348  {
349  $html = $mode->render();
350  }
351  else
352  {
353  $html = $mode->getToolbarHTML();
354 
355  if ($has_ext)
356  {
357  $html.= $ti->getToolbarHTML();
358  }
359  else
360  {
361  $html.= $ne->render().
362  '<div class="ilFormInfo">'.$ne->getInfo().'</div>';
363  }
364  }
365 
366  // js for internal link
367  if($has_int)
368  {
369  include_once("./Modules/LearningModule/classes/class.ilInternalLinkGUI.php");
370  $html.= $hidden_type->getToolbarHTML().
371  $hidden_id->getToolbarHTML().
372  $hidden_target->getToolbarHTML().
374  }
375 
376  return $html;
377  }
378 
379  public static function isInternalLink($a_value)
380  {
381  if(strpos($a_value, "|"))
382  {
383  $parts = explode("|", $a_value);
384  if(sizeof($parts) == 2 || sizeof($parts) == 3)
385  {
386  // numeric id
387  if(is_numeric($parts[1]))
388  {
389  // simple type
390  if(preg_match("/^[a-zA-Z_]+$/", $parts[0], $matches))
391  {
392  return true;
393  }
394  }
395  }
396  }
397  return false;
398  }
399 
400  public static function getTranslatedValue($a_value)
401  {
402  global $lng;
403 
404  $value = explode("|", $a_value);
405 
406  switch($value[0])
407  {
408  case "media":
409  $type = $lng->txt("obj_mob");
410  $name = ilObject::_lookupTitle($value[1]);
411  break;
412 
413  case "page":
414  include_once("./Modules/LearningModule/classes/class.ilLMPageObject.php");
415  $type = $lng->txt("obj_pg");
416  $name = ilLMPageObject::_lookupTitle($value[1]);
417  break;
418 
419  case "term":
420  include_once("./Modules/Glossary/classes/class.ilGlossaryTerm.php");
421  $type = $lng->txt("term");
422  $name = ilGlossaryTerm::_lookGlossaryTerm($value[1]);
423  break;
424 
425  default:
426  $type = $lng->txt("obj_".$value[0]);
428  break;
429  }
430 
431  return array("type"=>$type, "name"=>$name);
432  }
433 
439  function insert(&$a_tpl)
440  {
441  $html = $this->render();
442 
443  $a_tpl->setCurrentBlock("prop_generic");
444  $a_tpl->setVariable("PROP_GENERIC", $html);
445  $a_tpl->parseCurrentBlock();
446  }
447 }