ILIAS  trunk Revision v12.0_alpha-1540-g00f839d5fa1
class.ilTextAreaInputGUI.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
28{
29 protected array $rteSupport = [];
30 protected string $value = "";
31 protected int $cols = 30;
32 protected int $rows = 5;
33 protected bool $usert = false;
34 protected array $rtetags = [];
35 protected array $plugins = [];
36 protected array $removeplugins = [];
37 protected array $buttons = [];
38 protected array $rtesupport = [];
39 protected bool $use_tags_for_rte_only = true;
40 protected int $max_num_chars = 0;
41 protected int $min_num_chars = 0;
42 protected int $initial_rte_width = 795;
43 protected array $disabled_buttons = array();
44 protected bool $usePurifier = false;
46 protected ?string $root_block_element = null;
48
49 protected array $rte_tag_set = array(
50 "mini" => array("strong", "em", "u", "ol", "li", "ul", "blockquote", "a", "p", "span", "br"), // #13286/#17981
51 "standard" => array("strong", "em", "u", "ol", "li", "ul", "p", "div",
52 "i", "b", "code", "sup", "sub", "pre", "strike", "gap"),
53 "extended" => array(
54 "a","blockquote","br","cite","code","div","em","h1","h2","h3",
55 "h4","h5","h6","hr","li","ol","p",
56 "pre","span","strike","strong","sub","sup","u","ul",
57 "i", "b", "gap"),
58 "extended_img" => array(
59 "a","blockquote","br","cite","code","div","em","h1","h2","h3",
60 "h4","h5","h6","hr","img","li","ol","p",
61 "pre","span","strike","strong","sub","sup","u","ul",
62 "i", "b", "gap"),
63 "extended_table" => array(
64 "a","blockquote","br","cite","code","div","em","h1","h2","h3",
65 "h4","h5","h6","hr","li","ol","p",
66 "pre","span","strike","strong","sub","sup","table","td",
67 "tr","u","ul", "i", "b", "gap"),
68 "extended_table_img" => array(
69 "a","blockquote","br","cite","code","div","em","h1","h2","h3",
70 "h4","h5","h6","hr","img","li","ol","p",
71 "pre","span","strike","strong","sub","sup","table","td",
72 "tr","u","ul", "i", "b", "gap"),
73 "full" => array(
74 "a","blockquote","br","cite","code","div","em","h1","h2","h3",
75 "h4","h5","h6","hr","img","li","ol","p",
76 "pre","span","strike","strong","sub","sup","table","td",
77 "tr","u","ul","ruby","rbc","rtc","rb","rt","rp", "i", "b", "gap"));
78
79 public function __construct(
80 string $a_title = "",
81 string $a_postvar = ""
82 ) {
83 global $DIC;
84
85 $this->lng = $DIC->language();
86 $this->user = $DIC->user();
87 parent::__construct($a_title, $a_postvar);
88 $this->setType("textarea");
89 $this->setRteTagSet("standard");
90 $this->plugins = array();
91 $this->removeplugins = array();
92 $this->buttons = array();
93 $this->rteSupport = array();
94 }
95
96 public function setValue(string $a_value): void
97 {
98 $this->value = $a_value;
99 }
100
101 public function getValue(): string
102 {
103 return $this->value;
104 }
105
109 public function setCols(int $a_cols): void
110 {
111 // obsolete because of bootstrap
112 $this->cols = $a_cols;
113 }
114
115 public function getCols(): int
116 {
117 return $this->cols;
118 }
119
120 public function setRows(int $a_rows): void
121 {
122 $this->rows = $a_rows;
123 }
124
125 public function getRows(): int
126 {
127 return $this->rows;
128 }
129
130 // Set Maximum number of characters allowed.
131 public function setMaxNumOfChars(int $a_number): void
132 {
133 $this->max_num_chars = $a_number;
134 }
135
136 public function getMaxNumOfChars(): int
137 {
139 }
140
141 public function setMinNumOfChars(int $a_number): void
142 {
143 $this->min_num_chars = $a_number;
144 }
145
146 public function getMinNumOfChars(): int
147 {
149 }
150
151 public function setUseRte(bool $a_usert, string $version = ''): void
152 {
153 $this->usert = $a_usert;
154 $this->rteSupport['version'] = $version;
155 }
156
157 public function getUseRte(): bool
158 {
159 return $this->usert;
160 }
161
162 public function addPlugin(string $a_plugin): void
163 {
164 $this->plugins[$a_plugin] = $a_plugin;
165 }
166
167 public function removePlugin(string $a_plugin): void
168 {
169 $this->removeplugins[$a_plugin] = $a_plugin;
170 }
171
172 // Add RTE button.
173 public function addButton(string $a_button): void
174 {
175 $this->buttons[$a_button] = $a_button;
176 }
177
178 public function removeButton(string $a_button): void
179 {
180 unset($this->buttons[$a_button]);
181 }
182
186 public function setRTESupport(
187 int $obj_id,
188 string $obj_type,
189 string $module,
190 ?string $cfg_template = null,
191 bool $hide_switch = false,
192 ?string $version = null
193 ): void {
194 $this->rteSupport = array(
195 "obj_id" => $obj_id,
196 "obj_type" => $obj_type,
197 "module" => $module,
198 'cfg_template' => $cfg_template,
199 'hide_switch' => $hide_switch,
200 'version' => $version
201 );
202 }
203
204 public function removeRTESupport(): void
205 {
206 $this->rteSupport = array();
207 }
208
209 public function setRteTags(array $a_rtetags): void
210 {
211 $this->rtetags = $a_rtetags;
212 }
213
214 public function getRteTags(): array
215 {
216 return $this->rtetags;
217 }
218
223 public function setRteTagSet(string $a_set_name): void
224 {
225 $this->setRteTags($this->rte_tag_set[$a_set_name]);
226 }
227
228 public function getRteTagSet($a_set_name): array
229 {
230 return $this->rte_tag_set[$a_set_name];
231 }
232
233 public function getRteTagString(): string
234 {
235 $result = "";
236 foreach ($this->getRteTags() as $tag) {
237 $result .= "<$tag>";
238 }
239 return $result;
240 }
241
245 public function setUseTagsForRteOnly(bool $a_val): void
246 {
247 $this->use_tags_for_rte_only = $a_val;
248 }
249
250 public function getUseTagsForRteOnly(): bool
251 {
252 return $this->use_tags_for_rte_only;
253 }
254
255 public function setValueByArray(array $a_values): void
256 {
257 $this->setValue($a_values[$this->getPostVar()] ?? "");
258
259 foreach ($this->getSubItems() as $item) {
260 $item->setValueByArray($a_values);
261 }
262 }
263
264 public function checkInput(): bool
265 {
267
268 $value = $this->getInput();
269 if ($this->getRequired() && trim($value) == "") {
270 $this->setAlert($lng->txt("msg_input_is_required"));
271 return false;
272 }
273
274 if ($this->isCharLimited()) {
275 $chars_entered = mb_strlen($value);
276
277 if ($this->getMaxNumOfChars() && ($chars_entered > $this->getMaxNumOfChars())) {
278 $this->setAlert($lng->txt("msg_input_char_limit_max"));
279 return false;
280 } elseif ($this->getMinNumOfChars() && ($chars_entered < $this->getMinNumOfChars())) {
281 $this->setAlert($lng->txt("msg_input_char_limit_min"));
282 return false;
283 }
284 }
285
286 return $this->checkSubItemsInput();
287 }
288
289 public function getInput(): string
290 {
291 $raw_post_var = (string) ($this->raw($this->getPostVar()) ?? "");
292
293 if ($this->usePurifier() && $this->getPurifier()) {
294 $value = $this->getPurifier()->purify($raw_post_var);
295 } else {
296 $allowed = $this->getRteTagString();
297 if (isset($this->plugins["latex"]) && $this->plugins["latex"] == "latex" && !is_int(strpos($allowed, "<span>"))) {
298 $allowed .= "<span>";
299 }
300 $value = ($this->getUseRte() || !$this->getUseTagsForRteOnly())
301 ? ilUtil::stripSlashes($raw_post_var, true, $allowed)
302 : $this->str($this->getPostVar());
303 }
304
305 $value = self::removeProhibitedCharacters($value);
306
307 # Convert newline characters
308 $value = str_replace("\r\n", "\n", $value);
309
310 return $value;
311 }
312
313 public function insert(ilTemplate $a_tpl): void
314 {
316
317 $ttpl = new ilTemplate("tpl.prop_textarea.html", true, true, "components/ILIAS/Form");
318
319 if ($this->getInfo() !== '') {
320 $ttpl->setCurrentBlock('described_by_description');
321 $ttpl->setVariable('DESCRIBED_BY_DESCRIPTION_FIELD_ID', $this->getFieldId());
322 $ttpl->parseCurrentBlock();
323 }
324
325 // disabled rte
326 if ($this->getUseRte() && $this->getDisabled()) {
327 $ttpl->setCurrentBlock("disabled_rte");
328 $ttpl->setVariable("DR_VAL", $this->getValue());
329 } else {
330 if ($this->getUseRte()) {
331 $ttpl->touchBlock("rteditor");
332 $rtestring = ilRTE::_getRTEClassname();
333 $rte = new $rtestring((string) $this->rteSupport['version']);
334 $rte->setInitialWidth($this->getInitialRteWidth());
335
336 // @todo: Check this.
337 $rte->addPlugin("emoticons");
338 foreach ($this->plugins as $plugin) {
339 if (strlen($plugin)) {
340 $rte->addPlugin($plugin);
341 }
342 }
343 foreach ($this->removeplugins as $plugin) {
344 if (strlen($plugin)) {
345 $rte->removePlugin($plugin);
346 }
347 }
348
349 foreach ($this->buttons as $button) {
350 if (strlen($button)) {
351 $rte->addButton($button);
352 }
353 }
354
355 $rte->disableButtons($this->getDisabledButtons());
356
357 if ($this->getRTERootBlockElement() !== null) {
358 $rte->setRTERootBlockElement($this->getRTERootBlockElement());
359 }
360
361 if (count($this->rteSupport) >= 3) {
362 $rte->addRTESupport(
363 $this->lng,
364 $this->user,
365 $this->rteSupport["obj_id"],
366 $this->rteSupport["obj_type"],
367 $this->rteSupport["module"],
368 false,
369 $this->rteSupport['cfg_template']
370 );
371 } else {
372 // disable all plugins for mini-tagset
373 if (!array_diff($this->getRteTags(), $this->getRteTagSet("mini"))) {
374 $rte->removeAllPlugins();
375
376 // #13603 - "paste from word" is essential
377 $rte->addPlugin("paste");
378 //Add plugins 'lists', 'code' and 'link': in tinymce 3 it wasnt necessary to configure these plugins
379 $rte->addPlugin("lists");
380 $rte->addPlugin("link");
381 $rte->addPlugin("code");
382
383 if (method_exists($rte, 'removeAllContextMenuItems')) {
384 $rte->removeAllContextMenuItems(); //https://github.com/ILIAS-eLearning/ILIAS/pull/3088#issuecomment-805830050
385 }
386
387 // #11980 - p-tag is mandatory but we do not want the icons it comes with
388 $rte->disableButtons(array("anchor", "alignleft", "aligncenter",
389 "alignright", "alignjustify", "formatselect", "removeformat",
390 "cut", "copy", "paste", "pastetext")); // JF, 2013-12-09
391 }
392 $rte->addCustomRTESupport(0, "", $this->getRteTags());
393 }
394
395 $ttpl->touchBlock("prop_ta_w");
396 } else {
397 if ($this->getCols() > 5) {
398 $ttpl->setCurrentBlock("prop_ta_c");
399 $ttpl->setVariable("COLS", $this->getCols());
400 $ttpl->parseCurrentBlock();
401 } else {
402 $ttpl->touchBlock("prop_ta_w");
403 }
404 }
405 $ttpl->setCurrentBlock("prop_textarea");
406 $ttpl->setVariable("ROWS", $this->getRows());
407 $ttpl->setVariable("POST_VAR", $this->getPostVar());
408 $ttpl->setVariable("ID", $this->getFieldId());
409 if ($this->getDisabled()) {
410 $ttpl->setVariable('DISABLED', 'disabled="disabled" ');
411 }
412 $ttpl->setVariable("PROPERTY_VALUE", ilLegacyFormElementsUtil::prepareFormOutput($this->getValue()));
413
414 if ($this->getRequired()) {
415 $ttpl->setVariable("REQUIRED", "required=\"required\"");
416 }
417
418 if ($this->isCharLimited()) {
419 $ttpl->setVariable("MAXCHARS", $this->getMaxNumOfChars());
420 $ttpl->setVariable("MINCHARS", $this->getMinNumOfChars());
421
422 $lng->toJS("form_chars_remaining");
423 }
424 }
425 $ttpl->parseCurrentBlock();
426
427 if ($this->isCharLimited()) {
428 $ttpl->setVariable("FEEDBACK_MAX_LIMIT", $this->getMaxNumOfChars());
429 $ttpl->setVariable("FEEDBACK_ID", $this->getFieldId());
430 $ttpl->setVariable("CHARS_REMAINING", $lng->txt("form_chars_remaining"));
431 }
432
433 if ($this->getDisabled()) {
434 $ttpl->setVariable(
435 "HIDDEN_INPUT",
436 $this->getHiddenTag($this->getPostVar(), $this->getValue())
437 );
438 }
439 $a_tpl->setCurrentBlock("prop_generic");
440 $a_tpl->setVariable("PROP_GENERIC", $ttpl->get());
441 $a_tpl->parseCurrentBlock();
442 }
443
449 public function usePurifier(?bool $a_flag = null)
450 {
451 if (null === $a_flag) {
452 return $this->usePurifier;
453 }
454
455 $this->usePurifier = $a_flag;
456 return $this;
457 }
458
462 public function setPurifier(ilHtmlPurifierInterface $Purifier): self
463 {
464 $this->Purifier = $Purifier;
465 return $this;
466 }
467
469 {
470 return $this->Purifier;
471 }
472
473 public function setRTERootBlockElement(?string $a_root_block_element): self
474 {
475 $this->root_block_element = $a_root_block_element;
476 return $this;
477 }
478
479 public function getRTERootBlockElement(): ?string
480 {
481 return $this->root_block_element;
482 }
483
489 public function disableButtons($a_button): self
490 {
491 if (is_array($a_button)) {
492 $this->disabled_buttons = array_unique(array_merge($this->disabled_buttons, $a_button));
493 } else {
494 $this->disabled_buttons = array_unique(array_merge($this->disabled_buttons, array($a_button)));
495 }
496 return $this;
497 }
498
502 public function getDisabledButtons(bool $as_array = true)
503 {
504 if (!$as_array) {
505 return implode(',', $this->disabled_buttons);
506 } else {
507 return $this->disabled_buttons;
508 }
509 }
510
511 public function getInitialRteWidth(): int
512 {
513 return $this->initial_rte_width;
514 }
515
516 public function setInitialRteWidth(int $initial_rte_width): void
517 {
518 $this->initial_rte_width = $initial_rte_width;
519 }
520
521 public function isCharLimited(): bool
522 {
523 if ($this->getMaxNumOfChars() || $this->getMinNumOfChars()) {
524 return true;
525 }
526
527 return false;
528 }
529}
$version
Definition: plugin.php:24
setVariable($variable, $value='')
Sets a variable value.
Definition: IT.php:544
static prepareFormOutput($a_str, bool $a_strip=false)
User class.
static _getRTEClassname()
This class represents a property that may include a sub form.
special template class to simplify handling of ITX/PEAR
setCurrentBlock(string $part=ilGlobalTemplateInterface::DEFAULT_BLOCK)
parseCurrentBlock(string $part=ilGlobalTemplateInterface::DEFAULT_BLOCK)
This class represents a text area property in a property form.
removeButton(string $a_button)
removePlugin(string $a_plugin)
disableButtons($a_button)
Sets buttons which should be disabled in TinyMCE.
setUseTagsForRteOnly(bool $a_val)
Set use tags for RTE only (default is true)
setPurifier(ilHtmlPurifierInterface $Purifier)
Setter for the html purifier.
__construct(string $a_title="", string $a_postvar="")
setRTESupport(int $obj_id, string $obj_type, string $module, ?string $cfg_template=null, bool $hide_switch=false, ?string $version=null)
Set RTE support for a special module.
usePurifier(?bool $a_flag=null)
Setter/Getter for the html purifier usage.
getDisabledButtons(bool $as_array=true)
setRteTagSet(string $a_set_name)
setValueByArray(array $a_values)
ilHtmlPurifierInterface $Purifier
setInitialRteWidth(int $initial_rte_width)
checkInput()
Check input, strip slashes etc.
setUseRte(bool $a_usert, string $version='')
setRTERootBlockElement(?string $a_root_block_element)
static stripSlashes(string $a_str, bool $a_strip_html=true, string $a_allow="")
Interface for html sanitizing functionality.
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
getValue()
Get the value that is displayed in the input client side.
Definition: Group.php:49
global $lng
Definition: privfeed.php:26
global $DIC
Definition: shib_login.php:26