19declare(strict_types=1);
66 RendererInterface $default_renderer
69 $tpl->setVariable(
"TITLE", $component->getTitle());
70 $expcollapsebtns = [];
71 if ($sig_ta = $component->getExpandCollapseAllSignal()) {
72 $sig_ta_expand = clone $sig_ta;
73 $sig_ta_expand->addOption(
'expand',
true);
75 ->standard($this->
txt(
'presentation_table_expand'),
'')
76 ->withOnClick($sig_ta_expand);
77 $sig_ta_collapse = clone $sig_ta;
78 $sig_ta_collapse->addOption(
'expand',
false);
80 ->standard($this->
txt(
'presentation_table_collapse'),
'')
81 ->withOnClick($sig_ta_collapse);
82 $component = $component->withAdditionalOnLoadCode(
84 il.UI.table.presentation.init('{$id}');
85 $(document).on('$sig_ta', function(event, signal_data) { il.UI.table.presentation.get('$id').expandAll(signal_data); return false; });
90 $tpl->setVariable(
"EXPANDCOLLAPSEALL", $default_renderer->render($expcollapsebtns));
92 $vcs = $component->getViewControls();
94 $tpl->setVariable(
"VC", $default_renderer->render($vcs));
98 $tpl->setVariable(
"ID",
$id);
100 $row_mapping = $component->getRowMapping();
101 $data = $component->getData();
105 $this->renderEmptyPresentationRow($tpl, $default_renderer, $this->
txt(
'ui_table_no_records'));
109 foreach (
$data as $record) {
111 new PresentationRow($component->getSignalGenerator(), $component_id),
113 $this->getUIFactory(),
114 $component->getEnvironment()
117 $tpl->setCurrentBlock(
"row");
118 $tpl->setVariable(
"ROW", $default_renderer->render($row));
119 $tpl->parseCurrentBlock();
127 RendererInterface $default_renderer
129 $f = $this->getUIFactory();
130 $tpl = $this->getTemplate(
"tpl.presentationrow.html",
true,
true);
132 $component = $this->registerSignals($component->withResetSignals());
133 $sig_show = $component->getShowSignal();
134 $sig_hide = $component->getCloseSignal();
135 $sig_toggle = $component->getToggleSignal();
136 $id = $this->bindJavaScript($component);
138 $expander =
$f->symbol()->glyph()->expand(
"#")
139 ->withOnClick($sig_show);
140 $collapser =
$f->symbol()->glyph()->collapse(
"#")
141 ->withOnClick($sig_hide);
142 $shy_expander =
$f->button()->shy($this->txt(
"presentation_table_more"),
"#")
143 ->withOnClick($sig_show);
145 $tpl->setVariable(
"ID",
$id);
146 $tpl->setVariable(
"EXPANDER", $default_renderer->render($expander));
147 $tpl->setVariable(
"COLLAPSER", $default_renderer->render($collapser));
148 $tpl->setVariable(
"SHY_EXPANDER", $default_renderer->render($shy_expander));
150 if ($symbol = $component->getLeadingSymbol()) {
151 $tpl->setVariable(
"SYMBOL", $default_renderer->render($symbol));
153 $tpl->setVariable(
"HEADLINE", $component->getHeadline());
154 $tpl->setVariable(
"TOGGLE_SIGNAL", $sig_toggle);
155 $subheadline = $component->getSubheadline();
157 $tpl->setVariable(
"SUBHEADLINE", $subheadline);
160 foreach ($component->getImportantFields() as $label => $value) {
161 $tpl->setCurrentBlock(
"important_field");
162 if (is_string($label)) {
163 $tpl->setVariable(
"IMPORTANT_FIELD_LABEL", $label);
165 $tpl->setVariable(
"IMPORTANT_FIELD_VALUE", $value);
166 $tpl->parseCurrentBlock();
169 $tpl->setVariable(
"DESCLIST", $default_renderer->render($component->getContent()));
171 $further_fields_headline = $component->getFurtherFieldsHeadline();
172 $further_fields = $component->getFurtherFields();
174 if (count($further_fields) > 0) {
175 $tpl->touchBlock(
"has_further_fields");
177 if ($further_fields_headline) {
178 $tpl->setVariable(
"FURTHER_FIELDS_HEADLINE", $further_fields_headline);
181 foreach ($further_fields as $label => $value) {
182 $tpl->setCurrentBlock(
"further_field");
183 if (is_string($label)) {
184 $tpl->setVariable(
"FIELD_LABEL", $label);
186 $tpl->setVariable(
"FIELD_VALUE", $value);
187 $tpl->parseCurrentBlock();
191 $action = $component->getAction();
192 if (!is_null($action)) {
193 $tpl->setCurrentBlock(
"button");
194 $tpl->setVariable(
"BUTTON", $default_renderer->render($action));
195 $tpl->parseCurrentBlock();
203 $tpl = $this->getTemplate(
"tpl.datatable.html",
true,
true);
204 $component = $this->registerActions($component);
206 [$component, $view_controls] = $component->applyViewControls(
207 $component->getFilter(),
208 $component->getAdditionalParameters()
211 $rows = $component->getDataRetrieval()->getRows(
212 $component->getRowBuilder(),
213 array_keys($component->getVisibleColumns()),
214 $component->getRange(),
215 $component->getOrder(),
216 $component->getAdditionalViewControlData(),
217 $component->getFilter(),
218 $component->getAdditionalParameters()
222 $compensate_col_index = 1;
223 if ($component->hasMultiActions()) {
224 $compensate_col_index += 1;
226 $compensate_col_count = 0;
227 if ($component->hasMultiActions()) {
228 $compensate_col_count += 1;
230 if ($component->hasSingleActions()) {
231 $compensate_col_count += 1;
234 $id = $this->bindJavaScript($component);
235 $tpl->setVariable(
'ID',
$id);
236 $tpl->setVariable(
'TITLE', $component->getTitle());
237 $tpl->setVariable(
'COL_COUNT', (
string) $component->getColumnCount() + $compensate_col_count);
238 $tpl->setVariable(
'VIEW_CONTROLS', $default_renderer->render($view_controls));
240 $sortation_signal =
null;
242 if (!$rows->valid()) {
243 $this->renderFullWidthDataCell($component, $tpl, $this->txt(
'ui_table_no_records'));
245 $this->renderActionsHeader($default_renderer, $component, $tpl, $compensate_col_count);
246 $this->appendTableRows($tpl, $rows, $default_renderer);
248 if ($component->hasMultiActions()) {
249 $multi_actions = $component->getMultiActions();
250 $modal = $this->buildMultiActionsAllObjectsModal($multi_actions,
$id);
251 $multi_actions_dropdown = $this->buildMultiActionsDropdown(
253 $component->getMultiActionSignal(),
254 $modal->getShowSignal()
256 $multi_action_col_span = count($component->getVisibleColumns()) + $compensate_col_count;
257 $tpl->setVariable(
'MULTI_ACTION_SPAN', (
string) $multi_action_col_span);
258 $tpl->setVariable(
'MULTI_ACTION_TRIGGERER', $default_renderer->render($multi_actions_dropdown));
259 $tpl->setVariable(
'MULTI_ACTION_ALL_MODAL', $default_renderer->render($modal));
260 $tpl->setVariable(
'MULTI_ACTION_WARNING', $default_renderer->render($this->getUrlTooLongWarning()));
261 $tpl->setVariable(
'MULTI_ACTION_WARNING_BUTTON_CLOSE_LABEL', $this->txt(
'datatable_close_warning'));
264 $sortation_view_control = array_filter(
265 $view_controls->getInputs(),
268 if ($sortation_view_control) {
269 $sortation_signal = array_shift($sortation_view_control)->getInternalSignal();
270 $sortation_signal->addOption(
'parent_container',
$id);
274 $this->renderTableHeader($default_renderer, $component, $tpl, $sortation_signal, $compensate_col_index);
279 RendererInterface $default_renderer,
283 int $compensate_col_index,
286 $glyph_factory = $this->getUIFactory()->symbol()->glyph();
287 $sort_col = key($order->get());
288 $sort_direction = current($order->get());
289 $columns = $component->getVisibleColumns();
291 foreach ($columns as $col_id => $col) {
292 $param_sort_direction = Order::ASC;
293 $col_title = $col->getTitle();
294 if ($col_id === $sort_col) {
295 if ($sort_direction === Order::ASC) {
296 $sortation =
"ascending";
297 $sortation_glyph = $glyph_factory->sortAscending(
"#");
298 $param_sort_direction = Order::DESC;
300 if ($sort_direction === Order::DESC) {
301 $sortation =
"descending";
302 $sortation_glyph = $glyph_factory->sortDescending(
"#");
308 $tpl->
setVariable(
'COL_INDEX', (
string) $col->getIndex() + $compensate_col_index);
310 if ($col->isSortable() && !is_null($sortation_signal)) {
311 $sort_signal = clone $sortation_signal;
312 $sort_signal->addOption(
'value',
"$col_id:$param_sort_direction");
313 $col_title = $default_renderer->render(
314 $this->getUIFactory()->
button()->shy($col_title, $sort_signal)
317 if ($col_id === $sort_col) {
318 $sortation_glyph = $default_renderer->render($sortation_glyph->withOnClick($sort_signal));
320 $tpl->
setVariable(
'COL_SORTATION_GLYPH', $sortation_glyph);
325 $tpl->
setVariable(
'COL_TYPE', strtolower($col->getType()));
331 RendererInterface $default_renderer,
334 int $compensate_col_count,
336 if ($component->hasSingleActions()) {
337 $tpl->
setVariable(
'COL_INDEX_ACTION', (
string) $component->getColumnCount() + $compensate_col_count);
338 $tpl->
setVariable(
'COL_TITLE_ACTION', $this->txt(
'actions'));
341 if ($component->hasMultiActions()) {
342 $glyph_factory = $this->getUIFactory()->symbol()->glyph();
343 $signal = $component->getSelectionSignal();
344 $sig_all = clone $signal;
345 $sig_all->addOption(
'select',
true);
346 $select_all = $glyph_factory->add()->withOnClick($sig_all);
347 $signal->addOption(
'select',
false);
348 $select_none = $glyph_factory->close()->withOnClick($signal);
349 $tpl->
setVariable(
'SELECTION_CONTROL_SELECT', $default_renderer->render($select_all));
350 $tpl->
setVariable(
'SELECTION_CONTROL_DESELECT', $default_renderer->render($select_none));
354 if (!$component->isOrderingDisabled() && !$component->hasMultiActions()) {
366 $cell_tpl = $this->getTemplate(
'tpl.datacell.html',
true,
true);
367 $cell_tpl->setCurrentBlock(
'cell');
368 $cell_tpl->setVariable(
'CELL_CONTENT', $content);
369 $cell_tpl->setVariable(
'COL_SPAN', count($component->getVisibleColumns()));
370 $cell_tpl->setVariable(
'COL_TYPE',
'full-width');
371 $cell_tpl->setVariable(
'COL_INDEX',
'1');
372 $cell_tpl->parseCurrentBlock();
382 $opt_action_id = Action::OPT_ACTIONID;
383 $opt_row_id = Action::OPT_ROWID;
385 if ($component->hasMultiActions()) {
386 $component = $component->withAdditionalOnLoadCode(
387 static fn(
$id):
string =>
"il.UI.table.data.get('{$id}').selectAll(false);"
392 foreach ($component->getAllActions() as $action_id => $action) {
393 $component = $component->withAdditionalOnLoadCode($this->getActionRegistration((
string) $action_id, $action));
394 if ($action->isAsync()) {
395 $signal = clone $component->getAsyncActionSignal();
396 $signal->addOption(Action::OPT_ACTIONID, $action_id);
397 $action = $action->withSignalTarget($signal);
399 $actions[$action_id] = $action;
401 $component = $component->withActions($actions);
403 $component = $component
404 ->withAdditionalOnLoadCode(
405 static fn(
$id):
string =>
406 "il.UI.table.data.init('{$id}','{$opt_action_id}','{$opt_row_id}');"
408 ->withAdditionalOnLoadCode($this->getAsyncActionHandler($component->getAsyncActionSignal()))
409 ->withAdditionalOnLoadCode($this->getMultiActionHandler($component->getMultiActionSignal()))
410 ->withAdditionalOnLoadCode($this->getSelectionHandler($component->getSelectionSignal()));
417 \Generator|array $rows,
418 RendererInterface $default_renderer
421 foreach ($rows as $row) {
422 $row_contents = $default_renderer->render($row);
423 $alternate = ($alternate ===
'odd') ?
'even' :
'odd';
433 $row_tpl = $this->getTemplate(
'tpl.presentationrow_empty.html',
true,
true);
434 $row_tpl->setVariable(
'CONTENT', $content);
445 $f = $this->getUIFactory();
447 $msg =
$f->messageBox()->confirmation($this->txt(
'datatable_multiactionmodal_msg'));
449 $select =
$f->input()->field()->select(
450 $this->txt(
'datatable_multiactionmodal_actionlabel'),
452 static fn($action):
string => $action->getLabel(),
456 )->withRequired(
true);
457 $submit =
$f->button()->primary($this->txt(
'datatable_multiactionmodal_apply'),
'')
459 static fn(
$id):
string =>
"$('#{$id}').click(function() { il.UI.table.data.get('{$table_id}').doActionForAll(this); return false; });"
462 ->roundtrip($this->txt(
'datatable_multiactionmodal_title'), [$msg, $select])
463 ->withActionButtons([$submit]);
469 $f = $this->getUIFactory();
470 return $f->messageBox()->failure($this->txt(
'warning_url_too_long_msg'));
481 if ($actions === []) {
484 $f = $this->getUIFactory();
485 $glyph =
$f->symbol()->glyph()->bulletlist();
487 $all_obj_buttons = [];
488 foreach ($actions as $action_id => $act) {
489 $signal = clone $action_signal;
490 $signal->addOption(Action::OPT_ACTIONID, $action_id);
491 $buttons[] =
$f->button()->shy($act->getLabel(), $signal);
494 $buttons[] =
$f->divider()->horizontal();
495 $buttons[] =
$f->button()->shy($this->txt(
'datatable_multiactionmodal_listentry'),
'#')->withOnClick($modal_signal);
497 return $f->dropdown()->standard($buttons)->withLabel($this->txt(
'datatable_multiaction_label'));
502 return static function (
$id) use ($action_signal):
string {
504 $(document).on('{$action_signal}', function(event, signal_data) {
505 il.UI.table.data.get('{$id}').doSingleAction(signal_data);
512 return static function (
$id) use ($action_signal):
string {
514 $(document).on('{$action_signal}', function(event, signal_data) {
515 il.UI.table.data.get('{$id}').doMultiAction(signal_data);
523 return static function (
$id) use ($selection_signal):
string {
525 $(document).on('{$selection_signal}', function(event, signal_data) {
526 il.UI.table.data.get('{$id}').selectAll(signal_data.options.select);
537 $async = $action->isAsync() ?
'true' :
'false';
538 $url_builder_js = $action->getURLBuilderJS();
539 $tokens_js = $action->getURLBuilderTokensJS();
541 return static function (
$id) use ($action_id, $async, $url_builder_js, $tokens_js):
string {
543 il.UI.table.data.get('{$id}').registerAction('{$action_id}', {$async}, {$url_builder_js}, {$tokens_js});
550 $cell_tpl = $this->getTemplate(
"tpl.datacell.html",
true,
true);
551 $this->fillCells($component, $cell_tpl, $default_renderer);
554 return $cell_tpl->get();
559 $cell_tpl = $this->getTemplate(
"tpl.orderingcell.html",
true,
true);
560 $this->fillCells($component, $cell_tpl, $default_renderer);
563 if ($component->isOrderingDisabled()) {
564 return $cell_tpl->get();
567 $namesource =
new class () implements
NameSource {
568 public function getNewName():
string
572 public function getNewDedicatedName(
string $dedicated_name):
string
574 return $dedicated_name;
578 $numeric_label = $this->txt(
"ui_table_order");
579 $input = $this->getUIFactory()->input()->field()->numeric($numeric_label)
580 ->withDedicatedName($component->getId())
581 ->withNameFrom($namesource)
582 ->withValue($component->getPosition() * 10);
583 $cell_tpl->setVariable(
'ORDER_INPUT', $default_renderer->render($input));
585 return $cell_tpl->get();
592 RendererInterface $default_renderer
594 $cols = $row->getColumns();
595 foreach ($cols as $col_id => $column) {
596 if ($column->isHighlighted()) {
600 $cell_tpl->
setVariable(
'COL_TYPE', strtolower($column->getType()));
601 $cell_content = $row->getCellContent($col_id);
603 $cell_content = $default_renderer->render($cell_content);
605 $cell_tpl->
setVariable(
'CELL_CONTENT', $cell_content);
606 $cell_tpl->
setVariable(
'CELL_COL_TITLE', $row->getColumns()[$col_id]->getTitle());
610 if ($row->tableHasMultiActions()) {
613 if ($row->tableHasSingleActions()) {
614 $row_actions_dropdown = $this->getSingleActionsForRow(
618 $cell_tpl->
setVariable(
'ACTION_CONTENT', $default_renderer->render($row_actions_dropdown));
622 if (!$row->isOrderingDisabled()) {
623 $drag_handle = $this->getUIFactory()->symbol()->glyph()->dragHandle();
624 $drag_handle = $default_renderer->render($drag_handle);
625 $cell_tpl->
setVariable(
'DRAG_HANDLE', $drag_handle);
635 $f = $this->getUIFactory();
637 foreach ($actions as $act) {
638 $act = $act->withRowId($row_id);
639 $target = $act->getTarget();
640 if ($target instanceof
URI) {
641 $target = (string) $target;
643 $buttons[] =
$f->button()->shy($act->getLabel(), $target);
645 return $f->dropdown()->standard($buttons);
651 $tpl = $this->getTemplate(
"tpl.orderingtable.html",
true,
true);
652 $component = $this->registerActions($component);
654 [$component, $view_controls] = $component->applyViewControls();
656 $rows = $component->getDataBinding()->getRows(
657 $component->getRowBuilder(),
658 array_keys($component->getVisibleColumns()),
662 if (!$component->isOrderingDisabled()) {
663 $component = $component->withAdditionalOnLoadCode(
664 static fn(
$id):
string =>
"il.UI.table.ordering.init('{$id}');"
669 $compensate_col_index = 1;
671 if ($component->hasMultiActions() || !$component->isOrderingDisabled()) {
672 $compensate_col_index += 1;
674 if (!$component->isOrderingDisabled()) {
675 $compensate_col_index += 1;
678 $compensate_col_count = 0;
679 if ($component->hasMultiActions() || !$component->isOrderingDisabled()) {
680 $compensate_col_count += 1;
682 if (!$component->isOrderingDisabled()) {
683 $compensate_col_count += 1;
685 if ($component->hasSingleActions()) {
686 $compensate_col_count += 1;
689 $tableid = $this->bindJavaScript($component) ?? $this->createId();
691 if (!$component->isOrderingDisabled()) {
692 $submit = $this->getUIFactory()->button()->standard($this->txt(
'sorting_save'),
"")
693 ->withOnLoadCode(
static fn(
$id) =>
"document.getElementById('$id').addEventListener('click',
694 function() {document.querySelector('#$tableid form.c-table-ordering__form').submit();return false;});");
696 $tpl->
setVariable(
'FORM_BUTTONS', $default_renderer->render($submit));
697 $tpl->
setVariable(
'POS_INPUT_TITLE', $this->txt(
'table_posinput_col_title'));
702 $tpl->
setVariable(
'TARGET_URL', $component->getTargetURL() ? $component->getTargetURL()->__toString() :
'#');
703 $tpl->
setVariable(
'TITLE', $component->getTitle());
704 $tpl->
setVariable(
'COL_COUNT', (
string) $component->getColumnCount() + $compensate_col_count);
705 $tpl->
setVariable(
'VIEW_CONTROLS', $default_renderer->render($view_controls));
707 $columns = $component->getVisibleColumns();
708 foreach ($columns as $col_id => $col) {
709 $col_title = $col->getTitle();
711 $tpl->
setVariable(
'COL_INDEX', (
string) $col->getIndex() + $compensate_col_index);
713 $tpl->
setVariable(
'COL_TYPE', strtolower($col->getType()));
717 $rows = iterator_to_array($rows);
719 foreach ($rows as $idx => $row) {
721 ->withPosition($idx + 1)
722 ->withOrderingDisabled($component->isOrderingDisabled());
725 $this->renderActionsHeader($default_renderer, $component, $tpl, $compensate_col_count);
726 $this->appendTableRows($tpl, $r, $default_renderer);
728 if ($component->hasMultiActions()) {
729 $multi_actions = $component->getMultiActions();
730 $modal = $this->buildMultiActionsAllObjectsModal($multi_actions, $tableid);
731 $multi_actions_dropdown = $this->buildMultiActionsDropdown(
733 $component->getMultiActionSignal(),
734 $modal->getShowSignal()
737 $tpl->
setVariable(
'MULTI_ACTION_TRIGGERER', $default_renderer->render($multi_actions_dropdown));
738 $tpl->
setVariable(
'MULTI_ACTION_ALL_MODAL', $default_renderer->render($modal));
739 $tpl->
setVariable(
'MULTI_ACTION_WARNING', $default_renderer->render($this->getUrlTooLongWarning()));
740 $tpl->
setVariable(
'MULTI_ACTION_WARNING_BUTTON_CLOSE_LABEL', $this->txt(
'datatable_close_warning'));
742 if ($component->hasMultiActions() || !$component->isOrderingDisabled()) {
743 $multi_action_col_span = count($component->getVisibleColumns()) + $compensate_col_count;
744 $tpl->
setVariable(
'MULTI_ACTION_SPAN', (
string) $multi_action_col_span);
755 parent::registerResources($registry);
756 $registry->
register(
'assets/js/table.min.js');
757 $registry->
register(
'assets/js/modal.min.js');
762 $show = $component->getShowSignal();
763 $close = $component->getCloseSignal();
764 $toggle = $component->getToggleSignal();
765 $table_id = $component->getTableId();
767 static fn(
$id):
string =>
768 "$(document).on('$show', function() { il.UI.table.presentation.get('$table_id').expandRow('$id'); return false; });" .
769 "$(document).on('$close', function() { il.UI.table.presentation.get('$table_id').collapseRow('$id'); return false; });" .
770 "$(document).on('$toggle', function() { il.UI.table.presentation.get('$table_id').toggleRow('$id'); return false; });"
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Both the subject and the direction need to be specified when expressing an order.
The scope of this class is split ilias-conform URI's into components.
registerSignals(Component\Table\PresentationRow $component)
fillCells(Component\Table\DataRow $row, Template $cell_tpl, RendererInterface $default_renderer)
registerActions(Component\Table\Table $component)
renderDataRow(Component\Table\DataRow $component, RendererInterface $default_renderer)
getAsyncActionHandler(Component\Signal $action_signal)
getMultiActionHandler(Component\Signal $action_signal)
renderOrderingTable(Component\Table\Ordering $component, RendererInterface $default_renderer)
getActionRegistration(string $action_id, Action $action)
buildMultiActionsAllObjectsModal(array $actions, string $table_id)
renderPresentationRow(Component\Table\PresentationRow $component, RendererInterface $default_renderer)
buildMultiActionsDropdown(array $actions, Component\Signal $action_signal, Component\Signal $modal_signal,)
renderPresentationTable(Component\Table\Presentation $component, RendererInterface $default_renderer)
renderFullWidthDataCell(Component\Table\Data $component, Template $tpl, string $content)
Renders a full-width cell with a single message within, indication there is no data to display.
getSingleActionsForRow(string $row_id, array $actions)
renderActionsHeader(RendererInterface $default_renderer, Component\Table\Table $component, Template $tpl, int $compensate_col_count,)
render(Component\Component $component, RendererInterface $default_renderer)
renderEmptyPresentationRow(Template $tpl, RendererInterface $default_renderer, string $content)
renderTableHeader(RendererInterface $default_renderer, Component\Table\Data $component, Template $tpl, ?Component\Signal $sortation_signal, int $compensate_col_index,)
getSelectionHandler(Component\Signal $selection_signal)
renderOrderingRow(Component\Table\OrderingRow $component, RendererInterface $default_renderer)
appendTableRows(Template $tpl, \Generator|array $rows, RendererInterface $default_renderer)
renderDataTable(Component\Table\Data $component, RendererInterface $default_renderer)
registerResources(ResourceRegistry $registry)
Announce resources this renderer requires.
Base class for all component renderers.
cannotHandleComponent(Component $component)
This method MUST be called by derived component renderers, if.
txt(string $id)
Get a text from the language file.
bindJavaScript(JavaScriptBindable $component)
Bind the component to JavaScript.
getUIFactory()
Get a UI factory.
getTemplate(string $name, bool $purge_unfilled_vars, bool $purge_unused_blocks)
Get template of component this renderer is made for.
This describes commonalities between all types of Dropdowns.
Interface to be extended by components that have the possibility to bind to Javascript.
withAdditionalOnLoadCode(Closure $binder)
Add some onload-code to the component instead of replacing the existing one.
Registry for resources required by rendered output like Javascript or CSS.
register(string $name)
Add a dependency.
Interface to templating as it is used in the UI framework.
setVariable(string $name, $value)
Set a variable in the current block.
get(?string $block=null)
Get the rendered template or a specific block.
setCurrentBlock(string $name)
Set the block to work on.
touchBlock(string $name)
Touch a block without working further on it.
parseCurrentBlock()
Parse the block that is currently worked on.
An entity that renders components to a string output.
button(string $caption, string $cmd)
Interface Observer \BackgroundTasks Contains several chained tasks and infos about them.
if(!file_exists('../ilias.ini.php'))