ILIAS  Release_5_0_x_branch Revision 61816
 All Data Structures Namespaces Files Functions Variables Groups Pages
ConfigForm.php
Go to the documentation of this file.
1 <?php
2 
7 {
8 
13  protected $fields = array();
14 
19  protected $docURL;
20 
25  protected $name;
26 
33  protected $compress = false;
34 
40  public function __construct(
41  $name,
42  $doc_url = null,
43  $compress = false
44  ) {
46  $this->docURL = $doc_url;
47  $this->name = $name;
48  $this->compress = $compress;
49  // initialize sub-printers
52  }
53 
59  public function setTextareaDimensions($cols = null, $rows = null)
60  {
61  if ($cols) {
62  $this->fields['default']->cols = $cols;
63  }
64  if ($rows) {
65  $this->fields['default']->rows = $rows;
66  }
67  }
68 
72  public static function getCSS()
73  {
74  return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.css');
75  }
76 
80  public static function getJavaScript()
81  {
82  return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.js');
83  }
84 
93  public function render($config, $allowed = true, $render_controls = true)
94  {
95  if (is_array($config) && isset($config[0])) {
96  $gen_config = $config[0];
97  $config = $config[1];
98  } else {
99  $gen_config = $config;
100  }
101 
102  $this->config = $config;
103  $this->genConfig = $gen_config;
104  $this->prepareGenerator($gen_config);
105 
107  $all = array();
108  foreach ($allowed as $key) {
109  list($ns, $directive) = $key;
110  $all[$ns][$directive] = $config->get($ns . '.' . $directive);
111  }
112 
113  $ret = '';
114  $ret .= $this->start('table', array('class' => 'hp-config'));
115  $ret .= $this->start('thead');
116  $ret .= $this->start('tr');
117  $ret .= $this->element('th', 'Directive', array('class' => 'hp-directive'));
118  $ret .= $this->element('th', 'Value', array('class' => 'hp-value'));
119  $ret .= $this->end('tr');
120  $ret .= $this->end('thead');
121  foreach ($all as $ns => $directives) {
122  $ret .= $this->renderNamespace($ns, $directives);
123  }
124  if ($render_controls) {
125  $ret .= $this->start('tbody');
126  $ret .= $this->start('tr');
127  $ret .= $this->start('td', array('colspan' => 2, 'class' => 'controls'));
128  $ret .= $this->elementEmpty('input', array('type' => 'submit', 'value' => 'Submit'));
129  $ret .= '[<a href="?">Reset</a>]';
130  $ret .= $this->end('td');
131  $ret .= $this->end('tr');
132  $ret .= $this->end('tbody');
133  }
134  $ret .= $this->end('table');
135  return $ret;
136  }
137 
144  protected function renderNamespace($ns, $directives)
145  {
146  $ret = '';
147  $ret .= $this->start('tbody', array('class' => 'namespace'));
148  $ret .= $this->start('tr');
149  $ret .= $this->element('th', $ns, array('colspan' => 2));
150  $ret .= $this->end('tr');
151  $ret .= $this->end('tbody');
152  $ret .= $this->start('tbody');
153  foreach ($directives as $directive => $value) {
154  $ret .= $this->start('tr');
155  $ret .= $this->start('th');
156  if ($this->docURL) {
157  $url = str_replace('%s', urlencode("$ns.$directive"), $this->docURL);
158  $ret .= $this->start('a', array('href' => $url));
159  }
160  $attr = array('for' => "{$this->name}:$ns.$directive");
161 
162  // crop directive name if it's too long
163  if (!$this->compress || (strlen($directive) < $this->compress)) {
164  $directive_disp = $directive;
165  } else {
166  $directive_disp = substr($directive, 0, $this->compress - 2) . '...';
167  $attr['title'] = $directive;
168  }
169 
170  $ret .= $this->element(
171  'label',
172  $directive_disp,
173  // component printers must create an element with this id
174  $attr
175  );
176  if ($this->docURL) {
177  $ret .= $this->end('a');
178  }
179  $ret .= $this->end('th');
180 
181  $ret .= $this->start('td');
182  $def = $this->config->def->info["$ns.$directive"];
183  if (is_int($def)) {
184  $allow_null = $def < 0;
185  $type = abs($def);
186  } else {
187  $type = $def->type;
188  $allow_null = isset($def->allow_null);
189  }
190  if (!isset($this->fields[$type])) {
191  $type = 0;
192  } // default
193  $type_obj = $this->fields[$type];
194  if ($allow_null) {
195  $type_obj = new HTMLPurifier_Printer_ConfigForm_NullDecorator($type_obj);
196  }
197  $ret .= $type_obj->render($ns, $directive, $value, $this->name, array($this->genConfig, $this->config));
198  $ret .= $this->end('td');
199  $ret .= $this->end('tr');
200  }
201  $ret .= $this->end('tbody');
202  return $ret;
203  }
204 
205 }
206 
211 {
216  protected $obj;
217 
221  public function __construct($obj)
222  {
224  $this->obj = $obj;
225  }
226 
235  public function render($ns, $directive, $value, $name, $config)
236  {
237  if (is_array($config) && isset($config[0])) {
238  $gen_config = $config[0];
239  $config = $config[1];
240  } else {
241  $gen_config = $config;
242  }
243  $this->prepareGenerator($gen_config);
244 
245  $ret = '';
246  $ret .= $this->start('label', array('for' => "$name:Null_$ns.$directive"));
247  $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
248  $ret .= $this->text(' Null/Disabled');
249  $ret .= $this->end('label');
250  $attr = array(
251  'type' => 'checkbox',
252  'value' => '1',
253  'class' => 'null-toggle',
254  'name' => "$name" . "[Null_$ns.$directive]",
255  'id' => "$name:Null_$ns.$directive",
256  'onclick' => "toggleWriteability('$name:$ns.$directive',checked)" // INLINE JAVASCRIPT!!!!
257  );
258  if ($this->obj instanceof HTMLPurifier_Printer_ConfigForm_bool) {
259  // modify inline javascript slightly
260  $attr['onclick'] =
261  "toggleWriteability('$name:Yes_$ns.$directive',checked);" .
262  "toggleWriteability('$name:No_$ns.$directive',checked)";
263  }
264  if ($value === null) {
265  $attr['checked'] = 'checked';
266  }
267  $ret .= $this->elementEmpty('input', $attr);
268  $ret .= $this->text(' or ');
269  $ret .= $this->elementEmpty('br');
270  $ret .= $this->obj->render($ns, $directive, $value, $name, array($gen_config, $config));
271  return $ret;
272  }
273 }
274 
279 {
283  public $cols = 18;
284 
288  public $rows = 5;
289 
298  public function render($ns, $directive, $value, $name, $config)
299  {
300  if (is_array($config) && isset($config[0])) {
301  $gen_config = $config[0];
302  $config = $config[1];
303  } else {
304  $gen_config = $config;
305  }
306  $this->prepareGenerator($gen_config);
307  // this should probably be split up a little
308  $ret = '';
309  $def = $config->def->info["$ns.$directive"];
310  if (is_int($def)) {
311  $type = abs($def);
312  } else {
313  $type = $def->type;
314  }
315  if (is_array($value)) {
316  switch ($type) {
318  $array = $value;
319  $value = array();
320  foreach ($array as $val => $b) {
321  $value[] = $val;
322  }
323  //TODO does this need a break?
325  $value = implode(PHP_EOL, $value);
326  break;
328  $nvalue = '';
329  foreach ($value as $i => $v) {
330  $nvalue .= "$i:$v" . PHP_EOL;
331  }
332  $value = $nvalue;
333  break;
334  default:
335  $value = '';
336  }
337  }
338  if ($type === HTMLPurifier_VarParser::MIXED) {
339  return 'Not supported';
340  $value = serialize($value);
341  }
342  $attr = array(
343  'name' => "$name" . "[$ns.$directive]",
344  'id' => "$name:$ns.$directive"
345  );
346  if ($value === null) {
347  $attr['disabled'] = 'disabled';
348  }
349  if (isset($def->allowed)) {
350  $ret .= $this->start('select', $attr);
351  foreach ($def->allowed as $val => $b) {
352  $attr = array();
353  if ($value == $val) {
354  $attr['selected'] = 'selected';
355  }
356  $ret .= $this->element('option', $val, $attr);
357  }
358  $ret .= $this->end('select');
359  } elseif ($type === HTMLPurifier_VarParser::TEXT ||
360  $type === HTMLPurifier_VarParser::ITEXT ||
361  $type === HTMLPurifier_VarParser::ALIST ||
362  $type === HTMLPurifier_VarParser::HASH ||
363  $type === HTMLPurifier_VarParser::LOOKUP) {
364  $attr['cols'] = $this->cols;
365  $attr['rows'] = $this->rows;
366  $ret .= $this->start('textarea', $attr);
367  $ret .= $this->text($value);
368  $ret .= $this->end('textarea');
369  } else {
370  $attr['value'] = $value;
371  $attr['type'] = 'text';
372  $ret .= $this->elementEmpty('input', $attr);
373  }
374  return $ret;
375  }
376 }
377 
382 {
391  public function render($ns, $directive, $value, $name, $config)
392  {
393  if (is_array($config) && isset($config[0])) {
394  $gen_config = $config[0];
395  $config = $config[1];
396  } else {
397  $gen_config = $config;
398  }
399  $this->prepareGenerator($gen_config);
400  $ret = '';
401  $ret .= $this->start('div', array('id' => "$name:$ns.$directive"));
402 
403  $ret .= $this->start('label', array('for' => "$name:Yes_$ns.$directive"));
404  $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
405  $ret .= $this->text(' Yes');
406  $ret .= $this->end('label');
407 
408  $attr = array(
409  'type' => 'radio',
410  'name' => "$name" . "[$ns.$directive]",
411  'id' => "$name:Yes_$ns.$directive",
412  'value' => '1'
413  );
414  if ($value === true) {
415  $attr['checked'] = 'checked';
416  }
417  if ($value === null) {
418  $attr['disabled'] = 'disabled';
419  }
420  $ret .= $this->elementEmpty('input', $attr);
421 
422  $ret .= $this->start('label', array('for' => "$name:No_$ns.$directive"));
423  $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
424  $ret .= $this->text(' No');
425  $ret .= $this->end('label');
426 
427  $attr = array(
428  'type' => 'radio',
429  'name' => "$name" . "[$ns.$directive]",
430  'id' => "$name:No_$ns.$directive",
431  'value' => '0'
432  );
433  if ($value === false) {
434  $attr['checked'] = 'checked';
435  }
436  if ($value === null) {
437  $attr['disabled'] = 'disabled';
438  }
439  $ret .= $this->elementEmpty('input', $attr);
440 
441  $ret .= $this->end('div');
442 
443  return $ret;
444  }
445 }
446 
447 // vim: et sw=4 sts=4