594 lines
18 KiB
PHP
594 lines
18 KiB
PHP
|
<?php
|
||
|
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
|
||
|
|
||
|
/**
|
||
|
* HTML class for a form element group
|
||
|
*
|
||
|
* PHP versions 4 and 5
|
||
|
*
|
||
|
* LICENSE: This source file is subject to version 3.01 of the PHP license
|
||
|
* that is available through the world-wide-web at the following URI:
|
||
|
* http://www.php.net/license/3_01.txt If you did not receive a copy of
|
||
|
* the PHP License and are unable to obtain it through the web, please
|
||
|
* send a note to license@php.net so we can mail you a copy immediately.
|
||
|
*
|
||
|
* @category HTML
|
||
|
* @package HTML_QuickForm
|
||
|
* @author Adam Daniel <adaniel1@eesus.jnj.com>
|
||
|
* @author Bertrand Mansion <bmansion@mamasam.com>
|
||
|
* @author Alexey Borzov <avb@php.net>
|
||
|
* @copyright 2001-2009 The PHP Group
|
||
|
* @license http://www.php.net/license/3_01.txt PHP License 3.01
|
||
|
* @version CVS: $Id: group.php,v 1.40 2009/04/04 21:34:03 avb Exp $
|
||
|
* @link http://pear.php.net/package/HTML_QuickForm
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Base class for form elements
|
||
|
*/
|
||
|
require_once 'HTML/QuickForm/element.php';
|
||
|
|
||
|
/**
|
||
|
* HTML class for a form element group
|
||
|
*
|
||
|
* @category HTML
|
||
|
* @package HTML_QuickForm
|
||
|
* @author Adam Daniel <adaniel1@eesus.jnj.com>
|
||
|
* @author Bertrand Mansion <bmansion@mamasam.com>
|
||
|
* @author Alexey Borzov <avb@php.net>
|
||
|
* @version Release: 3.2.11
|
||
|
* @since 1.0
|
||
|
*/
|
||
|
class HTML_QuickForm_group extends HTML_QuickForm_element
|
||
|
{
|
||
|
// {{{ properties
|
||
|
|
||
|
/**
|
||
|
* Name of the element
|
||
|
* @var string
|
||
|
* @since 1.0
|
||
|
* @access private
|
||
|
*/
|
||
|
var $_name = '';
|
||
|
|
||
|
/**
|
||
|
* Array of grouped elements
|
||
|
* @var array
|
||
|
* @since 1.0
|
||
|
* @access private
|
||
|
*/
|
||
|
var $_elements = array();
|
||
|
|
||
|
/**
|
||
|
* String to separate elements
|
||
|
* @var mixed
|
||
|
* @since 2.5
|
||
|
* @access private
|
||
|
*/
|
||
|
var $_separator = null;
|
||
|
|
||
|
/**
|
||
|
* Required elements in this group
|
||
|
* @var array
|
||
|
* @since 2.5
|
||
|
* @access private
|
||
|
*/
|
||
|
var $_required = array();
|
||
|
|
||
|
/**
|
||
|
* Whether to change elements' names to $groupName[$elementName] or leave them as is
|
||
|
* @var bool
|
||
|
* @since 3.0
|
||
|
* @access private
|
||
|
*/
|
||
|
var $_appendName = true;
|
||
|
|
||
|
// }}}
|
||
|
// {{{ constructor
|
||
|
|
||
|
/**
|
||
|
* Class constructor
|
||
|
*
|
||
|
* @param string $elementName (optional)Group name
|
||
|
* @param array $elementLabel (optional)Group label
|
||
|
* @param array $elements (optional)Group elements
|
||
|
* @param mixed $separator (optional)Use a string for one separator,
|
||
|
* use an array to alternate the separators.
|
||
|
* @param bool $appendName (optional)whether to change elements' names to
|
||
|
* the form $groupName[$elementName] or leave
|
||
|
* them as is.
|
||
|
* @param mixed $attributes (optional)Either a typical HTML attribute string
|
||
|
* or an associative array. Date format is passed along the attributes.
|
||
|
* @since 1.0
|
||
|
* @access public
|
||
|
* @return void
|
||
|
*/
|
||
|
function __construct($elementName=null, $elementLabel=null, $elements=null, $separator=null, $appendName = true, $attributes = null)
|
||
|
{
|
||
|
parent::__construct($elementName, $elementLabel, $attributes);
|
||
|
$this->_type = 'group';
|
||
|
if (isset($elements) && is_array($elements)) {
|
||
|
$this->setElements($elements);
|
||
|
}
|
||
|
if (isset($separator)) {
|
||
|
$this->_separator = $separator;
|
||
|
}
|
||
|
if (isset($appendName)) {
|
||
|
$this->_appendName = $appendName;
|
||
|
}
|
||
|
} //end constructor
|
||
|
|
||
|
// }}}
|
||
|
// {{{ setName()
|
||
|
|
||
|
/**
|
||
|
* Sets the group name
|
||
|
*
|
||
|
* @param string $name Group name
|
||
|
* @since 1.0
|
||
|
* @access public
|
||
|
* @return void
|
||
|
*/
|
||
|
function setName($name)
|
||
|
{
|
||
|
$this->_name = $name;
|
||
|
} //end func setName
|
||
|
|
||
|
// }}}
|
||
|
// {{{ getName()
|
||
|
|
||
|
/**
|
||
|
* Returns the group name
|
||
|
*
|
||
|
* @since 1.0
|
||
|
* @access public
|
||
|
* @return string
|
||
|
*/
|
||
|
function getName()
|
||
|
{
|
||
|
return $this->_name;
|
||
|
} //end func getName
|
||
|
|
||
|
// }}}
|
||
|
// {{{ setValue()
|
||
|
|
||
|
/**
|
||
|
* Sets values for group's elements
|
||
|
*
|
||
|
* @param mixed Values for group's elements
|
||
|
* @since 1.0
|
||
|
* @access public
|
||
|
* @return void
|
||
|
*/
|
||
|
function setValue($value)
|
||
|
{
|
||
|
$this->_createElementsIfNotExist();
|
||
|
foreach (array_keys($this->_elements) as $key) {
|
||
|
if (!$this->_appendName) {
|
||
|
$v = $this->_elements[$key]->_findValue($value);
|
||
|
if (null !== $v) {
|
||
|
$this->_elements[$key]->onQuickFormEvent('setGroupValue', $v, $this);
|
||
|
}
|
||
|
|
||
|
} else {
|
||
|
$elementName = $this->_elements[$key]->getName();
|
||
|
$index = strlen($elementName) ? $elementName : $key;
|
||
|
if (is_array($value)) {
|
||
|
if (isset($value[$index])) {
|
||
|
$this->_elements[$key]->onQuickFormEvent('setGroupValue', $value[$index], $this);
|
||
|
}
|
||
|
} elseif (isset($value)) {
|
||
|
$this->_elements[$key]->onQuickFormEvent('setGroupValue', $value, $this);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
} //end func setValue
|
||
|
|
||
|
// }}}
|
||
|
// {{{ getValue()
|
||
|
|
||
|
/**
|
||
|
* Returns the value of the group
|
||
|
*
|
||
|
* @since 1.0
|
||
|
* @access public
|
||
|
* @return mixed
|
||
|
*/
|
||
|
function getValue()
|
||
|
{
|
||
|
$value = null;
|
||
|
foreach (array_keys($this->_elements) as $key) {
|
||
|
$element =& $this->_elements[$key];
|
||
|
switch ($element->getType()) {
|
||
|
case 'radio':
|
||
|
$v = $element->getChecked()? $element->getValue(): null;
|
||
|
break;
|
||
|
case 'checkbox':
|
||
|
$v = $element->getChecked()? true: null;
|
||
|
break;
|
||
|
default:
|
||
|
$v = $element->getValue();
|
||
|
}
|
||
|
if (null !== $v) {
|
||
|
$elementName = $element->getName();
|
||
|
if (is_null($elementName)) {
|
||
|
$value = $v;
|
||
|
} else {
|
||
|
if (!is_array($value)) {
|
||
|
$value = is_null($value)? array(): array($value);
|
||
|
}
|
||
|
if ('' === $elementName) {
|
||
|
$value[] = $v;
|
||
|
} else {
|
||
|
$value[$elementName] = $v;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return $value;
|
||
|
} // end func getValue
|
||
|
|
||
|
// }}}
|
||
|
// {{{ setElements()
|
||
|
|
||
|
/**
|
||
|
* Sets the grouped elements
|
||
|
*
|
||
|
* @param array $elements Array of elements
|
||
|
* @since 1.1
|
||
|
* @access public
|
||
|
* @return void
|
||
|
*/
|
||
|
function setElements($elements)
|
||
|
{
|
||
|
$this->_elements = array_values($elements);
|
||
|
if ($this->_flagFrozen) {
|
||
|
$this->freeze();
|
||
|
}
|
||
|
} // end func setElements
|
||
|
|
||
|
// }}}
|
||
|
// {{{ getElements()
|
||
|
|
||
|
/**
|
||
|
* Gets the grouped elements
|
||
|
*
|
||
|
* @since 2.4
|
||
|
* @access public
|
||
|
* @return array
|
||
|
*/
|
||
|
function &getElements()
|
||
|
{
|
||
|
$this->_createElementsIfNotExist();
|
||
|
return $this->_elements;
|
||
|
} // end func getElements
|
||
|
|
||
|
// }}}
|
||
|
// {{{ getGroupType()
|
||
|
|
||
|
/**
|
||
|
* Gets the group type based on its elements
|
||
|
* Will return 'mixed' if elements contained in the group
|
||
|
* are of different types.
|
||
|
*
|
||
|
* @access public
|
||
|
* @return string group elements type
|
||
|
*/
|
||
|
function getGroupType()
|
||
|
{
|
||
|
$this->_createElementsIfNotExist();
|
||
|
$prevType = '';
|
||
|
foreach (array_keys($this->_elements) as $key) {
|
||
|
$type = $this->_elements[$key]->getType();
|
||
|
if ($type != $prevType && $prevType != '') {
|
||
|
return 'mixed';
|
||
|
}
|
||
|
$prevType = $type;
|
||
|
}
|
||
|
return $type;
|
||
|
} // end func getGroupType
|
||
|
|
||
|
// }}}
|
||
|
// {{{ toHtml()
|
||
|
|
||
|
/**
|
||
|
* Returns Html for the group
|
||
|
*
|
||
|
* @since 1.0
|
||
|
* @access public
|
||
|
* @return string
|
||
|
*/
|
||
|
function toHtml()
|
||
|
{
|
||
|
include_once('HTML/QuickForm/Renderer/Default.php');
|
||
|
$renderer = new HTML_QuickForm_Renderer_Default();
|
||
|
$renderer->setElementTemplate('{element}');
|
||
|
$this->accept($renderer);
|
||
|
return $renderer->toHtml();
|
||
|
} //end func toHtml
|
||
|
|
||
|
// }}}
|
||
|
// {{{ getElementName()
|
||
|
|
||
|
/**
|
||
|
* Returns the element name inside the group such as found in the html form
|
||
|
*
|
||
|
* @param mixed $index Element name or element index in the group
|
||
|
* @since 3.0
|
||
|
* @access public
|
||
|
* @return mixed string with element name, false if not found
|
||
|
*/
|
||
|
function getElementName($index)
|
||
|
{
|
||
|
$this->_createElementsIfNotExist();
|
||
|
$elementName = false;
|
||
|
if (is_int($index) && isset($this->_elements[$index])) {
|
||
|
$elementName = $this->_elements[$index]->getName();
|
||
|
if (isset($elementName) && $elementName == '') {
|
||
|
$elementName = $index;
|
||
|
}
|
||
|
if ($this->_appendName) {
|
||
|
if (is_null($elementName)) {
|
||
|
$elementName = $this->getName();
|
||
|
} else {
|
||
|
$elementName = $this->getName().'['.$elementName.']';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
} elseif (is_string($index)) {
|
||
|
foreach (array_keys($this->_elements) as $key) {
|
||
|
$elementName = $this->_elements[$key]->getName();
|
||
|
if ($index == $elementName) {
|
||
|
if ($this->_appendName) {
|
||
|
$elementName = $this->getName().'['.$elementName.']';
|
||
|
}
|
||
|
break;
|
||
|
} elseif ($this->_appendName && $this->getName().'['.$elementName.']' == $index) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return $elementName;
|
||
|
} //end func getElementName
|
||
|
|
||
|
// }}}
|
||
|
// {{{ getFrozenHtml()
|
||
|
|
||
|
/**
|
||
|
* Returns the value of field without HTML tags
|
||
|
*
|
||
|
* @since 1.3
|
||
|
* @access public
|
||
|
* @return string
|
||
|
*/
|
||
|
function getFrozenHtml()
|
||
|
{
|
||
|
$flags = array();
|
||
|
$this->_createElementsIfNotExist();
|
||
|
foreach (array_keys($this->_elements) as $key) {
|
||
|
if (false === ($flags[$key] = $this->_elements[$key]->isFrozen())) {
|
||
|
$this->_elements[$key]->freeze();
|
||
|
}
|
||
|
}
|
||
|
$html = $this->toHtml();
|
||
|
foreach (array_keys($this->_elements) as $key) {
|
||
|
if (!$flags[$key]) {
|
||
|
$this->_elements[$key]->unfreeze();
|
||
|
}
|
||
|
}
|
||
|
return $html;
|
||
|
} //end func getFrozenHtml
|
||
|
|
||
|
// }}}
|
||
|
// {{{ onQuickFormEvent()
|
||
|
|
||
|
/**
|
||
|
* Called by HTML_QuickForm whenever form event is made on this element
|
||
|
*
|
||
|
* @param string $event Name of event
|
||
|
* @param mixed $arg event arguments
|
||
|
* @param object &$caller calling object
|
||
|
* @since 1.0
|
||
|
* @access public
|
||
|
* @return void
|
||
|
*/
|
||
|
function onQuickFormEvent($event, $arg, &$caller)
|
||
|
{
|
||
|
switch ($event) {
|
||
|
case 'updateValue':
|
||
|
$this->_createElementsIfNotExist();
|
||
|
foreach (array_keys($this->_elements) as $key) {
|
||
|
if ($this->_appendName) {
|
||
|
$elementName = $this->_elements[$key]->getName();
|
||
|
if (is_null($elementName)) {
|
||
|
$this->_elements[$key]->setName($this->getName());
|
||
|
} elseif ('' === $elementName) {
|
||
|
$this->_elements[$key]->setName($this->getName() . '[' . $key . ']');
|
||
|
} else {
|
||
|
$this->_elements[$key]->setName($this->getName() . '[' . $elementName . ']');
|
||
|
}
|
||
|
}
|
||
|
$this->_elements[$key]->onQuickFormEvent('updateValue', $arg, $caller);
|
||
|
if ($this->_appendName) {
|
||
|
$this->_elements[$key]->setName($elementName);
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
parent::onQuickFormEvent($event, $arg, $caller);
|
||
|
}
|
||
|
return true;
|
||
|
} // end func onQuickFormEvent
|
||
|
|
||
|
// }}}
|
||
|
// {{{ accept()
|
||
|
|
||
|
/**
|
||
|
* Accepts a renderer
|
||
|
*
|
||
|
* @param HTML_QuickForm_Renderer renderer object
|
||
|
* @param bool Whether a group is required
|
||
|
* @param string An error message associated with a group
|
||
|
* @access public
|
||
|
* @return void
|
||
|
*/
|
||
|
function accept(&$renderer, $required = false, $error = null)
|
||
|
{
|
||
|
$this->_createElementsIfNotExist();
|
||
|
$renderer->startGroup($this, $required, $error);
|
||
|
$name = $this->getName();
|
||
|
foreach (array_keys($this->_elements) as $key) {
|
||
|
$element =& $this->_elements[$key];
|
||
|
|
||
|
if ($this->_appendName) {
|
||
|
$elementName = $element->getName();
|
||
|
if (isset($elementName)) {
|
||
|
$newName = $name . '['. (strlen($elementName)? $elementName: $key) .']';
|
||
|
$newID = str_replace(array(']', '['), array('', '_'), $newName);
|
||
|
$element->setName($newName);
|
||
|
$element->updateAttributes( array( 'id' => $newID ) );
|
||
|
} else {
|
||
|
$element->setName($name);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$required = !$element->isFrozen() && in_array($element->getName(), $this->_required);
|
||
|
|
||
|
$element->accept($renderer, $required);
|
||
|
|
||
|
// restore the element's name
|
||
|
if ($this->_appendName) {
|
||
|
$element->setName($elementName);
|
||
|
}
|
||
|
}
|
||
|
$renderer->finishGroup($this);
|
||
|
} // end func accept
|
||
|
|
||
|
// }}}
|
||
|
// {{{ exportValue()
|
||
|
|
||
|
/**
|
||
|
* As usual, to get the group's value we access its elements and call
|
||
|
* their exportValue() methods
|
||
|
*/
|
||
|
function exportValue(&$submitValues, $assoc = false)
|
||
|
{
|
||
|
$value = null;
|
||
|
foreach (array_keys($this->_elements) as $key) {
|
||
|
$elementName = $this->_elements[$key]->getName();
|
||
|
if ($this->_appendName) {
|
||
|
if (is_null($elementName)) {
|
||
|
$this->_elements[$key]->setName($this->getName());
|
||
|
} elseif ('' === $elementName) {
|
||
|
$this->_elements[$key]->setName($this->getName() . '[' . $key . ']');
|
||
|
} else {
|
||
|
$this->_elements[$key]->setName($this->getName() . '[' . $elementName . ']');
|
||
|
}
|
||
|
}
|
||
|
$v = $this->_elements[$key]->exportValue($submitValues, $assoc);
|
||
|
if ($this->_appendName) {
|
||
|
$this->_elements[$key]->setName($elementName);
|
||
|
}
|
||
|
if (null !== $v) {
|
||
|
// Make $value an array, we will use it like one
|
||
|
if (null === $value) {
|
||
|
$value = array();
|
||
|
}
|
||
|
if ($assoc) {
|
||
|
// just like HTML_QuickForm::exportValues()
|
||
|
$value = HTML_QuickForm::arrayMerge($value, $v);
|
||
|
} else {
|
||
|
// just like getValue(), but should work OK every time here
|
||
|
if (is_null($elementName)) {
|
||
|
$value = $v;
|
||
|
} elseif ('' === $elementName) {
|
||
|
$value[] = $v;
|
||
|
} else {
|
||
|
$value[$elementName] = $v;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
// do not pass the value through _prepareValue, we took care of this already
|
||
|
return $value;
|
||
|
}
|
||
|
|
||
|
// }}}
|
||
|
// {{{ _createElements()
|
||
|
|
||
|
/**
|
||
|
* Creates the group's elements.
|
||
|
*
|
||
|
* This should be overriden by child classes that need to create their
|
||
|
* elements. The method will be called automatically when needed, calling
|
||
|
* it from the constructor is discouraged as the constructor is usually
|
||
|
* called _twice_ on element creation, first time with _no_ parameters.
|
||
|
*
|
||
|
* @access private
|
||
|
* @abstract
|
||
|
*/
|
||
|
function _createElements()
|
||
|
{
|
||
|
// abstract
|
||
|
}
|
||
|
|
||
|
// }}}
|
||
|
// {{{ _createElementsIfNotExist()
|
||
|
|
||
|
/**
|
||
|
* A wrapper around _createElements()
|
||
|
*
|
||
|
* This method calls _createElements() if the group's _elements array
|
||
|
* is empty. It also performs some updates, e.g. freezes the created
|
||
|
* elements if the group is already frozen.
|
||
|
*
|
||
|
* @access private
|
||
|
*/
|
||
|
function _createElementsIfNotExist()
|
||
|
{
|
||
|
if (empty($this->_elements)) {
|
||
|
$this->_createElements();
|
||
|
if ($this->_flagFrozen) {
|
||
|
$this->freeze();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// }}}
|
||
|
// {{{ freeze()
|
||
|
|
||
|
function freeze()
|
||
|
{
|
||
|
parent::freeze();
|
||
|
foreach (array_keys($this->_elements) as $key) {
|
||
|
$this->_elements[$key]->freeze();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// }}}
|
||
|
// {{{ unfreeze()
|
||
|
|
||
|
function unfreeze()
|
||
|
{
|
||
|
parent::unfreeze();
|
||
|
foreach (array_keys($this->_elements) as $key) {
|
||
|
$this->_elements[$key]->unfreeze();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// }}}
|
||
|
// {{{ setPersistantFreeze()
|
||
|
|
||
|
function setPersistantFreeze($persistant = false)
|
||
|
{
|
||
|
parent::setPersistantFreeze($persistant);
|
||
|
foreach (array_keys($this->_elements) as $key) {
|
||
|
$this->_elements[$key]->setPersistantFreeze($persistant);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// }}}
|
||
|
} //end class HTML_QuickForm_group
|
||
|
?>
|