[ Index ] |
PHP Cross Reference of vtigercrm-6.1.0 |
[Summary view] [Print] [Text view]
1 <?php 2 3 /** 4 * @todo Rewrite to use Interchange objects 5 */ 6 class HTMLPurifier_Printer_ConfigForm extends HTMLPurifier_Printer 7 { 8 9 /** 10 * Printers for specific fields 11 */ 12 protected $fields = array(); 13 14 /** 15 * Documentation URL, can have fragment tagged on end 16 */ 17 protected $docURL; 18 19 /** 20 * Name of form element to stuff config in 21 */ 22 protected $name; 23 24 /** 25 * Whether or not to compress directive names, clipping them off 26 * after a certain amount of letters. False to disable or integer letters 27 * before clipping. 28 */ 29 protected $compress = false; 30 31 /** 32 * @param $name Form element name for directives to be stuffed into 33 * @param $doc_url String documentation URL, will have fragment tagged on 34 * @param $compress Integer max length before compressing a directive name, set to false to turn off 35 */ 36 public function __construct( 37 $name, $doc_url = null, $compress = false 38 ) { 39 parent::__construct(); 40 $this->docURL = $doc_url; 41 $this->name = $name; 42 $this->compress = $compress; 43 // initialize sub-printers 44 $this->fields[0] = new HTMLPurifier_Printer_ConfigForm_default(); 45 $this->fields[HTMLPurifier_VarParser::BOOL] = new HTMLPurifier_Printer_ConfigForm_bool(); 46 } 47 48 /** 49 * Sets default column and row size for textareas in sub-printers 50 * @param $cols Integer columns of textarea, null to use default 51 * @param $rows Integer rows of textarea, null to use default 52 */ 53 public function setTextareaDimensions($cols = null, $rows = null) { 54 if ($cols) $this->fields['default']->cols = $cols; 55 if ($rows) $this->fields['default']->rows = $rows; 56 } 57 58 /** 59 * Retrieves styling, in case it is not accessible by webserver 60 */ 61 public static function getCSS() { 62 return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.css'); 63 } 64 65 /** 66 * Retrieves JavaScript, in case it is not accessible by webserver 67 */ 68 public static function getJavaScript() { 69 return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.js'); 70 } 71 72 /** 73 * Returns HTML output for a configuration form 74 * @param $config Configuration object of current form state, or an array 75 * where [0] has an HTML namespace and [1] is being rendered. 76 * @param $allowed Optional namespace(s) and directives to restrict form to. 77 */ 78 public function render($config, $allowed = true, $render_controls = true) { 79 if (is_array($config) && isset($config[0])) { 80 $gen_config = $config[0]; 81 $config = $config[1]; 82 } else { 83 $gen_config = $config; 84 } 85 86 $this->config = $config; 87 $this->genConfig = $gen_config; 88 $this->prepareGenerator($gen_config); 89 90 $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $config->def); 91 $all = array(); 92 foreach ($allowed as $key) { 93 list($ns, $directive) = $key; 94 $all[$ns][$directive] = $config->get($ns, $directive); 95 } 96 97 $ret = ''; 98 $ret .= $this->start('table', array('class' => 'hp-config')); 99 $ret .= $this->start('thead'); 100 $ret .= $this->start('tr'); 101 $ret .= $this->element('th', 'Directive', array('class' => 'hp-directive')); 102 $ret .= $this->element('th', 'Value', array('class' => 'hp-value')); 103 $ret .= $this->end('tr'); 104 $ret .= $this->end('thead'); 105 foreach ($all as $ns => $directives) { 106 $ret .= $this->renderNamespace($ns, $directives); 107 } 108 if ($render_controls) { 109 $ret .= $this->start('tbody'); 110 $ret .= $this->start('tr'); 111 $ret .= $this->start('td', array('colspan' => 2, 'class' => 'controls')); 112 $ret .= $this->elementEmpty('input', array('type' => 'submit', 'value' => 'Submit')); 113 $ret .= '[<a href="?">Reset</a>]'; 114 $ret .= $this->end('td'); 115 $ret .= $this->end('tr'); 116 $ret .= $this->end('tbody'); 117 } 118 $ret .= $this->end('table'); 119 return $ret; 120 } 121 122 /** 123 * Renders a single namespace 124 * @param $ns String namespace name 125 * @param $directive Associative array of directives to values 126 */ 127 protected function renderNamespace($ns, $directives) { 128 $ret = ''; 129 $ret .= $this->start('tbody', array('class' => 'namespace')); 130 $ret .= $this->start('tr'); 131 $ret .= $this->element('th', $ns, array('colspan' => 2)); 132 $ret .= $this->end('tr'); 133 $ret .= $this->end('tbody'); 134 $ret .= $this->start('tbody'); 135 foreach ($directives as $directive => $value) { 136 $ret .= $this->start('tr'); 137 $ret .= $this->start('th'); 138 if ($this->docURL) { 139 $url = str_replace('%s', urlencode("$ns.$directive"), $this->docURL); 140 $ret .= $this->start('a', array('href' => $url)); 141 } 142 $attr = array('for' => "{$this->name}:$ns.$directive"); 143 144 // crop directive name if it's too long 145 if (!$this->compress || (strlen($directive) < $this->compress)) { 146 $directive_disp = $directive; 147 } else { 148 $directive_disp = substr($directive, 0, $this->compress - 2) . '...'; 149 $attr['title'] = $directive; 150 } 151 152 $ret .= $this->element( 153 'label', 154 $directive_disp, 155 // component printers must create an element with this id 156 $attr 157 ); 158 if ($this->docURL) $ret .= $this->end('a'); 159 $ret .= $this->end('th'); 160 161 $ret .= $this->start('td'); 162 $def = $this->config->def->info[$ns][$directive]; 163 if (is_int($def)) { 164 $allow_null = $def < 0; 165 $type = abs($def); 166 } else { 167 $type = $def->type; 168 $allow_null = isset($def->allow_null); 169 } 170 if (!isset($this->fields[$type])) $type = 0; // default 171 $type_obj = $this->fields[$type]; 172 if ($allow_null) { 173 $type_obj = new HTMLPurifier_Printer_ConfigForm_NullDecorator($type_obj); 174 } 175 $ret .= $type_obj->render($ns, $directive, $value, $this->name, array($this->genConfig, $this->config)); 176 $ret .= $this->end('td'); 177 $ret .= $this->end('tr'); 178 } 179 $ret .= $this->end('tbody'); 180 return $ret; 181 } 182 183 } 184 185 /** 186 * Printer decorator for directives that accept null 187 */ 188 class HTMLPurifier_Printer_ConfigForm_NullDecorator extends HTMLPurifier_Printer { 189 /** 190 * Printer being decorated 191 */ 192 protected $obj; 193 /** 194 * @param $obj Printer to decorate 195 */ 196 public function __construct($obj) { 197 parent::__construct(); 198 $this->obj = $obj; 199 } 200 public function render($ns, $directive, $value, $name, $config) { 201 if (is_array($config) && isset($config[0])) { 202 $gen_config = $config[0]; 203 $config = $config[1]; 204 } else { 205 $gen_config = $config; 206 } 207 $this->prepareGenerator($gen_config); 208 209 $ret = ''; 210 $ret .= $this->start('label', array('for' => "$name:Null_$ns.$directive")); 211 $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose')); 212 $ret .= $this->text(' Null/Disabled'); 213 $ret .= $this->end('label'); 214 $attr = array( 215 'type' => 'checkbox', 216 'value' => '1', 217 'class' => 'null-toggle', 218 'name' => "$name"."[Null_$ns.$directive]", 219 'id' => "$name:Null_$ns.$directive", 220 'onclick' => "toggleWriteability('$name:$ns.$directive',checked)" // INLINE JAVASCRIPT!!!! 221 ); 222 if ($this->obj instanceof HTMLPurifier_Printer_ConfigForm_bool) { 223 // modify inline javascript slightly 224 $attr['onclick'] = "toggleWriteability('$name:Yes_$ns.$directive',checked);toggleWriteability('$name:No_$ns.$directive',checked)"; 225 } 226 if ($value === null) $attr['checked'] = 'checked'; 227 $ret .= $this->elementEmpty('input', $attr); 228 $ret .= $this->text(' or '); 229 $ret .= $this->elementEmpty('br'); 230 $ret .= $this->obj->render($ns, $directive, $value, $name, array($gen_config, $config)); 231 return $ret; 232 } 233 } 234 235 /** 236 * Swiss-army knife configuration form field printer 237 */ 238 class HTMLPurifier_Printer_ConfigForm_default extends HTMLPurifier_Printer { 239 public $cols = 18; 240 public $rows = 5; 241 public function render($ns, $directive, $value, $name, $config) { 242 if (is_array($config) && isset($config[0])) { 243 $gen_config = $config[0]; 244 $config = $config[1]; 245 } else { 246 $gen_config = $config; 247 } 248 $this->prepareGenerator($gen_config); 249 // this should probably be split up a little 250 $ret = ''; 251 $def = $config->def->info[$ns][$directive]; 252 if (is_int($def)) { 253 $type = abs($def); 254 } else { 255 $type = $def->type; 256 } 257 if (is_array($value)) { 258 switch ($type) { 259 case HTMLPurifier_VarParser::LOOKUP: 260 $array = $value; 261 $value = array(); 262 foreach ($array as $val => $b) { 263 $value[] = $val; 264 } 265 case HTMLPurifier_VarParser::ALIST: 266 $value = implode(PHP_EOL, $value); 267 break; 268 case HTMLPurifier_VarParser::HASH: 269 $nvalue = ''; 270 foreach ($value as $i => $v) { 271 $nvalue .= "$i:$v" . PHP_EOL; 272 } 273 $value = $nvalue; 274 break; 275 default: 276 $value = ''; 277 } 278 } 279 if ($type === HTMLPurifier_VarParser::MIXED) { 280 return 'Not supported'; 281 $value = serialize($value); 282 } 283 $attr = array( 284 'name' => "$name"."[$ns.$directive]", 285 'id' => "$name:$ns.$directive" 286 ); 287 if ($value === null) $attr['disabled'] = 'disabled'; 288 if (isset($def->allowed)) { 289 $ret .= $this->start('select', $attr); 290 foreach ($def->allowed as $val => $b) { 291 $attr = array(); 292 if ($value == $val) $attr['selected'] = 'selected'; 293 $ret .= $this->element('option', $val, $attr); 294 } 295 $ret .= $this->end('select'); 296 } elseif ( 297 $type === HTMLPurifier_VarParser::TEXT || 298 $type === HTMLPurifier_VarParser::ITEXT || 299 $type === HTMLPurifier_VarParser::ALIST || 300 $type === HTMLPurifier_VarParser::HASH || 301 $type === HTMLPurifier_VarParser::LOOKUP 302 ) { 303 $attr['cols'] = $this->cols; 304 $attr['rows'] = $this->rows; 305 $ret .= $this->start('textarea', $attr); 306 $ret .= $this->text($value); 307 $ret .= $this->end('textarea'); 308 } else { 309 $attr['value'] = $value; 310 $attr['type'] = 'text'; 311 $ret .= $this->elementEmpty('input', $attr); 312 } 313 return $ret; 314 } 315 } 316 317 /** 318 * Bool form field printer 319 */ 320 class HTMLPurifier_Printer_ConfigForm_bool extends HTMLPurifier_Printer { 321 public function render($ns, $directive, $value, $name, $config) { 322 if (is_array($config) && isset($config[0])) { 323 $gen_config = $config[0]; 324 $config = $config[1]; 325 } else { 326 $gen_config = $config; 327 } 328 $this->prepareGenerator($gen_config); 329 $ret = ''; 330 $ret .= $this->start('div', array('id' => "$name:$ns.$directive")); 331 332 $ret .= $this->start('label', array('for' => "$name:Yes_$ns.$directive")); 333 $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose')); 334 $ret .= $this->text(' Yes'); 335 $ret .= $this->end('label'); 336 337 $attr = array( 338 'type' => 'radio', 339 'name' => "$name"."[$ns.$directive]", 340 'id' => "$name:Yes_$ns.$directive", 341 'value' => '1' 342 ); 343 if ($value === true) $attr['checked'] = 'checked'; 344 if ($value === null) $attr['disabled'] = 'disabled'; 345 $ret .= $this->elementEmpty('input', $attr); 346 347 $ret .= $this->start('label', array('for' => "$name:No_$ns.$directive")); 348 $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose')); 349 $ret .= $this->text(' No'); 350 $ret .= $this->end('label'); 351 352 $attr = array( 353 'type' => 'radio', 354 'name' => "$name"."[$ns.$directive]", 355 'id' => "$name:No_$ns.$directive", 356 'value' => '0' 357 ); 358 if ($value === false) $attr['checked'] = 'checked'; 359 if ($value === null) $attr['disabled'] = 'disabled'; 360 $ret .= $this->elementEmpty('input', $attr); 361 362 $ret .= $this->end('div'); 363 364 return $ret; 365 } 366 } 367 368 // vim: et sw=4 sts=4
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 20:08:37 2014 | Cross-referenced by PHPXref 0.7.1 |