diff options
| -rw-r--r-- | framework/Exceptions/messages.txt | 2 | ||||
| -rw-r--r-- | framework/Web/UI/TControl.php | 70 | ||||
| -rw-r--r-- | framework/Web/UI/TTemplateManager.php | 12 | 
3 files changed, 75 insertions, 9 deletions
diff --git a/framework/Exceptions/messages.txt b/framework/Exceptions/messages.txt index b4a91adb..ebe645e8 100644 --- a/framework/Exceptions/messages.txt +++ b/framework/Exceptions/messages.txt @@ -145,6 +145,8 @@ control_id_nonunique					= %s.ID '%s' is not unique among all controls under the  controllist_control_required			= TControlList can only accept strings or TControl objects.
 +emptycontrollist_addition_disallowed	= Child controls are not allowed.
 +
  webcontrol_accesskey_invalid			= %s.AccessKey '%s' is invalid. It must be a single character only.
  webcontrol_style_invalid				= %s.Style must take string value only.
 diff --git a/framework/Web/UI/TControl.php b/framework/Web/UI/TControl.php index 80956312..660b1c4c 100644 --- a/framework/Web/UI/TControl.php +++ b/framework/Web/UI/TControl.php @@ -407,11 +407,21 @@ class TControl extends TComponent  	public function getControls()
  	{
  		if(!isset($this->_rf[self::RF_CONTROLS]))
 -			$this->_rf[self::RF_CONTROLS]=new TControlList($this);
 +			$this->_rf[self::RF_CONTROLS]=$this->createControlCollection();
  		return $this->_rf[self::RF_CONTROLS];
  	}
  	/**
 +	 * Creates a control collection object that is to be used to hold child controls
 +	 * @return TControlList control collection
 +	 * @see getControls
 +	 */
 +	protected function createControlCollection()
 +	{
 +		return $this->getAllowChildControls()?new TControlList($this):new TEmptyControlList($this);
 +	}
 +
 +	/**
  	 * Checks if a control is visible.
  	 * If parent check is required, then a control is visible only if the control
  	 * and all its ancestors are visible.
 @@ -883,6 +893,14 @@ class TControl extends TComponent  	}
  	/**
 +	 * @return boolean whether body contents are allowed for this control. Defaults to true.
 +	 */
 +	public function getAllowChildControls()
 +	{
 +		return true;
 +	}
 +
 +	/**
  	 * This method is invoked after the control is instantiated by a template.
  	 * When this method is invoked, the control should have a valid TemplateControl
  	 * and has its properties initialized according to template configurations.
 @@ -1530,6 +1548,56 @@ class TControlList extends TList  }
  /**
 + * TEmptyControlList class
 + *
 + * TEmptyControlList implements an empty control list that prohibits adding
 + * controls to it. This is useful for controls that do not allow child controls.
 + *
 + * @author Qiang Xue <qiang.xue@gmail.com>
 + * @version $Revision: $  $Date: $
 + * @package System.Web.UI
 + * @since 3.0
 + */
 +class TEmptyControlList extends TList
 +{
 +	/**
 +	 * the control that owns this collection.
 +	 * @var TControl
 +	 */
 +	private $_o;
 +
 +	/**
 +	 * Constructor.
 +	 * @param TControl the control that owns this collection.
 +	 */
 +	public function __construct(TControl $owner)
 +	{
 +		parent::__construct();
 +		$this->_o=$owner;
 +	}
 +
 +	/**
 +	 * @return TControl the control that owns this collection.
 +	 */
 +	protected function getOwner()
 +	{
 +		return $this->_o;
 +	}
 +
 +	/**
 +	 * Inserts an item at the specified position.
 +	 * Calling this method will always throw an exception.
 +	 * @param integer the speicified position.
 +	 * @param mixed new item
 +	 * @throws TInvalidDataTypeException if the item to be inserted is neither a string nor a TControl.
 +	 */
 +	public function insertAt($index,$item)
 +	{
 +		throw new TNotSupportedException('emptycontrollist_addition_disallowed');
 +	}
 +}
 +
 +/**
   * INamingContainer interface.
   * INamingContainer marks a control as a naming container.
   *
 diff --git a/framework/Web/UI/TTemplateManager.php b/framework/Web/UI/TTemplateManager.php index 45884f02..abeb7466 100644 --- a/framework/Web/UI/TTemplateManager.php +++ b/framework/Web/UI/TTemplateManager.php @@ -252,6 +252,9 @@ class TTemplate extends TComponent implements ITemplate  		$controls=array();
  		foreach($this->_tpl as $key=>$object)
  		{
 +			$parent=isset($controls[$object[0]])?$controls[$object[0]]:$tplControl;
 +			if(!$parent->getAllowChildControls())
 +				continue;
  			if(isset($object[2]))	// component
  			{
  				$component=Prado::createComponent($object[1]);
 @@ -270,7 +273,6 @@ class TTemplate extends TComponent implements ITemplate  					// apply attributes
  					foreach($object[2] as $name=>$value)
  						$this->configureControl($component,$name,$value);
 -					$parent=isset($controls[$object[0]])?$controls[$object[0]]:$tplControl;
  					$component->createdOnTemplate($parent);
  				}
  				else if($component instanceof TComponent)
 @@ -283,17 +285,11 @@ class TTemplate extends TComponent implements ITemplate  					}
  					foreach($object[2] as $name=>$value)
  						$this->configureComponent($component,$name,$value);
 -					$parent=isset($controls[$object[0]])?$controls[$object[0]]:$tplControl;
  					$parent->addParsedObject($component);
  				}
  			}
  			else	// string
 -			{
 -				if(isset($controls[$object[0]]))
 -					$controls[$object[0]]->addParsedObject($object[1]);
 -				else
 -					$tplControl->addParsedObject($object[1]);
 -			}
 +				$parent->addParsedObject($object[1]);
  		}
  	}
  | 
