ILIAS  release_7 Revision v7.30-3-g800a261c036
class.ilWebDAVMountInstructionsGUI.php
Go to the documentation of this file.
1<?php
2
12{
13
19 protected $base_url;
20 protected $ref_id;
22 protected $il_lang;
23 protected $ui;
24 protected $http;
25
26 public function __construct(ilWebDAVBaseMountInstructions $a_mount_instruction)
27 {
28 global $DIC;
29
30 $this->uri_builder = new ilWebDAVUriBuilder($DIC->http()->request());
31 $this->mount_instruction = $a_mount_instruction;
32 $this->il_lang = $DIC->language();
33 $this->ui = $DIC->ui();
34 $this->http = $DIC->http();
35 }
36
37 public function buildGUIFromGivenMountInstructions($a_mount_instructions, $a_render_async = false)
38 {
39 $os = $this->determineOSfromUserAgent();
40
41 $f = $this->ui->factory();
42 $r = $this->ui->renderer();
43
44 // List of all components to render
45 $comps = array();
46
47 // This is an additional legacy component. It contains the java script function to substitute the shown instructions
48 $js_function_legacy = $f->legacy('<script>'
49 . 'il.UI.showMountInstructions = function (e, id){'
50 // e['target'] is the id for the button which was clicked (e.g. 'button#il_ui_fw_1234')
51 . "obj = $(e['target']);"
52 // Sets all buttons to the "unclicked" state
53 . "obj.siblings().removeClass('engaged disabled ilSubmitInactive').attr('aria-pressed', 'false');"
54 . "obj.siblings().removeAttr('disabled');"
55 // Sets the clicked button into the "clicked" state
56 . "obj.addClass('engaged ilSubmitInactive').attr('aria-pressed', 'true');"
57 // Hide all instruction divs at first
58 . '$(".instructions").hide();'
59 // Show the div which is given as an argument
60 . '$("#"+id).show();}</script>');
61
62 /*
63 * The document might just contain a single entry, then we don't need a view control and just return it.
64 */
65 if (count($a_mount_instructions) === 1) {
66 $content = $f->legacy("<div class='instructions'>" . array_shift($a_mount_instructions) . "</div>");
67
68 return $a_render_async ? $r->renderAsync($content) : $r->render($content);
69 }
70
71 /*
72 * This is an associative array. The key is the title of the button, the value the used signal. E.g.:
73 * array(
74 * "WINDOWS" => signal_for_windows_legacy_component,
75 * "MAC" => signal_for_mac_legacy_component,
76 * "LINUX" => signal_for_linux_legacy_component);
77 */
78 $view_control_actions = array();
79
80 /*
81 * If we can determine the os and we find a corresponding string in the
82 * title of the instructions we automatically set it.
83 */
84
85 foreach ($a_mount_instructions as $key => $value) {
86 $selected = $a_mount_instructions[$key];
87 break;
88 }
89
90
91 foreach ($a_mount_instructions as $title => $text) {
92 foreach ($os as $os_string) {
93 if (stristr($title, $os_string) !== false) {
94 $selected = $title;
95 break 2;
96 }
97 }
98 }
99
100 foreach ($a_mount_instructions as $title => $text) {
101 if ($title == $selected) {
102 $hidden = '';
103 } else {
104 $hidden = 'style="display: none;"';
105 }
106
107 // Create legacy component for mount instructions. Mount instructions text is wrapped in a <div>-tag
108 $legacy = $f->legacy("<div id='$title' class='instructions' $hidden>$text</div>")
109 ->withCustomSignal($title, "il.UI.showMountInstructions(event, '$title');");
110
111 // Add to the list of components to render
112 $comps[] = $legacy;
113
114 // Add signal to the list for the view control
115 $view_control_actions[$title] = $legacy->getCustomSignal($title);
116 }
117
118 $view_control = $f->viewControl()->mode($view_control_actions, "mount-instruction-buttons")->withActive($selected);
119
120 // Add view control and legacy add the beginning of the array (so they will be rendered first)
121 $header_comps = array(
122 $f->legacy("<div class='webdav-view-control'>"),
123 $view_control,
124 $f->legacy("</div>"),
125 $js_function_legacy);
126
127 $comps = array_merge($header_comps, $comps);
128
129 return $a_render_async ? $r->renderAsync($comps) : $r->render($comps);
130 }
131
133 {
134 try {
135 $instructions = $this->mount_instruction->getMountInstructionsAsArray();
136 } catch (InvalidArgumentException $e) {
138 $instructions = $document_processor->processMountInstructions($this->il_lang->txt('webfolder_instructions_text'));
139 $instructions = $this->mount_instruction->getMountInstructionsAsArray($instructions);
140 if ($instructions == '' || $instructions == '-webfolder_instructions_text-') {
141 $instructions = ["<div class='alert alert-danger'>" . $this->il_lang->txt('error') . ": " . $this->il_lang->txt('webdav_missing_lang') . "</div>"];
142 }
143 }
144
145 echo $this->buildGUIFromGivenMountInstructions($instructions, true);
146 exit;
147 }
148
149 private function determineOSfromUserAgent() : array
150 {
151 $ua = $this->http->request()->getHeader('User-Agent')[0];
152
153 if (stristr($ua, 'windows') !== false
154 || strpos($ua, 'microsoft') !== false) {
155 return ['win'];
156 }
157
158 if (stristr($this->user_agent, 'darwin') !== false
159 || stristr($ua, 'macintosh') !== false) {
160 return ['mac', 'osx'];
161 }
162
163 if (stristr($ua, 'linux') !== false
164 || stristr($ua, 'solaris') !== false
165 || stristr($ua, 'aix') !== false
166 || stristr($ua, 'unix') !== false
167 || stristr($ua, 'gvfs') !== false // nautilus browser uses this ID
168 ) {
169 return ['linux'];
170 }
171
172 return ['unknown'];
173 }
174}
An exception for terminatinating execution or to throw for unit testing.
Class ilWebDAVMountInstructionsGUI.
__construct(ilWebDAVBaseMountInstructions $a_mount_instruction)
buildGUIFromGivenMountInstructions($a_mount_instructions, $a_render_async=false)
global $DIC
Definition: goto.php:24
exit
Definition: login.php:29
static http()
Fetches the global http state from ILIAS.
ui()
Definition: ui.php:5