ILIAS  Release_5_0_x_branch Revision 61816
 All Data Structures Namespaces Files Functions Variables Groups Pages
class.ilPreviewGUI.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2013 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
4 require_once("./Services/Preview/classes/class.ilPreviewSettings.php");
5 require_once("./Services/Preview/classes/class.ilPreview.php");
6 
16 {
17  private $node_id = null;
18  private $obj_id = null;
19  private $preview = null;
20  private $access_handler = null;
21  private $context = null;
22  private $ctrl = null;
23  private $lng = null;
24 
25  private static $initialized = false;
26 
27  const CONTEXT_REPOSITORY = 1;
28  const CONTEXT_WORKSPACE = 2;
29 
37  public function __construct($a_node_id = null, $a_context = self::CONTEXT_REPOSITORY, $a_obj_id = null, $a_access_handler = null)
38  {
39  global $ilCtrl, $lng, $ilAccess;
40 
41  // if we are the base class, get the id's from the query string
42  if (strtolower($_GET["baseClass"]) == "ilpreviewgui")
43  {
44  $this->node_id = (int)$_GET["node_id"];
45  $this->context = (int)$_GET["context"];
46  $a_obj_id = (int)$_GET['obj_id'];
47  }
48  else
49  {
50  $this->node_id = $a_node_id;
51  $this->context = $a_context;
52  }
53 
54  // assign values
55  $this->ctrl =& $ilCtrl;
56  $this->lng =& $lng;
57 
58  // access handler NOT provided?
59  if ($a_access_handler == null)
60  {
61  if ($this->context == self::CONTEXT_WORKSPACE)
62  {
63  include_once("./Services/PersonalWorkspace/classes/class.ilWorkspaceAccessHandler.php");
64  $a_access_handler = new ilWorkspaceAccessHandler();
65  }
66  else
67  {
68  $a_access_handler = $ilAccess;
69  }
70  }
71  $this->access_handler = $a_access_handler;
72 
73  // object id NOT provided?
74  if ($a_obj_id == null)
75  {
76  if ($this->context == self::CONTEXT_WORKSPACE)
77  $a_obj_id = $this->access_handler->getTree()->lookupObjectId($this->node_id);
78  else
79  $a_obj_id = ilObject::_lookupObjId($this->node_id);
80  }
81  $this->obj_id = $a_obj_id;
82 
83  // create preview object
84  $this->preview = new ilPreview($this->obj_id);
85 
86  // if the call is NOT async initialize our stuff
87  if (!$ilCtrl->isAsynch())
89  }
90 
94  function &executeCommand()
95  {
96  $cmd = $this->ctrl->getCmd("getPreviewHTML");
97  $next_class = $this->ctrl->getNextClass($this);
98 
99  switch($next_class)
100  {
101  default:
102  return $this->$cmd();
103  break;
104  }
105  }
106 
112  public function getJSCall($a_html_id)
113  {
114  $status = $this->preview->getRenderStatus();
115  $command = $status == ilPreview::RENDER_STATUS_NONE ? "renderPreview" : "";
116  $loading_text = self::jsonSafeString($this->lng->txt($status == ilPreview::RENDER_STATUS_NONE ? "preview_status_creating" : "preview_loading"));
117 
118  // build the url
119  $link = $this->buildUrl($command);
120  return "il.Preview.toggle(event, { id: '{$this->node_id}', htmlId: '{$a_html_id}', url: '$link', status: '$status', loadingText: '$loading_text' });";
121  }
122 
127  public function getPreviewHTML()
128  {
129  // load the template
130  $tmpl = new ilTemplate("tpl.preview.html", true, true, "Services/Preview");
131  $tmpl->setVariable("PREVIEW_ID", $this->getHtmlId());
132 
133  // check for read access and get object id
134  $preview_status = $this->preview->getRenderStatus();
135 
136  // has read access?
137  if ($this->access_handler->checkAccess("read", "", $this->node_id))
138  {
139  // preview images available?
140  $images = $this->preview->getImages();
141  if (count($images) > 0)
142  {
143  foreach ($images as $image)
144  {
145  $tmpl->setCurrentBlock("preview_item");
146  $tmpl->setVariable("IMG_URL", $image["url"]);
147  $tmpl->setVariable("WIDTH", $image["width"]);
148  $tmpl->setVariable("HEIGHT", $image["height"]);
149  $tmpl->parseCurrentBlock();
150  }
151  }
152  else
153  {
154  // set text depending on the status
155  $tmpl->setCurrentBlock("no_preview");
156  switch ($preview_status)
157  {
159  $tmpl->setVariable("TXT_NO_PREVIEW", $this->lng->txt("preview_status_pending"));
160  break;
161 
163  $tmpl->setVariable("TXT_NO_PREVIEW", $this->lng->txt("preview_status_failed"));
164  break;
165 
166  default:
167  $tmpl->setVariable("TXT_NO_PREVIEW", $this->lng->txt("preview_status_missing"));
168  break;
169  }
170  $tmpl->parseCurrentBlock();
171  }
172  }
173  else
174  {
175  // display error message
176  $tmpl->setVariable("TXT_NO_PREVIEW", $this->lng->txt("no_access_item"));
177  }
178 
179  // output
180  if ($this->ctrl->isAsynch())
181  {
182  include_once("./Services/JSON/classes/class.ilJsonUtil.php");
183 
184  $response = new stdClass();
185  $response->html = $tmpl->get();
186  $response->status = $preview_status;
187 
188  // send response object (don't use 'application/json' as IE wants to download it!)
189  header('Vary: Accept');
190  header('Content-type: text/plain');
191  echo ilJsonUtil::encode($response);
192 
193  // no further processing!
194  exit;
195  }
196  else
197  {
198  return $tmpl->get();
199  }
200  }
201 
206  public function getInlineHTML()
207  {
208  $tmpl = new ilTemplate("tpl.preview_inline.html", true, true, "Services/Preview");
209  $tmpl->setVariable("PREVIEW", $this->getPreviewHTML());
210 
211  // rendering allowed?
212  if ($this->access_handler->checkAccess("read", "", $this->node_id))
213  {
214  $this->renderCommand(
215  $tmpl,
216  "render",
217  "preview_create",
218  "preview_status_creating",
220  }
221 
222  // delete allowed?
223  if ($this->access_handler->checkAccess("write", "", $this->node_id))
224  {
225  $this->renderCommand(
226  $tmpl,
227  "delete",
228  "preview_delete",
229  "preview_status_deleting",
231  }
232 
233  return $tmpl->get();
234  }
235 
244  private function renderCommand($tmpl, $a_cmd, $btn_topic, $loading_topic, $a_display_status)
245  {
246  $preview_html_id = $this->getHtmlId();
247  $preview_status = $this->preview->getRenderStatus();
248  $loading_text = self::jsonSafeString($this->lng->txt($loading_topic));
249 
250  $link = $this->buildUrl($a_cmd . "Preview");
251  $script_args = "event, { id: '{$this->node_id}', htmlId: '$preview_html_id', url: '$link', loadingText: '$loading_text' }";
252 
253  $action_class = "";
254  if (!is_array($a_display_status) || !in_array($preview_status, $a_display_status))
255  $action_class = "ilPreviewActionHidden";
256 
257  $tmpl->setCurrentBlock("preview_action");
258  $tmpl->setVariable("CLICK_ACTION", "il.Preview.$a_cmd($script_args);");
259  $tmpl->setVariable("ACTION_CLASS", "$action_class");
260  $tmpl->setVariable("ACTION_ID", "preview_{$a_cmd}_" . $this->node_id);
261  $tmpl->setVariable("TXT_ACTION", $this->lng->txt($btn_topic));
262  $tmpl->parseCurrentBlock();
263  }
264 
269  public function renderPreview()
270  {
271  // has read access?
272  if ($this->access_handler->checkAccess("read", "", $this->node_id))
273  {
274  // get the object
275  $obj = ilObjectFactory::getInstanceByObjId($this->obj_id);
276  $this->preview->create($obj);
277  }
278 
279  return $this->getPreviewHTML();
280  }
281 
286  public function deletePreview()
287  {
288  // has read access?
289  if ($this->access_handler->checkAccess("write", "", $this->node_id))
290  {
291  // get the preview
292  require_once("./Services/Preview/classes/class.ilPreview.php");
293  $this->preview->delete();
294  }
295 
296  return $this->getPreviewHTML();
297  }
298 
303  private function getHtmlId()
304  {
305  return "preview_" . $this->node_id;
306  }
307 
314  private function buildUrl($a_cmd = "", $a_async = true)
315  {
316  $link = "ilias.php?baseClass=ilPreviewGUI&node_id={$this->node_id}&context={$this->context}&obj_id={$this->obj_id}";
317 
318  if ($a_async)
319  $link .= "&cmdMode=asynch";
320 
321  if (!empty($a_cmd))
322  $link .= "&cmd=$a_cmd";
323 
324  return $link;
325  }
326 
330  private static function initPreview()
331  {
332  if (self::$initialized)
333  return;
334 
335  global $tpl, $lng, $ilCtrl;
336 
337 
338  // jquery
339  include_once("./Services/jQuery/classes/class.iljQueryUtil.php");
341 
342  // load qtip
343  include_once("./Services/UIComponent/Tooltip/classes/class.ilTooltipGUI.php");
345 
346  // needed scripts & styles
347  $tpl->addJavaScript("./Services/Preview/js/jquery.mousewheel.js");
348  $tpl->addJavaScript("./Services/Preview/js/ilPreview.js");
349  $tpl->addCss(ilUtil::getStyleSheetLocation("filesystem", "preview.css", "Services/Preview"));
350 
351  // create loading template
352  $tmpl = new ilTemplate("tpl.preview.html", true, true, "Services/Preview");
353  $tmpl->setCurrentBlock("no_preview");
354  $tmpl->setVariable("TXT_NO_PREVIEW", "%%0%%");
355  $tmpl->parseCurrentBlock();
356 
357  $initialHtml = str_replace(array("\r\n", "\r"), "\n", $tmpl->get());
358  $lines = explode("\n", $initialHtml);
359  $new_lines = array();
360  foreach ($lines as $i => $line)
361  {
362  if(!empty($line))
363  $new_lines[] = trim($line);
364  }
365  $initialHtml = implode($new_lines);
366 
367  // add default texts and values
368  include_once("./Services/JSON/classes/class.ilJsonUtil.php");
369  $tpl->addOnLoadCode("il.Preview.texts.preview = \"" . self::jsonSafeString($lng->txt("preview")) . "\";");
370  $tpl->addOnLoadCode("il.Preview.texts.showPreview = \"" . self::jsonSafeString($lng->txt("preview_show")) . "\";");
371  $tpl->addOnLoadCode("il.Preview.texts.close = \"" . ilUtil::prepareFormOutput($lng->txt("close")) . "\";");
372  $tpl->addOnLoadCode("il.Preview.previewSize = " . ilPreviewSettings::getImageSize() . ";");
373  $tpl->addOnLoadCode("il.Preview.initialHtml = " . ilJsonUtil::encode($initialHtml) . ";");
374  $tpl->addOnLoadCode("il.Preview.highlightClass = \"ilContainerListItemOuterHighlight\";");
375  $tpl->addOnLoadCode("il.Preview.init();");
376 
377  self::$initialized = true;
378  }
379 
386  private static function jsonSafeString($text)
387  {
388  if (!is_string($text))
389  return $text;
390 
391  $text = htmlentities($text, ENT_COMPAT | ENT_HTML401, "UTF-8");
392  $text = str_replace("'", "&#039;", $text);
393  return $text;
394  }
395 }
396 ?>