ILIAS  release_6 Revision v6.24-5-g0c8bfefb3b8
class.ilMultipleNestedOrderingElementsInputGUI.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/Form/classes/class.ilIdentifiedMultiValuesInputGUI.php';
5require_once 'Modules/Test/classes/inc.AssessmentConstants.php';
14{
15 const HTML_LIST_TAG_UL = 'ul';
16 const HTML_LIST_TAG_OL = 'ol';
17
18 const CSS_LIST_CLASS = 'dd-list';
19 const CSS_ITEM_CLASS = 'dd-item';
20 const CSS_HANDLE_CLASS = 'dd-handle';
21
22 const POSTVAR_SUBFIELD_NEST_ELEM = 'content';
23 const POSTVAR_SUBFIELD_NEST_INDENT = 'indentation';
24
25 const DEFAULT_INSTANCE_ID = 'default';
26
28
29 protected $interactionEnabled = true;
30
31 protected $nestingEnabled = true;
32
33 protected $stylingDisabled = false;
34
35 protected $listTpl = null;
36
38
40
42
44
45 public function __construct($a_title = '', $a_postvar = '')
46 {
47 parent::__construct($a_title, $a_postvar);
48
49 require_once 'Services/Form/classes/class.ilMultipleNestedOrderingElementsAdditionalIndexLevelRemover.php';
51 $this->addFormValuesManipulator($manipulator);
52 }
53
54 public function setInstanceId($instanceId)
55 {
56 $this->instanceId = $instanceId;
57 }
58
59 public function getInstanceId()
60 {
61 return $this->instanceId;
62 }
63
65 {
66 $this->interactionEnabled = $interactionEnabled;
67 }
68
69 public function isInteractionEnabled()
70 {
72 }
73
74 public function isNestingEnabled()
75 {
77 }
78
80 {
81 $this->nestingEnabled = $nestingEnabled;
82 }
83
84 public function isStylingDisabled()
85 {
87 }
88
90 {
91 $this->stylingDisabled = $stylingDisabled;
92 }
93
94 protected function isStylingEnabled()
95 {
96 return !$this->isStylingDisabled();
97 }
98
102 public function getCssListClass()
103 {
104 return $this->cssListClass;
105 }
106
111 {
112 $this->cssListClass = $cssListClass;
113 }
114
118 public function getCssItemClass()
119 {
120 return $this->cssItemClass;
121 }
122
126 public function getCssHandleClass()
127 {
129 }
130
135 {
136 $this->cssHandleClass = $cssHandleClass;
137 }
138
143 {
144 $this->cssItemClass = $cssItemClass;
145 }
146
150 public function getHtmlListTag()
151 {
152 return $this->htmlListTag;
153 }
154
159 {
160 $this->htmlListTag = $htmlListTag;
161 }
162
166 protected function getGlobalTpl()
167 {
168 return isset($GLOBALS['DIC']) ? $GLOBALS['DIC']['tpl'] : $GLOBALS['tpl'];
169 }
170
174 public function getListTpl()
175 {
176 return $this->listTpl;
177 }
178
182 public function setListTpl($listTpl)
183 {
184 $this->listTpl = $listTpl;
185 }
186
187 protected function initListTemplate()
188 {
189 $this->setListTpl(
190 new ilTemplate('tpl.prop_nested_ordering_list.html', true, true, 'Services/Form')
191 );
192 }
193
194 protected function fetchListHtml()
195 {
196 return $this->getListTpl()->get();
197 }
198
199 protected function renderListContainer()
200 {
201 $this->getListTpl()->setCurrentBlock('list_container');
202 $this->getListTpl()->setVariable('INSTANCE_ID', $this->getInstanceId());
203 $this->getListTpl()->parseCurrentBlock();
204 }
205
206 protected function renderListSnippet()
207 {
208 $this->getListTpl()->setCurrentBlock('list_snippet');
209 $this->getListTpl()->parseCurrentBlock();
210 }
211
212 protected function renderListItem($value, $identifier, $position)
213 {
214 $subPostVar = $this->getMultiValuePostVarSubField($identifier, self::POSTVAR_SUBFIELD_NEST_ELEM);
215 $subFieldId = $this->getMultiValueSubFieldId($identifier, self::POSTVAR_SUBFIELD_NEST_ELEM);
216
217 $this->getListTpl()->setCurrentBlock('item_value');
218
219 $this->getListTpl()->setVariable('ILC_HANDLE_CSS_CLASS', $this->getCssHandleClass());
220
221 $this->getListTpl()->setVariable('LIST_ITEM_VALUE', $this->getItemHtml(
222 $value,
223 $identifier,
224 $position,
225 $subPostVar,
226 $subFieldId
227 ));
228
229 $this->getListTpl()->parseCurrentBlock();
230
231 $this->renderListSnippet();
232 }
233
242 abstract protected function getItemHtml($value, $identifier, $position, $itemSubFieldPostVar, $itemSubFieldId);
243
244 protected function renderBeginListItem($identifier)
245 {
246 $this->getListTpl()->setCurrentBlock('begin_list_item');
247 $this->getListTpl()->setVariable('LIST_ITEM_ID', $identifier);
248 $this->getListTpl()->setVariable('ILC_ITEM_CSS_CLASS', $this->getCssItemClass());
249 $this->getListTpl()->parseCurrentBlock();
250 $this->renderListSnippet();
251 }
252
253 protected function renderEndListItem()
254 {
255 $this->getListTpl()->setCurrentBlock('end_list_item');
256 $this->getListTpl()->touchBlock('end_list_item');
257 $this->getListTpl()->parseCurrentBlock();
258 $this->renderListSnippet();
259 }
260
261 protected function renderBeginSubList()
262 {
263 $this->getListTpl()->setCurrentBlock('begin_sublist');
264 $this->getListTpl()->setVariable('BEGIN_HTML_LIST_TAG', $this->getHtmlListTag());
265 $this->getListTpl()->setVariable('ILC_LIST_CSS_CLASS', $this->getCssListClass());
266 $this->getListTpl()->parseCurrentBlock();
267 $this->renderListSnippet();
268 }
269
270 protected function renderEndSubList()
271 {
272 $this->getListTpl()->setCurrentBlock('end_sublist');
273 $this->getListTpl()->setVariable('END_HTML_LIST_TAG', $this->getHtmlListTag());
274 $this->getListTpl()->parseCurrentBlock();
275 $this->renderListSnippet();
276 }
277
283 abstract protected function getCurrentIndentation($elementValues, $elementCounter);
284
290 abstract protected function getNextIndentation($elementValues, $elementCounter);
291
292 protected function renderMainList()
293 {
294 $this->initListTemplate();
295 $this->renderBeginSubList();
296
297
298 $values = array_values($this->getIdentifiedMultiValues());
299 $keys = array_keys($this->getIdentifiedMultiValues());
300 $prevIndent = 0;
301
302 foreach ($values as $counter => $value) {
303 $identifier = $keys[$counter];
304
305 if ($this->isNestingEnabled()) {
306 $curIndent = $this->getCurrentIndentation($values, $counter);
307 $nextIndent = $this->getNextIndentation($values, $counter);
308 } else {
309 $curIndent = $nextIndent = 0;
310 }
311
312 if ($prevIndent == $curIndent) {
313 // pcn = Previous, Current, Next -> Depth
314 // pcn: 000, 001, 110, 220
315 if ($curIndent == $nextIndent) {
316 // (1) pcn: 000
317 // echo"(1)";
318 $this->renderBeginListItem($identifier);
319 $this->renderListItem($value, $identifier, $counter);
320 $this->renderEndListItem();
321 } elseif ($curIndent > $nextIndent) {
322 if ($prevIndent == $nextIndent) {
323 // wenn prev = cur ist und cur > next, wie soll prev = next sein !?
324
325 // (8) pcn: 110
326 // echo"(8)";
327 $this->renderBeginListItem($identifier);
328 $this->renderListItem($value, $identifier, $counter);
329 $this->renderEndListItem();
330 $this->renderEndSubList();
331 $this->renderEndListItem();
332 } elseif ($prevIndent > $nextIndent) {
333 // (12) pcn: 220
334 // echo"(12)";
335 $this->renderBeginListItem($identifier);
336 $this->renderListItem($value, $identifier, $counter);
337
338 for ($openlists = $nextIndent; $openlists < $curIndent; $openlists++) {
339 $this->renderEndListItem();
340 $this->renderEndSubList();
341 $this->renderEndListItem();
342 }
343 }
344 } elseif ($curIndent < $nextIndent) {
345 // (2) pcn: 001
346 // echo"(2)";
347 $this->renderBeginListItem($identifier);
348 $this->renderListItem($value, $identifier, $counter);
349 $this->renderBeginSubList();
350 }
351 } elseif ($prevIndent > $curIndent) {
352 if ($curIndent == $nextIndent) {
353 // (6) pcn: 100
354 // echo"(6)";
355 $this->renderBeginListItem($identifier);
356 $this->renderListItem($value, $identifier, $counter);
357 $this->renderEndListItem();
358 } elseif ($curIndent > $nextIndent) {
359 // (11) pcn: 210
360 // echo"(11)";
361 $this->renderBeginListItem($identifier);
362 $this->renderListItem($value, $identifier, $counter);
363 $this->renderEndListItem();
364 $this->renderEndSubList();
365 } elseif ($curIndent < $nextIndent) {
366 if ($prevIndent == $nextIndent) {
367 // (7) pcn: 101
368 // echo"(7)";
369 $this->renderBeginListItem($identifier);
370 $this->renderListItem($value, $identifier, $counter);
371 $this->renderBeginSubList();
372 } elseif ($prevIndent > $nextIndent) {
373 // (10) pcn: 201
374 // echo"(10)";
375 $this->renderBeginListItem($identifier);
376 $this->renderListItem($value, $identifier, $counter);
377 for ($openlists = $nextIndent; $openlists < $curIndent; $openlists++) {
378 $this->renderEndSubList();
379 }
380 $this->renderBeginSubList();
381 }
382 }
383 } elseif ($prevIndent < $curIndent) {
384 if ($curIndent == $nextIndent) {
385 // (4) pcn: 011
386 // echo"(4)";
387 $this->renderBeginListItem($identifier);
388 $this->renderListItem($value, $identifier, $counter);
389 $this->renderEndListItem();
390 } elseif ($curIndent > $nextIndent) {
391 if ($prevIndent == $nextIndent) {
392 // (3) pcn: 010,
393 // echo"(3)";
394 $this->renderBeginListItem($identifier);
395 $this->renderListItem($value, $identifier, $counter);
396 $this->renderEndListItem();
397 $this->renderEndSubList();
398 $this->renderEndListItem();
399 } elseif ($prevIndent > $nextIndent) {
400 // (9) pcn: 120
401 // echo"(9)";
402 $this->renderBeginListItem($identifier);
403 $this->renderListItem($value, $identifier, $counter);
404 for ($openlists = $nextIndent; $openlists < $curIndent; $openlists++) {
405 $this->renderEndListItem();
406 $this->renderEndSubList();
407 }
408 }
409 } elseif ($curIndent < $nextIndent) {
410 // (5) pcn: 012
411 // echo"(5)";
412 $this->renderBeginListItem($identifier);
413 $this->renderListItem($value, $identifier, $counter);
414 $this->renderBeginSubList();
415 }
416 }
417
418 $prevIndent = $curIndent;
419 }
420
421 $this->renderEndSubList();
422 $this->renderListContainer();
423
424 return $this->fetchListHtml();
425 }
426
427 protected function renderJsInit()
428 {
429 $jsTpl = new ilTemplate('tpl.prop_nested_ordering_js.html', true, true, 'Services/Form');
430
431 if (!$this->isNestingEnabled()) {
432 $jsTpl->setCurrentBlock('avoid_nesting');
433 $jsTpl->touchBlock('avoid_nesting');
434 $jsTpl->parseCurrentBlock();
435 }
436
437 $jsTpl->setCurrentBlock('nested_ordering_init');
438 $jsTpl->setVariable('INSTANCE_ID', $this->getInstanceId());
439 $jsTpl->setVariable('INDENTATION_POSTVAR', $this->getPostVarSubField('indentation'));
440 $jsTpl->setVariable('HTML_LIST_TAG', $this->getHtmlListTag());
441 $jsTpl->setVariable('CSS_LIST_CLASS', $this->getCssListClass());
442 $jsTpl->setVariable('CSS_ITEM_CLASS', $this->getCssItemClass());
443 $jsTpl->parseCurrentBlock();
444
445 return $jsTpl->get();
446 }
447
448 public function render($a_mode = "")
449 {
450 if ($this->isStylingEnabled()) {
451 $this->getGlobalTpl()->addCss('Services/Form/css/nested_ordering.css');
452 }
453
454 if ($this->isInteractionEnabled()) {
455 require_once 'Services/jQuery/classes/class.iljQueryUtil.php';
456
459
460 $this->getGlobalTpl()->addJavaScript('./libs/bower/bower_components/nestable2/jquery.nestable.js');
461
462 return $this->renderMainList() . $this->renderJsInit();
463 }
464
465 return $this->renderMainList();
466 }
467
468 public function onCheckInput()
469 {
470 return true;
471 }
472
473 public function getHTML()
474 {
475 return $this->render();
476 }
477}
if(!defined('PATH_SEPARATOR')) $GLOBALS['_PEAR_default_error_mode']
Definition: PEAR.php:64
An exception for terminatinating execution or to throw for unit testing.
addFormValuesManipulator(ilFormValuesManipulator $manipulator)
getNextIndentation($elementValues, $elementCounter)
getCurrentIndentation($elementValues, $elementCounter)
getItemHtml($value, $identifier, $position, $itemSubFieldPostVar, $itemSubFieldId)
special template class to simplify handling of ITX/PEAR
static initjQuery(ilGlobalTemplateInterface $a_tpl=null)
inits and adds the jQuery JS-File to the global or a passed template
static initjQueryUI($a_tpl=null)
inits and adds the jQuery-UI JS-File to the global template (see included_components....
$keys
Definition: metadata.php:187
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc