* @link http://www.yiiframework.com/ * @copyright Copyright © 2008-2009 Yii Software LLC * @license http://www.yiiframework.com/license/ */ /** * CFormElementCollection implements the collection for storing form elements. * * Because CFormElementCollection extends from {@link CMap}, it can be used like an associative array. * For example, *
 * $element=$collection['username'];
 * $collection['username']=array('type'=>'text', 'maxlength'=>128);
 * $collection['password']=new CFormInputElement($form, array('type'=>'password'));
 * $collection[]='some string';
 * 
* * CFormElementCollection can store three types of value: a configuration array, a {@link CFormElement} * object, or a string, as shown in the above example. Internally, these values will be converted * to {@link CFormElement} objects. * * @author Qiang Xue * @version $Id$ * @package system.web.form * @since 1.1 */ class CFormElementCollection extends CMap { private $_form; private $_forButtons; /** * Constructor. * @param CForm the form object that owns this collection * @param boolean whether this collection is used to store buttons. */ public function __construct($form,$forButtons=false) { parent::__construct(); $this->_form=$form; $this->_forButtons=$forButtons; } /** * Adds an item to the collection. * This method overrides the parent implementation to ensure * only configuration arrays, strings, or {@link CFormElement} objects * can be stored in this collection. * @param mixed key * @param mixed value * @throws CException if the value is invalid. */ public function add($key,$value) { if(is_array($value)) { if(is_string($key)) $value['name']=$key; if($this->_forButtons) { $class=$this->_form->buttonElementClass; $button=new $class($this->_form,$value); parent::add($key,$button); } else { if(!isset($value['type'])) $value['type']='text'; if($value['type']==='string') { unset($value['type'],$value['name']); parent::add($key,new CFormStringElement($this->_form,$value)); } else if(!strcasecmp(substr($value['type'],-4),'form')) // a form { $class=Yii::import($value['type']); parent::add($key,new $class($this->_form,null,$value)); } else { $class=$this->_form->inputElementClass; parent::add($key,new $class($this->_form,$value)); } } } else if($value instanceof CFormElement) { if(property_exists($value,'name') && is_string($key)) $value->name=$key; parent::add($key,$value); } else parent::add($key,new CFormStringElement($this->_form,array('content'=>$value))); } }