From 27478826035da62e1cba07833101b162558f895a Mon Sep 17 00:00:00 2001 From: xue <> Date: Thu, 4 May 2006 03:02:44 +0000 Subject: Merge from 3.0 branch till 1016. --- framework/TComponent.php | 5 ++- framework/Web/TAssetManager.php | 3 +- framework/Web/THttpRequest.php | 14 +++++-- framework/Web/UI/TTemplateManager.php | 64 ++++++++++++++++++++---------- framework/Web/UI/WebControls/TTable.php | 56 ++++++++------------------ framework/Web/UI/WebControls/TTableRow.php | 62 +++++++---------------------- framework/Web/UI/WebControls/TWizard.php | 58 ++++++++++++++++++++++++++- 7 files changed, 146 insertions(+), 116 deletions(-) (limited to 'framework') diff --git a/framework/TComponent.php b/framework/TComponent.php index 99907e4d..64854692 100644 --- a/framework/TComponent.php +++ b/framework/TComponent.php @@ -360,7 +360,10 @@ class TComponent $object=$this->getSubProperty(substr($method,0,$pos)); $method=substr($method,$pos+1); } - $object->$method($sender,$param); + if(method_exists($object,$method)) + $object->$method($sender,$param); + else + throw new TInvalidDataValueException('component_eventhandler_invalid',get_class($this),$name); } } else diff --git a/framework/Web/TAssetManager.php b/framework/Web/TAssetManager.php index 5600c4ab..f3ebe7c3 100644 --- a/framework/Web/TAssetManager.php +++ b/framework/Web/TAssetManager.php @@ -213,6 +213,7 @@ class TAssetManager extends TModule * File modification time is used to ensure the copied files are latest. * @param string the source directory * @param string the destination directory + * @todo a generic solution to ignore certain directories and files */ protected function copyDirectory($src,$dst) { @@ -221,7 +222,7 @@ class TAssetManager extends TModule $folder=@opendir($src); while($file=@readdir($folder)) { - if($file==='.' || $file==='..') + if($file==='.' || $file==='..' || $file==='.svn') continue; else if(is_file($src.'/'.$file)) { diff --git a/framework/Web/THttpRequest.php b/framework/Web/THttpRequest.php index 71237fa1..9b06076e 100644 --- a/framework/Web/THttpRequest.php +++ b/framework/Web/THttpRequest.php @@ -460,9 +460,12 @@ class THttpRequest extends TApplicationComponent implements IteratorAggregate,Ar { $name=urlencode($name.'[]'); foreach($value as $v) - $url.=$amp.$name.'='.$v; + { + if(($v=trim($v))!=='') + $url.=$amp.$name.'='.$v; + } } - else + else if(($value=trim($value))!=='') $url.=$amp.urlencode($name).'='.urlencode($value); } } @@ -473,9 +476,12 @@ class THttpRequest extends TApplicationComponent implements IteratorAggregate,Ar if(is_array($value)) { foreach($value as $v) - $url.=$amp.$name.'[]='.$v; + { + if(($v=trim($v))!=='') + $url.=$amp.$name.'[]='.$v; + } } - else + else if(($value=trim($value))!=='') $url.=$amp.$name.'='.$value; } } diff --git a/framework/Web/UI/TTemplateManager.php b/framework/Web/UI/TTemplateManager.php index eac7c157..b29466ad 100644 --- a/framework/Web/UI/TTemplateManager.php +++ b/framework/Web/UI/TTemplateManager.php @@ -132,9 +132,7 @@ class TTemplateManager extends TModule * - directive: directive specifies the property values for the template owner. * It is in the format of <% property name-value pairs %> * - expressions: They are in the formate of <= PHP expression > and <% PHP statements > - * - comments: There are two kinds of comments, regular HTML comments and special template comments. - * The former is in the format of <!-- comments -->, which will be treated as text strings. - * The latter is in the format of <%* comments %>, which will be stripped out. + * - comments: Special template comments enclosed within <!-- comments --!> will be stripped out. * * Tags other than the above are not required to be well-formed. * @@ -152,13 +150,12 @@ class TTemplate extends TApplicationComponent implements ITemplate { /** * '' - template comments - * '' - HTML comments * '<\/?com:([\w\.]+)((?:\s*[\w\.]+=\'.*?\'|\s*[\w\.]+=".*?"|\s*[\w\.]+=<%.*?%>)*)\s*\/?>' - component tags * '<\/?prop:([\w\.]+)\s*>' - property tags * '<%@\s*((?:\s*[\w\.]+=\'.*?\'|\s*[\w\.]+=".*?")*)\s*%>' - directives * '<%[%#~\\$=\\[](.*?)%>' - expressions */ - const REGEX_RULES='/||<\/?com:([\w\.]+)((?:\s*[\w\.]+=\'.*?\'|\s*[\w\.]+=".*?"|\s*[\w\.]+=<%.*?%>)*)\s*\/?>|<\/?prop:([\w\.]+)\s*>|<%@\s*((?:\s*[\w\.]+=\'.*?\'|\s*[\w\.]+=".*?")*)\s*%>|<%[%#~\\$=\\[](.*?)%>/msS'; + const REGEX_RULES='/|<\/?com:([\w\.]+)((?:\s*[\w\.]+=\'.*?\'|\s*[\w\.]+=".*?"|\s*[\w\.]+=<%.*?%>)*)\s*\/?>|<\/?prop:([\w\.]+)\s*>|<%@\s*((?:\s*[\w\.]+=\'.*?\'|\s*[\w\.]+=".*?")*)\s*%>|<%[%#~\\$=\\[](.*?)%>/msS'; /** * Different configurations of component property/event/attribute @@ -280,6 +277,7 @@ class TTemplate extends TApplicationComponent implements ITemplate if(($page=$tplControl->getPage())===null) $page=$this->getService()->getRequestedPage(); $controls=array(); + $directChildren=array(); foreach($this->_tpl as $key=>$object) { if($object[0]===-1) @@ -315,7 +313,10 @@ class TTemplate extends TApplicationComponent implements ITemplate // apply attributes foreach($properties as $name=>$value) $this->configureControl($component,$name,$value); - $component->createdOnTemplate($parent); + if($parent===$tplControl) + $directChildren[]=$component; + else + $component->createdOnTemplate($parent); if($component->getAllowChildControls()) $controls[$key]=$component; } @@ -331,20 +332,45 @@ class TTemplate extends TApplicationComponent implements ITemplate } foreach($properties as $name=>$value) $this->configureComponent($component,$name,$value); - $parent->addParsedObject($component); + if($parent===$tplControl) + $directChildren[]=$component; + else + $parent->addParsedObject($component); } } - else if(is_string($object[1])) - $parent->addParsedObject($object[1]); else if($object[1] instanceof TCompositeLiteral) { - $o=clone $object[1]; - $o->setContainer($tplControl); - $parent->addParsedObject($o); + if($object[1] instanceof TCompositeLiteral) + { + // need to clone a new object because the one in template is reused + $o=clone $object[1]; + $o->setContainer($tplControl); + if($parent===$tplControl) + $directChildren[]=$o; + else + $parent->addParsedObject($o); + } + else + { + if($parent===$tplControl) + $directChildren[]=$object[1]; + else + $parent->addParsedObject($object[1]); + } } else throw new TConfigurationException('template_content_unexpected',(string)$object[1]); } + // delay setting parent till now because the parent may cause + // the child to do lifecycle catchup which may cause problem + // if the child needs its own child controls. + foreach($directChildren as $control) + { + if($control instanceof TControl) + $control->createdOnTemplate($tplControl); + else + $tplControl->addParsedObject($control); + } } /** @@ -640,15 +666,11 @@ class TTemplate extends TApplicationComponent implements ITemplate } else if(strpos($str,'')===strlen($str)-4) // template comments - { - if($expectPropEnd) - throw new TConfigurationException('template_comments_forbidden'); - if($matchStart>$textStart) - $tpl[$c++]=array($container,substr($input,$textStart,$matchStart-$textStart)); - $textStart=$matchEnd+1; - } - // else, HTML comments and we do nothing + if($expectPropEnd) + throw new TConfigurationException('template_comments_forbidden'); + if($matchStart>$textStart) + $tpl[$c++]=array($container,substr($input,$textStart,$matchStart-$textStart)); + $textStart=$matchEnd+1; } else throw new TConfigurationException('template_matching_unexpected',$match); diff --git a/framework/Web/UI/WebControls/TTable.php b/framework/Web/UI/WebControls/TTable.php index 4fcbb6fb..e7baca02 100644 --- a/framework/Web/UI/WebControls/TTable.php +++ b/framework/Web/UI/WebControls/TTable.php @@ -124,13 +124,21 @@ class TTable extends TWebControl } /** - * @return TTableRowCollection list of {@link TTableRow} controls + * Creates a control collection object that is to be used to hold child controls + * @return TTableRowCollection control collection + * @see getControls + */ + protected function createControlCollection() + { + return new TTableRowCollection($this); + } + + /** + * @return TTableCellCollection list of {@link TTableCell} controls */ public function getRows() { - if(!$this->_rows) - $this->_rows=new TTableRowCollection($this); - return $this->_rows; + return $this->getControls(); } /** @@ -288,10 +296,10 @@ class TTable extends TWebControl */ public function renderContents($writer) { - if($this->_rows) + if($this->getHasControls()) { $writer->writeLine(); - foreach($this->_rows as $row) + foreach($this->getControls() as $row) { $row->renderControl($writer); $writer->writeLine(); @@ -300,6 +308,7 @@ class TTable extends TWebControl } } + /** * TTableRowCollection class. * @@ -310,22 +319,8 @@ class TTable extends TWebControl * @package System.Web.UI.WebControls * @since 3.0 */ -class TTableRowCollection extends TList +class TTableRowCollection extends TControlCollection { - /** - * @var mixed row collection owner - */ - private $_owner=null; - - /** - * Constructor. - * @param mixed row collection owner - */ - public function __construct($owner=null) - { - $this->_owner=$owner; - } - /** * Inserts an item at the specified position. * This overrides the parent implementation by performing additional @@ -337,29 +332,10 @@ class TTableRowCollection extends TList public function insertAt($index,$item) { if($item instanceof TTableRow) - { parent::insertAt($index,$item); - if($this->_owner) - $this->_owner->getControls()->insertAt($index,$item); - } else throw new TInvalidDataTypeException('tablerowcollection_tablerow_required'); } - - /** - * Removes an item at the specified position. - * This overrides the parent implementation by performing additional - * cleanup work when removing a table row. - * @param integer the index of the item to be removed. - * @return mixed the removed item. - */ - public function removeAt($index) - { - $item=parent::removeAt($index); - if($item instanceof TTableRow) - $this->_owner->getControls()->remove($item); - return $item; - } } ?> \ No newline at end of file diff --git a/framework/Web/UI/WebControls/TTableRow.php b/framework/Web/UI/WebControls/TTableRow.php index 6a3f196a..daf921ce 100644 --- a/framework/Web/UI/WebControls/TTableRow.php +++ b/framework/Web/UI/WebControls/TTableRow.php @@ -31,11 +31,6 @@ Prado::using('System.Web.UI.WebControls.TTableHeaderCell'); */ class TTableRow extends TWebControl { - /** - * @var TTableCellCollection cell collection - */ - private $_cells=null; - /** * @return string tag name for the table */ @@ -66,14 +61,22 @@ class TTableRow extends TWebControl return new TTableItemStyle; } + /** + * Creates a control collection object that is to be used to hold child controls + * @return TTableCellCollection control collection + * @see getControls + */ + protected function createControlCollection() + { + return new TTableCellCollection($this); + } + /** * @return TTableCellCollection list of {@link TTableCell} controls */ public function getCells() { - if(!$this->_cells) - $this->_cells=new TTableCellCollection($this); - return $this->_cells; + return $this->getControls(); } /** @@ -124,10 +127,10 @@ class TTableRow extends TWebControl */ public function renderContents($writer) { - if($this->_cells) + if($this->getHasControls()) { $writer->writeLine(); - foreach($this->_cells as $cell) + foreach($this->getControls() as $cell) { $cell->renderControl($writer); $writer->writeLine(); @@ -136,8 +139,6 @@ class TTableRow extends TWebControl } } - - /** * TTableCellCollection class. * @@ -148,23 +149,8 @@ class TTableRow extends TWebControl * @package System.Web.UI.WebControls * @since 3.0 */ -class TTableCellCollection extends TList +class TTableCellCollection extends TControlCollection { - /** - * @var mixed cell collection owner - */ - private $_owner=null; - - /** - * Constructor. - * @param mixed cell collection owner - */ - public function __construct($owner=null) - { - $this->_owner=$owner; - } - - /** * Inserts an item at the specified position. * This overrides the parent implementation by performing additional @@ -176,28 +162,10 @@ class TTableCellCollection extends TList public function insertAt($index,$item) { if($item instanceof TTableCell) - { parent::insertAt($index,$item); - if($this->_owner) - $this->_owner->getControls()->insertAt($index,$item); - } else throw new TInvalidDataTypeException('tablecellcollection_tablecell_required'); } - - /** - * Removes an item at the specified position. - * This overrides the parent implementation by performing additional - * cleanup work when removing a table cell. - * @param integer the index of the item to be removed. - * @return mixed the removed item. - */ - public function removeAt($index) - { - $item=parent::removeAt($index); - if($item instanceof TTableCell) - $this->_owner->getControls()->remove($item); - return $item; - } } + ?> \ No newline at end of file diff --git a/framework/Web/UI/WebControls/TWizard.php b/framework/Web/UI/WebControls/TWizard.php index 20e27f2b..2d2815ba 100644 --- a/framework/Web/UI/WebControls/TWizard.php +++ b/framework/Web/UI/WebControls/TWizard.php @@ -597,6 +597,54 @@ class TWizard extends TWebControl implements INamingContainer $this->setViewState('UseDefaultLayout',TPropertyValue::ensureBoolean($value),true); } + /** + * @return TPanel container of the wizard header + */ + public function getHeader() + { + return $this->_header; + } + + /** + * @return TPanel container of the wizard step content + */ + public function getStepContent() + { + return $this->_stepContent; + } + + /** + * @return TPanel container of the wizard side bar + */ + public function getSideBar() + { + return $this->_sideBar; + } + + /** + * @var TWizardNavigationContainer container of the start navigation + */ + public function getStartNavigation() + { + return $this->_startNavigation; + } + + /** + * @var TWizardNavigationContainer container of the step navigation + */ + public function getStepNavigation() + { + return $this->_stepNavigation; + } + + /** + * @var TWizardNavigationContainer container of the finish navigation + */ + public function getFinishNavigation() + { + return $this->_finishNavigation; + } + /** * Raises OnActiveStepChanged event. * This event is raised when the current visible step is changed in the @@ -845,8 +893,13 @@ class TWizard extends TWebControl implements INamingContainer $activeStep=$this->getActiveStep(); $activeStepIndex=$this->getActiveStepIndex(); - if(!$this->_navigation || $activeStepIndex<0 || $activeStepIndex>=$wizardSteps->getCount()) + if(!$this->_navigation) + return; + else if($activeStepIndex<0 || $activeStepIndex>=$wizardSteps->getCount()) + { + $this->_navigation->setVisible(false); return; + } // set visibility of different types of navigation panel $showStandard=true; @@ -1135,7 +1188,8 @@ class TWizard extends TWebControl implements INamingContainer $this->_stepContent=new TPanel; $this->_stepContent->getControls()->add($multiView); $this->getControls()->add($this->_stepContent); - $multiView->setActiveViewIndex(0); + if($multiView->getViews()->getCount()) + $multiView->setActiveViewIndex(0); } /** -- cgit v1.2.3