160 lines
4.2 KiB
PHP
160 lines
4.2 KiB
PHP
|
<?php
|
||
|
namespace dokuwiki\Form;
|
||
|
|
||
|
/**
|
||
|
* Class InputElement
|
||
|
*
|
||
|
* Base class for all input elements. Uses a wrapping label when label
|
||
|
* text is given.
|
||
|
*
|
||
|
* @todo figure out how to make wrapping or related label configurable
|
||
|
* @package dokuwiki\Form
|
||
|
*/
|
||
|
class InputElement extends Element {
|
||
|
/**
|
||
|
* @var LabelElement
|
||
|
*/
|
||
|
protected $label = null;
|
||
|
|
||
|
/**
|
||
|
* @var bool if the element should reflect posted values
|
||
|
*/
|
||
|
protected $useInput = true;
|
||
|
|
||
|
/**
|
||
|
* @param string $type The type of this element
|
||
|
* @param string $name The name of this form element
|
||
|
* @param string $label The label text for this element (will be autoescaped)
|
||
|
*/
|
||
|
public function __construct($type, $name, $label = '') {
|
||
|
parent::__construct($type, array('name' => $name));
|
||
|
$this->attr('name', $name);
|
||
|
$this->attr('type', $type);
|
||
|
if($label) $this->label = new LabelElement($label);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the label element if there's one set
|
||
|
*
|
||
|
* @return LabelElement|null
|
||
|
*/
|
||
|
public function getLabel() {
|
||
|
return $this->label;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Should the user sent input be used to initialize the input field
|
||
|
*
|
||
|
* The default is true. Any set values will be overwritten by the INPUT
|
||
|
* provided values.
|
||
|
*
|
||
|
* @param bool $useinput
|
||
|
* @return $this
|
||
|
*/
|
||
|
public function useInput($useinput) {
|
||
|
$this->useInput = (bool) $useinput;
|
||
|
return $this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get or set the element's ID
|
||
|
*
|
||
|
* @param null|string $id
|
||
|
* @return string|$this
|
||
|
*/
|
||
|
public function id($id = null) {
|
||
|
if($this->label) $this->label->attr('for', $id);
|
||
|
return parent::id($id);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds a class to the class attribute
|
||
|
*
|
||
|
* This is the preferred method of setting the element's class
|
||
|
*
|
||
|
* @param string $class the new class to add
|
||
|
* @return $this
|
||
|
*/
|
||
|
public function addClass($class) {
|
||
|
if($this->label) $this->label->addClass($class);
|
||
|
return parent::addClass($class);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Figures out how to access the value for this field from INPUT data
|
||
|
*
|
||
|
* The element's name could have been given as a simple string ('foo')
|
||
|
* or in array notation ('foo[bar]').
|
||
|
*
|
||
|
* Note: this function only handles one level of arrays. If your data
|
||
|
* is nested deeper, you should call useInput(false) and set the
|
||
|
* correct value yourself
|
||
|
*
|
||
|
* @return array name and array key (null if not an array)
|
||
|
*/
|
||
|
protected function getInputName() {
|
||
|
$name = $this->attr('name');
|
||
|
parse_str("$name=1", $parsed);
|
||
|
|
||
|
$name = array_keys($parsed);
|
||
|
$name = array_shift($name);
|
||
|
|
||
|
if(is_array($parsed[$name])) {
|
||
|
$key = array_keys($parsed[$name]);
|
||
|
$key = array_shift($key);
|
||
|
} else {
|
||
|
$key = null;
|
||
|
}
|
||
|
|
||
|
return array($name, $key);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Handles the useInput flag and set the value attribute accordingly
|
||
|
*/
|
||
|
protected function prefillInput() {
|
||
|
global $INPUT;
|
||
|
|
||
|
list($name, $key) = $this->getInputName();
|
||
|
if(!$INPUT->has($name)) return;
|
||
|
|
||
|
if($key === null) {
|
||
|
$value = $INPUT->str($name);
|
||
|
} else {
|
||
|
$value = $INPUT->arr($name);
|
||
|
if(isset($value[$key])) {
|
||
|
$value = $value[$key];
|
||
|
} else {
|
||
|
$value = '';
|
||
|
}
|
||
|
}
|
||
|
$this->val($value);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* The HTML representation of this element
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
protected function mainElementHTML() {
|
||
|
if($this->useInput) $this->prefillInput();
|
||
|
return '<input ' . buildAttributes($this->attrs()) . ' />';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* The HTML representation of this element wrapped in a label
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function toHTML() {
|
||
|
if($this->label) {
|
||
|
return '<label ' . buildAttributes($this->label->attrs()) . '>' . DOKU_LF .
|
||
|
'<span>' . hsc($this->label->val()) . '</span>' . DOKU_LF .
|
||
|
$this->mainElementHTML() . DOKU_LF .
|
||
|
'</label>';
|
||
|
} else {
|
||
|
return $this->mainElementHTML();
|
||
|
}
|
||
|
}
|
||
|
}
|