ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
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 
4 require_once 'Services/Form/classes/class.ilIdentifiedMultiValuesInputGUI.php';
5 require_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 
27  protected $instanceId = self::DEFAULT_INSTANCE_ID;
28 
29  protected $interactionEnabled = true;
30 
31  protected $nestingEnabled = true;
32 
33  protected $stylingDisabled = false;
34 
35  protected $listTpl = null;
36 
37  protected $cssListClass = self::CSS_LIST_CLASS;
38 
39  protected $cssItemClass = self::CSS_ITEM_CLASS;
40 
41  protected $cssHandleClass = self::CSS_HANDLE_CLASS;
42 
43  protected $htmlListTag = self::HTML_LIST_TAG_OL;
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  {
76  return $this->nestingEnabled;
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  {
128  return $this->cssHandleClass;
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 
158  public function setHtmlListTag($htmlListTag)
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 }
$keys
$values
special template class to simplify handling of ITX/PEAR
static initjQueryUI($a_tpl=null)
inits and adds the jQuery-UI JS-File to the global template (see included_components.txt for included components)
getItemHtml($value, $identifier, $position, $itemSubFieldPostVar, $itemSubFieldId)
getCurrentIndentation($elementValues, $elementCounter)
getNextIndentation($elementValues, $elementCounter)
static initjQuery($a_tpl=null)
inits and adds the jQuery JS-File to the global or a passed template
addFormValuesManipulator(ilFormValuesManipulator $manipulator)
$GLOBALS['JPEG_Segment_Names']
Global Variable: XMP_tag_captions.