CFormElementCollection.php
3.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<?php
/**
* CFormElementCollection class file.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @link http://www.yiiframework.com/
* @copyright Copyright © 2008-2011 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,
* <pre>
* $element=$collection['username'];
* $collection['username']=array('type'=>'text', 'maxlength'=>128);
* $collection['password']=new CFormInputElement(array('type'=>'password'),$form);
* $collection[]='some string';
* </pre>
*
* 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 <qiang.xue@gmail.com>
* @version $Id$
* @package system.web.form
* @since 1.1
*/
class CFormElementCollection extends CMap
{
private $_form;
private $_forButtons;
/**
* Constructor.
* @param CForm $form the form object that owns this collection
* @param boolean $forButtons 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 key
* @param mixed $value 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;
$element=new $class($value,$this->_form);
}
else
{
if(!isset($value['type']))
$value['type']='text';
if($value['type']==='string')
{
unset($value['type'],$value['name']);
$element=new CFormStringElement($value,$this->_form);
}
else if(!strcasecmp(substr($value['type'],-4),'form')) // a form
{
$class=$value['type']==='form' ? get_class($this->_form) : Yii::import($value['type']);
$element=new $class($value,null,$this->_form);
}
else
{
$class=$this->_form->inputElementClass;
$element=new $class($value,$this->_form);
}
}
}
else if($value instanceof CFormElement)
{
if(property_exists($value,'name') && is_string($key))
$value->name=$key;
$element=$value;
}
else
$element=new CFormStringElement(array('content'=>$value),$this->_form);
parent::add($key,$element);
$this->_form->addedElement($key,$element,$this->_forButtons);
}
/**
* Removes the specified element by key.
* @param string $key the name of the element to be removed from the collection
*/
public function remove($key)
{
if(($item=parent::remove($key))!==null)
$this->_form->removedElement($key,$item,$this->_forButtons);
}
}