ILIAS  release_7 Revision v7.30-3-g800a261c036
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
4require_once("./Services/Preview/classes/class.ilPreviewSettings.php");
5require_once("./Services/Preview/classes/class.ilPreview.php");
6
16{
17
21 private $node_id = null;
25 private $obj_id = null;
29 private $preview = null;
33 private $access_handler = null;
37 private $context = null;
41 private $ctrl = null;
45 private $lng = null;
49 private static $initialized = false;
50
53
61 public function __construct($a_node_id = null, $a_context = self::CONTEXT_REPOSITORY, $a_obj_id = null, $a_access_handler = null)
62 {
63 global $DIC;
64 $ilCtrl = $DIC['ilCtrl'];
65 $lng = $DIC['lng'];
66 $ilAccess = $DIC['ilAccess'];
67
68 // if we are the base class, get the id's from the query string
69 if (strtolower($_GET["baseClass"]) == "ilpreviewgui") {
70 $this->node_id = (int) $_GET["node_id"];
71 $this->context = (int) $_GET["context"];
72 $a_obj_id = (int) $_GET['obj_id'];
73 } else {
74 $this->node_id = $a_node_id;
75 $this->context = $a_context;
76 }
77
78 // assign values
79 $this->ctrl = $ilCtrl;
80 $this->lng = $lng;
81
82 // access handler NOT provided?
83 if ($a_access_handler == null) {
84 if ($this->context == self::CONTEXT_WORKSPACE) {
85 include_once("./Services/PersonalWorkspace/classes/class.ilWorkspaceAccessHandler.php");
86 $a_access_handler = new ilWorkspaceAccessHandler();
87 } else {
88 $a_access_handler = $ilAccess;
89 }
90 }
91 $this->access_handler = $a_access_handler;
92
93 // object id NOT provided?
94 if ($a_obj_id == null) {
95 if ($this->context == self::CONTEXT_WORKSPACE) {
96 $a_obj_id = $this->access_handler->getTree()->lookupObjectId($this->node_id);
97 } else {
98 $a_obj_id = ilObject::_lookupObjId($this->node_id);
99 }
100 }
101 $this->obj_id = $a_obj_id;
102
103 // create preview object
104 $this->preview = new ilPreview($this->obj_id);
105
106 // if the call is NOT async initialize our stuff
107 if (!$ilCtrl->isAsynch()) {
109 }
110 }
111
112
116 public function executeCommand()
117 {
118 $cmd = $this->ctrl->getCmd("getPreviewHTML");
119 $next_class = $this->ctrl->getNextClass($this);
120
121 switch ($next_class) {
122 default:
123 return $this->$cmd();
124 break;
125 }
126 }
127
133 public function getJSCall($a_html_id)
134 {
135 $status = $this->preview->getRenderStatus();
136 $command = $status == ilPreview::RENDER_STATUS_NONE ? "renderPreview" : "";
137 $loading_text = self::jsonSafeString($this->lng->txt($status == ilPreview::RENDER_STATUS_NONE ? "preview_status_creating" : "preview_loading"));
138
139 // build the url
140 $link = $this->buildUrl($command);
141 return "il.Preview.toggle(event, { id: '{$this->node_id}', htmlId: '{$a_html_id}', url: '$link', status: '$status', loadingText: '$loading_text' });";
142 }
143
148 public function getPreviewHTML()
149 {
150 require_once('./Services/WebAccessChecker/classes/class.ilWACSignedPath.php');
151 // load the template
152 $tmpl = new ilTemplate("tpl.preview.html", true, true, "Services/Preview");
153 $tmpl->setVariable("PREVIEW_ID", $this->getHtmlId());
154
155 // check for read access and get object id
156 $preview_status = $this->preview->getRenderStatus();
157
158 // has read access?
159 if ($this->access_handler->checkAccess("read", "", $this->node_id)) {
160 // preview images available?
161 $images = $this->preview->getImages();
162 if (count($images) > 0) {
163 $title = ilObject2::_lookupTitle($this->obj_id);
164 $index = 1;
165 foreach ($images as $image) {
166 $tmpl->setCurrentBlock("preview_item");
167 $tmpl->setVariable("IMG_URL", ilWACSignedPath::signFile($image["url"]));
168 $tmpl->setVariable("WIDTH", $image["width"]);
169 $tmpl->setVariable("HEIGHT", $image["height"]);
170 $tmpl->setVariable("ALT_TEXT", sprintf(
171 $this->lng->txt('preview_caption'),
172 (string) $index . ' ',
173 $title
174 ));
175 $tmpl->parseCurrentBlock();
176 $index++;
177 }
178 } else {
179 // set text depending on the status
180 $tmpl->setCurrentBlock("no_preview");
181 switch ($preview_status) {
183 $tmpl->setVariable("TXT_NO_PREVIEW", $this->lng->txt("preview_status_pending"));
184 break;
185
187 $tmpl->setVariable("TXT_NO_PREVIEW", $this->lng->txt("preview_status_failed"));
188 break;
189
190 default:
191 $tmpl->setVariable("TXT_NO_PREVIEW", $this->lng->txt("preview_status_missing"));
192 break;
193 }
194 $tmpl->parseCurrentBlock();
195 }
196 } else {
197 // display error message
198 $tmpl->setVariable("TXT_NO_PREVIEW", $this->lng->txt("no_access_item"));
199 }
200
201 // output
202 if ($this->ctrl->isAsynch()) {
203 include_once("./Services/JSON/classes/class.ilJsonUtil.php");
204
205 $response = new stdClass();
206 $response->html = $tmpl->get();
207 $response->status = $preview_status;
208
209 // send response object (don't use 'application/json' as IE wants to download it!)
210 header('Vary: Accept');
211 header('Content-type: text/plain');
213
214 // no further processing!
215 exit;
216 } else {
217 return $tmpl->get();
218 }
219 }
220
225 public function getInlineHTML()
226 {
227 $tmpl = new ilTemplate("tpl.preview_inline.html", true, true, "Services/Preview");
228 $tmpl->setVariable("PREVIEW", $this->getPreviewHTML());
229
230 // rendering allowed?
231 if ($this->access_handler->checkAccess("read", "", $this->node_id)) {
232 $this->renderCommand(
233 $tmpl,
234 "render",
235 "preview_create",
236 "preview_status_creating",
238 );
239 }
240
241 // delete allowed?
242 if ($this->access_handler->checkAccess("write", "", $this->node_id)) {
243 $this->renderCommand(
244 $tmpl,
245 "delete",
246 "preview_delete",
247 "preview_status_deleting",
249 );
250 }
251
252 return $tmpl->get();
253 }
254
263 private function renderCommand($tmpl, $a_cmd, $btn_topic, $loading_topic, $a_display_status)
264 {
265 $preview_html_id = $this->getHtmlId();
266 $preview_status = $this->preview->getRenderStatus();
267 $loading_text = self::jsonSafeString($this->lng->txt($loading_topic));
268
269 $link = $this->buildUrl($a_cmd . "Preview");
270 $script_args = "event, { id: '{$this->node_id}', htmlId: '$preview_html_id', url: '$link', loadingText: '$loading_text' }";
271
272 $action_class = "";
273 if (!is_array($a_display_status) || !in_array($preview_status, $a_display_status)) {
274 $action_class = "ilPreviewActionHidden";
275 }
276
277 $tmpl->setCurrentBlock("preview_action");
278 $tmpl->setVariable("CLICK_ACTION", "il.Preview.$a_cmd($script_args);");
279 $tmpl->setVariable("ACTION_CLASS", "$action_class");
280 $tmpl->setVariable("ACTION_ID", "preview_{$a_cmd}_" . $preview_html_id);
281 $tmpl->setVariable("TXT_ACTION", $this->lng->txt($btn_topic));
282 $tmpl->parseCurrentBlock();
283 }
284
289 public function renderPreview()
290 {
291 // has read access?
292 if ($this->access_handler->checkAccess("read", "", $this->node_id)) {
293 // get the object
294 $obj = ilObjectFactory::getInstanceByObjId($this->obj_id);
295 $this->preview->create($obj);
296 }
297
298 return $this->getPreviewHTML();
299 }
300
305 public function deletePreview()
306 {
307 // has read access?
308 if ($this->access_handler->checkAccess("write", "", $this->node_id)) {
309 // get the preview
310 require_once("./Services/Preview/classes/class.ilPreview.php");
311 $this->preview->delete();
312 }
313
314 return $this->getPreviewHTML();
315 }
316
321 private function getHtmlId()
322 {
323 return "preview_" . $this->node_id;
324 }
325
332 private function buildUrl($a_cmd = "", $a_async = true)
333 {
334 $link = "ilias.php?baseClass=ilPreviewGUI&node_id={$this->node_id}&context={$this->context}&obj_id={$this->obj_id}";
335
336 if ($a_async) {
337 $link .= "&cmdMode=asynch";
338 }
339
340 if (!empty($a_cmd)) {
341 $link .= "&cmd=$a_cmd";
342 }
343
344 return $link;
345 }
346
347
351 public static function initPreview()
352 {
353 if (self::$initialized) {
354 return;
355 }
356
357 global $DIC;
358 // jquery
360
361 // load qtip
363
364 // needed scripts & styles
365 $DIC->ui()->mainTemplate()->addJavaScript("./libs/bower/bower_components/jquery-mousewheel/jquery.mousewheel.js");
366 $DIC->ui()->mainTemplate()->addJavaScript("./Services/Preview/js/ilPreview.js");
367
368 // create loading template
369 $tmpl = new ilTemplate("tpl.preview.html", true, true, "Services/Preview");
370 $tmpl->setCurrentBlock("no_preview");
371 $tmpl->setVariable("TXT_NO_PREVIEW", "%%0%%");
372 $tmpl->parseCurrentBlock();
373
374 $initialHtml = str_replace(array("\r\n", "\r"), "\n", $tmpl->get());
375 $lines = explode("\n", $initialHtml);
376 $new_lines = array();
377 foreach ($lines as $i => $line) {
378 if (!empty($line)) {
379 $new_lines[] = trim($line);
380 }
381 }
382 $initialHtml = implode($new_lines);
383
384 // add default texts and values
385 $DIC->ui()->mainTemplate()->addOnLoadCode("il.Preview.texts.preview = \"" . self::jsonSafeString($DIC->language()->txt("preview")) . "\";");
386 $DIC->ui()->mainTemplate()->addOnLoadCode("il.Preview.texts.showPreview = \"" . self::jsonSafeString($DIC->language()->txt("preview_show"))
387 . "\";");
388 $DIC->ui()->mainTemplate()->addOnLoadCode("il.Preview.texts.close = \"" . ilUtil::prepareFormOutput($DIC->language()->txt("close")) . "\";");
389 $DIC->ui()->mainTemplate()->addOnLoadCode("il.Preview.previewSize = " . ilPreviewSettings::getImageSize() . ";");
390 $DIC->ui()->mainTemplate()->addOnLoadCode("il.Preview.initialHtml = " . json_encode($initialHtml) . ";");
391 $DIC->ui()->mainTemplate()->addOnLoadCode("il.Preview.highlightClass = \"ilContainerListItemOuterHighlight\";");
392 $DIC->ui()->mainTemplate()->addOnLoadCode("il.Preview.init();");
393
394 self::$initialized = true;
395 }
396
403 private static function jsonSafeString($text)
404 {
405 if (!is_string($text)) {
406 return $text;
407 }
408
409 $text = htmlentities($text, ENT_COMPAT | ENT_HTML401, "UTF-8");
410 $text = str_replace("'", "&#039;", $text);
411 return $text;
412 }
413}
$_GET["client_id"]
An exception for terminatinating execution or to throw for unit testing.
static encode($mixed, $suppress_native=false)
static _lookupTitle($a_id)
lookup object title
static getInstanceByObjId($a_obj_id, $stop_on_error=true)
get an instance of an Ilias object by object id
static _lookupObjId($a_id)
getInlineHTML()
Gets the HTML that is used for displaying the preview inline.
renderPreview()
Renders the preview and returns the HTML code that displays the preview.
static jsonSafeString($text)
Makes the specified string safe for JSON.
deletePreview()
Deletes the preview and returns the HTML code that displays the preview.
getHtmlId()
Gets the HTML id for the preview.
getPreviewHTML()
Gets the HTML that displays the preview.
executeCommand()
execute command
static initPreview()
Initializes the preview and loads the needed javascripts and styles.
__construct($a_node_id=null, $a_context=self::CONTEXT_REPOSITORY, $a_obj_id=null, $a_access_handler=null)
Creates a new preview GUI.
getJSCall($a_html_id)
Gets the JavaScript code to show the preview.
renderCommand($tmpl, $a_cmd, $btn_topic, $loading_topic, $a_display_status)
Renders a command to the specified template.
buildUrl($a_cmd="", $a_async=true)
Builds the URL to call the preview GUI.
static getImageSize()
Gets the size of the preview images in pixels.
const RENDER_STATUS_NONE
const RENDER_STATUS_FAILED
const RENDER_STATUS_CREATED
const RENDER_STATUS_PENDING
special template class to simplify handling of ITX/PEAR
static init()
Initializes the needed tooltip libraries.
static prepareFormOutput($a_str, $a_strip=false)
prepares string output for html forms @access public
static signFile($path_to_file)
Access handler for personal workspace.
static initjQuery(ilGlobalTemplateInterface $a_tpl=null)
inits and adds the jQuery JS-File to the global or a passed template
global $DIC
Definition: goto.php:24
exit
Definition: login.php:29
$index
Definition: metadata.php:128
$i
Definition: metadata.php:24
$response