summaryrefslogtreecommitdiff
path: root/framework
diff options
context:
space:
mode:
Diffstat (limited to 'framework')
-rw-r--r--framework/TApplication.php93
-rw-r--r--framework/TComponent.php13
-rw-r--r--framework/Util/TParameterModule.php58
-rw-r--r--framework/Web/UI/TControl.php73
4 files changed, 180 insertions, 57 deletions
diff --git a/framework/TApplication.php b/framework/TApplication.php
index 2eba65fb..0a028141 100644
--- a/framework/TApplication.php
+++ b/framework/TApplication.php
@@ -219,6 +219,10 @@ class TApplication extends TComponent
*/
private $_parameters;
/**
+ * @var TMap list of final application parameters
+ */
+ private $_parametersfinal;
+ /**
* @var string configuration file
*/
private $_configFile;
@@ -320,6 +324,7 @@ class TApplication extends TComponent
* will be looked for. If found, the file is considered as the application
* configuration file.
* @param boolean whether to cache application configuration. Defaults to true.
+ * @param string The type of configuration te app should have. Defaults to {@link CONFIG_TYPE_XML}.
* @throws TConfigurationException if configuration file cannot be read or the runtime path is invalid.
*/
public function __construct($basePath='protected',$cacheConfig=true, $configType=self::CONFIG_TYPE_XML)
@@ -335,9 +340,12 @@ class TApplication extends TComponent
// generates unique ID by hashing the runtime path
$this->_uniqueID=md5($this->_runtimePath);
$this->_parameters=new TMap;
+ $this->_parametersfinal=new TMap;
$this->_services=array($this->getPageServiceID()=>array('TPageService',array(),null));
Prado::setPathOfAlias('Application',$this->_basePath);
+
+ parent::__construct();
}
/**
@@ -982,20 +990,8 @@ class TApplication extends TComponent
if(empty($this->_services))
$this->_services=array($this->getPageServiceID()=>array('TPageService',array(),null));
-
- // load parameters
- foreach($config->getParameters() as $id=>$parameter)
- {
- if(is_array($parameter))
- {
- $component=Prado::createComponent($parameter[0]);
- foreach($parameter[1] as $name=>$value)
- $component->setSubProperty($name,$value);
- $this->_parameters->add($id,$component);
- }
- else
- $this->_parameters->add($id,$parameter);
- }
+
+ $this->mergeParameters($config->getParameters());
// load and init modules specified in app config
$modules=array();
@@ -1036,6 +1032,47 @@ class TApplication extends TComponent
}
}
}
+
+ /**
+ * This will merge the parameters into the application
+ * The parameter looks like this:
+ * <code>
+ * $params = array(
+ * // type = 0 is a class
+ * 'paramname1' => array('type'=>0, 'class' => $type, 'properties' => $properties->toArray(),
+ * 'final' => $final, 'value' => $element),
+ * // type != 0 is a parameter with a value
+ * 'paramname1' => array('type'=>1, 'value' => $element, 'final' => $final),
+ * 'paramname2' => array('type'=>2, 'value' => $value, 'final' => $final)
+ * );
+ * </code>
+ * @param array $parameters the parameters to merge into application
+ */
+ public function mergeParameters($parameters) {
+ // load parameters
+ foreach($parameters as $id=>$parameter)
+ {
+ if(isset($this->_parametersfinal[$id]))
+ continue;
+
+ if(!$parameter['type'])
+ {
+ $component=Prado::createComponent($parameter['class']);
+ foreach($parameter['properties'] as $name=>$value)
+ $component->setSubProperty($name,$value);
+ if($component instanceof IModule && isset($parameter['value']))
+ $component->init($parameter['value']);
+ $this->_parameters->add($id,$component);
+ }
+ else
+ $this->_parameters->add($id,$parameter['value']);
+
+ // If this parameter is final, and not set yet, set it
+ if($parameter['final'] && !isset($this->_parametersfinal[$id]))
+ $this->_parametersfinal->add($id, $parameter['value']);
+ }
+ }
+
/**
* Loads configuration and initializes application.
@@ -1061,7 +1098,7 @@ class TApplication extends TComponent
}
else
$config=Prado::unserialize(file_get_contents($this->_cacheFile));
-
+
$this->applyConfiguration($config,false);
}
@@ -1627,13 +1664,20 @@ class TApplicationConfiguration extends TComponent
{
if(is_array($parameter))
{
+ $final = TPropertyValue::ensureBoolean($parameter['final']);
+ unset($parameter['final']);
if(isset($parameter['class']))
{
- $type = $parameter['class'];
- unset($parameter['class']);
- $properties = isset($service['properties']) ? $service['properties'] : array();
+ $properties = isset($parameter['properties']) ? $parameter['properties'] : array();
$properties['id'] = $id;
- $this->_parameters[$id] = array($type,$properties);
+ $this->_parameters[$id] = array('type'=>0, 'class' => $parameter['class'], 'properties' => $properties,
+ 'final' => $final, 'value' => $parameter);
+ } else {
+ if(!isset($parameter['value'])) {
+ $this->_parameters[$id]=array('type'=>1, 'value' => $parameter, 'final' => $final);
+ } else {
+ $this->_parameters[$id]=array('type'=>2, 'value' => $value, 'final' => $final);
+ }
}
}
else
@@ -1657,15 +1701,18 @@ class TApplicationConfiguration extends TComponent
$properties=$element->getAttributes();
if(($id=$properties->remove('id'))===null)
throw new TConfigurationException('appconfig_parameterid_required');
+ $final = TPropertyValue::ensureBoolean($properties->remove('final'));
if(($type=$properties->remove('class'))===null)
{
if(($value=$properties->remove('value'))===null)
- $this->_parameters[$id]=$element;
+ $this->_parameters[$id]=array('type'=>1, 'value' => $element, 'final' => $final);
else
- $this->_parameters[$id]=$value;
+ $this->_parameters[$id]=array('type'=>2, 'value' => $value, 'final' => $final);
+ }
+ else {
+ $this->_parameters[$id]=array('type'=>0, 'class' => $type, 'properties' => $properties->toArray(),
+ 'final' => $final, 'value' => $element);
}
- else
- $this->_parameters[$id]=array($type,$properties->toArray());
$this->_empty=false;
}
else
diff --git a/framework/TComponent.php b/framework/TComponent.php
index 55c19ecf..9b5331ef 100644
--- a/framework/TComponent.php
+++ b/framework/TComponent.php
@@ -4,7 +4,7 @@
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @link http://www.pradosoft.com/
- * @copyright Copyright &copy; 2005-2008 PradoSoft
+ * @copyright Copyright &copy; 2005-2010 PradoSoft
* @license http://www.pradosoft.com/license/
* @version $Id$
* @package System
@@ -49,11 +49,12 @@
* To raise an event (assuming named as 'Click') of a component, use
* <code>
* $component->raiseEvent('OnClick');
+ * $component->raiseEvent('OnClick', $this, $param);
* </code>
* To attach an event handler to an event, use one of the following ways,
* <code>
* $component->OnClick=$callback; // or $component->OnClick->add($callback);
- * $$component->attachEventHandler('OnClick',$callback);
+ * $component->attachEventHandler('OnClick',$callback);
* </code>
* The first two ways make use of the fact that $component->OnClick refers to
* the event handler list {@link TList} for the 'OnClick' event.
@@ -83,6 +84,14 @@ class TComponent
*/
private $_m=array();
+
+ /**
+ * The Common __construct
+ */
+ public function __construct() {
+ }
+
+
/**
* Returns a property value or an event handler list by property or event name.
* Do not call this method. This is a PHP magic method that we override
diff --git a/framework/Util/TParameterModule.php b/framework/Util/TParameterModule.php
index 0109ca32..265bdd38 100644
--- a/framework/Util/TParameterModule.php
+++ b/framework/Util/TParameterModule.php
@@ -4,7 +4,7 @@
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @link http://www.pradosoft.com/
- * @copyright Copyright &copy; 2005-2008 PradoSoft
+ * @copyright Copyright &copy; 2005-2010 PradoSoft
* @license http://www.pradosoft.com/license/
* @version $Id$
* @package System.Util
@@ -24,6 +24,7 @@
* <parameters>
* <parameter id="param1" value="paramValue1" />
* <parameter id="param2" Property1="Value1" Property2="Value2" ... />
+ * <parameter id="param3" value="cannot be changed" final="true" />
* </parameters>
* </code>
*
@@ -33,12 +34,19 @@
* <module class="System.Util.TParameterModule">
* <parameter id="param1" value="paramValue1" />
* <parameter id="param2" Property1="Value1" Property2="Value2" ... />
+ * <parameter id="param3" value="cannot be changed" final="true" />
* </module>
* </code>
*
+ * Setting the final attribute to true will cause that parameter to be unchangable
+ * by any future mergeParameters.
+ *
* If a parameter is defined both in the external file and within the module
* tag, the former takes precedence.
*
+ * the application parameters are processed first before the modules parameters
+ * are processed.
+ *
* @author Qiang Xue <qiang.xue@gmail.com>
* @author Carl G. Mathisen <carlgmathisen@gmail.com>
* @version $Id$
@@ -93,7 +101,7 @@ class TParameterModule extends TModule
/**
* Loads parameters into application.
- * @param mixed XML of PHP representation of the parameters
+ * @param mixed XML or PHP representation of the parameters
* @throws TConfigurationException if the parameter file format is invalid
*/
protected function loadParameters($config)
@@ -103,10 +111,23 @@ class TParameterModule extends TModule
{
foreach($config as $id => $parameter)
{
- if(is_array($parameter) && isset($parameter['class']))
+ if(is_array($parameter))
{
- $properties = isset($parameter['properties'])?$parameter['properties']:array();
- $parameters[$id]=array($parameter['class'],$properties);
+ $final = TPropertyValue::ensureBoolean($parameter['final']);
+ unset($parameter['final']);
+ if(isset($parameter['class']))
+ {
+ $properties = isset($parameter['properties']) ? $parameter['properties'] : array();
+ $properties['id'] = $id;
+ $parameters[$id] = array('type'=>0, 'class' => $parameter['class'], 'properties' => $properties,
+ 'final' => $final, 'value' => $parameter);
+ } else {
+ if(!isset($parameter['value'])) {
+ $parameters[$id]=array('type'=>1, 'value' => $parameter, 'final' => $final);
+ } else {
+ $parameters[$id]=array('type'=>2, 'value' => $value, 'final' => $final);
+ }
+ }
}
else
{
@@ -121,31 +142,22 @@ class TParameterModule extends TModule
$properties=$node->getAttributes();
if(($id=$properties->remove('id'))===null)
throw new TConfigurationException('parametermodule_parameterid_required');
+ $final = TPropertyValue::ensureBoolean($properties->remove('final'));
if(($type=$properties->remove('class'))===null)
{
if(($value=$properties->remove('value'))===null)
- $parameters[$id]=$node;
+ $parameters[$id]=array('type'=>1, 'value' => $node, 'final' => $final);
else
- $parameters[$id]=$value;
+ $parameters[$id]=array('type'=>2, 'value' => $value, 'final' => $final);
+ }
+ else {
+ $parameters[$id]=array('type'=>0, 'class' => $type, 'properties' => $properties->toArray(),
+ 'final' => $final, 'value' => $node);
}
- else
- $parameters[$id]=array($type,$properties->toArray());
- }
- }
-
- $appParams=$this->getApplication()->getParameters();
- foreach($parameters as $id=>$parameter)
- {
- if(is_array($parameter))
- {
- $component=Prado::createComponent($parameter[0]);
- foreach($parameter[1] as $name=>$value)
- $component->setSubProperty($name,$value);
- $appParams->add($id,$component);
}
- else
- $appParams->add($id,$parameter);
}
+
+ $this->getApplication()->mergeParameters($parameters);
}
/**
diff --git a/framework/Web/UI/TControl.php b/framework/Web/UI/TControl.php
index 1c03a04d..79a691ec 100644
--- a/framework/Web/UI/TControl.php
+++ b/framework/Web/UI/TControl.php
@@ -4,7 +4,7 @@
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @link http://www.pradosoft.com/
- * @copyright Copyright &copy; 2005-2008 PradoSoft
+ * @copyright Copyright &copy; 2005-2010 PradoSoft
* @license http://www.pradosoft.com/license/
* @version $Id$
* @package System.Web.UI
@@ -172,12 +172,17 @@ class TControl extends TApplicationComponent implements IRenderable, IBindable
* @var array a collection of rare control data
*/
private $_rf=array();
+ /**
+ * @var number this is how many times the control was told not to render
+ */
+ private $_renderblockcount=0;
/**
* Constructor.
*/
public function __construct()
{
+ parent::__construct();
}
/**
@@ -237,6 +242,21 @@ class TControl extends TApplicationComponent implements IRenderable, IBindable
}
/**
+ * @return TControl the parent of this control of type
+ */
+ public function getParentOfType($type,$strict=false)
+ {
+ $control = $this->Parent;
+ do {
+ if(is_object($control) && (get_class($control)===$type || (!$strict && ($control instanceof $type))))
+ return $control;
+ $control = $control->Parent;
+ } while($control);
+
+ return null;
+ }
+
+ /**
* @return TControl the naming container of this control
*/
public function getNamingContainer()
@@ -297,6 +317,32 @@ class TControl extends TApplicationComponent implements IRenderable, IBindable
}
/**
+ * This adds a block to the rendering of the control
+ */
+ public function addRenderBlock()
+ {
+ ++$this->_renderblockcount;
+ }
+
+ /**
+ * @return boolean true if the rendering is currently blocked
+ */
+ public function getIsRenderBlocked()
+ {
+ return $this->_renderblockcount > 0;
+ }
+
+ /**
+ * removes a block. This also has an interesting effect of forcing the render if called in the reverse
+ * of the typical order. eg. removeRenderBlock(); ...... addRenderBlock();
+ */
+ public function removeRenderBlock()
+ {
+ --$this->_renderblockcount;
+ }
+
+
+ /**
* @return TTemplateControl the control whose template is loaded from
* some external storage, such as file, db, and whose template ultimately
* contains this control.
@@ -445,6 +491,13 @@ class TControl extends TApplicationComponent implements IRenderable, IBindable
}
/**
+ * @return boolean whether the skin has been applied or is past the phase of skin application
+ */
+ public function getIsSkinApplied() {
+ return ($this->_flags & self::IS_SKIN_APPLIED) || $this->_stage>self::CS_CHILD_INITIALIZED;
+ }
+
+ /**
* @return boolean whether theming is enabled for this control.
* The theming is enabled if the control and all its parents have it enabled.
*/
@@ -1564,6 +1617,8 @@ class TControl extends TApplicationComponent implements IRenderable, IBindable
{
if($this->getHasControls())
{
+ if($this->IsRenderBlocked) return;
+
foreach($this->_rf[self::RF_CONTROLS] as $control)
{
if(is_string($control))
@@ -1997,14 +2052,14 @@ interface IValidatable
* @return mixed the value of the property to be validated.
*/
public function getValidationPropertyValue();
- /**
- * @return boolean wether this control's validators validated successfully (must default to true)
- */
- public function getIsValid();
- /**
- * @return boolean wether this control's validators validated successfully
- */
- public function setIsValid($value);
+ /**
+ * @return boolean wether this control's validators validated successfully (must default to true)
+ */
+ public function getIsValid();
+ /**
+ * @return boolean wether this control's validators validated successfully
+ */
+ public function setIsValid($value);
}
/**