summaryrefslogtreecommitdiff
path: root/framework/web/form/CFormElement.php
diff options
context:
space:
mode:
Diffstat (limited to 'framework/web/form/CFormElement.php')
-rw-r--r--framework/web/form/CFormElement.php168
1 files changed, 168 insertions, 0 deletions
diff --git a/framework/web/form/CFormElement.php b/framework/web/form/CFormElement.php
new file mode 100644
index 0000000..c926e95
--- /dev/null
+++ b/framework/web/form/CFormElement.php
@@ -0,0 +1,168 @@
+<?php
+/**
+ * CFormElement class file.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @link http://www.yiiframework.com/
+ * @copyright Copyright &copy; 2008-2011 Yii Software LLC
+ * @license http://www.yiiframework.com/license/
+ */
+
+/**
+ * CFormElement is the base class for presenting all kinds of form element.
+ *
+ * CFormElement implements the way to get and set arbitrary attributes.
+ *
+ * @property boolean $visible Whether this element is visible and should be rendered.
+ * @property mixed $parent The direct parent of this element. This could be either a {@link CForm} object or a {@link CBaseController} object
+ * (a controller or a widget).
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @version $Id: CFormElement.php 3426 2011-10-25 00:01:09Z alexander.makarow $
+ * @package system.web.form
+ * @since 1.1
+ */
+abstract class CFormElement extends CComponent
+{
+ /**
+ * @var array list of attributes (name=>value) for the HTML element represented by this object.
+ */
+ public $attributes=array();
+
+ private $_parent;
+ private $_visible;
+
+ /**
+ * Renders this element.
+ * @return string the rendering result
+ */
+ abstract function render();
+
+ /**
+ * Constructor.
+ * @param mixed $config the configuration for this element.
+ * @param mixed $parent the direct parent of this element.
+ * @see configure
+ */
+ public function __construct($config,$parent)
+ {
+ $this->configure($config);
+ $this->_parent=$parent;
+ }
+
+ /**
+ * Converts the object to a string.
+ * This is a PHP magic method.
+ * The default implementation simply calls {@link render} and return
+ * the rendering result.
+ * @return string the string representation of this object.
+ */
+ public function __toString()
+ {
+ return $this->render();
+ }
+
+ /**
+ * Returns a property value or an attribute value.
+ * Do not call this method. This is a PHP magic method that we override
+ * to allow using the following syntax to read a property or attribute:
+ * <pre>
+ * $value=$element->propertyName;
+ * $value=$element->attributeName;
+ * </pre>
+ * @param string $name the property or attribute name
+ * @return mixed the property or attribute value
+ * @throws CException if the property or attribute is not defined
+ * @see __set
+ */
+ public function __get($name)
+ {
+ $getter='get'.$name;
+ if(method_exists($this,$getter))
+ return $this->$getter();
+ else if(isset($this->attributes[$name]))
+ return $this->attributes[$name];
+ else
+ throw new CException(Yii::t('yii','Property "{class}.{property}" is not defined.',
+ array('{class}'=>get_class($this), '{property}'=>$name)));
+ }
+
+ /**
+ * Sets value of a property or attribute.
+ * Do not call this method. This is a PHP magic method that we override
+ * to allow using the following syntax to set a property or attribute.
+ * <pre>
+ * $this->propertyName=$value;
+ * $this->attributeName=$value;
+ * </pre>
+ * @param string $name the property or attribute name
+ * @param mixed $value the property or attribute value
+ * @see __get
+ */
+ public function __set($name,$value)
+ {
+ $setter='set'.$name;
+ if(method_exists($this,$setter))
+ $this->$setter($value);
+ else
+ $this->attributes[$name]=$value;
+ }
+
+ /**
+ * Configures this object with property initial values.
+ * @param mixed $config the configuration for this object. This can be an array
+ * representing the property names and their initial values.
+ * It can also be a string representing the file name of the PHP script
+ * that returns a configuration array.
+ */
+ public function configure($config)
+ {
+ if(is_string($config))
+ $config=require(Yii::getPathOfAlias($config).'.php');
+ if(is_array($config))
+ {
+ foreach($config as $name=>$value)
+ $this->$name=$value;
+ }
+ }
+
+ /**
+ * Returns a value indicating whether this element is visible and should be rendered.
+ * This method will call {@link evaluateVisible} to determine the visibility of this element.
+ * @return boolean whether this element is visible and should be rendered.
+ */
+ public function getVisible()
+ {
+ if($this->_visible===null)
+ $this->_visible=$this->evaluateVisible();
+ return $this->_visible;
+ }
+
+ /**
+ * @param boolean $value whether this element is visible and should be rendered.
+ */
+ public function setVisible($value)
+ {
+ $this->_visible=$value;
+ }
+
+ /**
+ * @return mixed the direct parent of this element. This could be either a {@link CForm} object or a {@link CBaseController} object
+ * (a controller or a widget).
+ */
+ public function getParent()
+ {
+ return $this->_parent;
+ }
+
+ /**
+ * Evaluates the visibility of this element.
+ * Child classes should override this method to implement the actual algorithm
+ * for determining the visibility.
+ * @return boolean whether this element is visible. Defaults to true.
+ */
+ protected function evaluateVisible()
+ {
+ return true;
+ }
+}