summaryrefslogtreecommitdiff
path: root/framework
diff options
context:
space:
mode:
Diffstat (limited to 'framework')
-rw-r--r--framework/Web/UI/WebControls/TWebControlDecorator.php92
1 files changed, 71 insertions, 21 deletions
diff --git a/framework/Web/UI/WebControls/TWebControlDecorator.php b/framework/Web/UI/WebControls/TWebControlDecorator.php
index 6e8b2200..1db35df8 100644
--- a/framework/Web/UI/WebControls/TWebControlDecorator.php
+++ b/framework/Web/UI/WebControls/TWebControlDecorator.php
@@ -1,4 +1,4 @@
-<?
+<?php
/**
* TWebControlDecorator class file.
*
@@ -46,6 +46,8 @@
* * TWebControl CloseTag Rendered
* * PostTagText
* * PostTagTemplate
+ *
+ * By setting the
*
* To move controls around please see the {@link TMigrate} control. You may use {@link TMigrate}
* in your Decorator templates to move controls in your MasterTemplate around using your theme
@@ -65,11 +67,22 @@ class TWebControlDecorator extends TComponent {
private $_internalonly;
/**
+ * @var boolean tells if the decoration uses state in its templates. If there are no templates
+ * in the instance of the decoration this variable is unused.
+ */
+ private $_usestate = false;
+
+ /**
* @var TWebControl the control to decorate
*/
private $_control;
/**
+ * @var TComponent or TControl to tell the decorator where to place the outer controls
+ */
+ private $_outercontrol;
+
+ /**
* @var boolean This tells if the Templates have been
*/
private $_addedTemplateDecoration=false;
@@ -125,6 +138,23 @@ class TWebControlDecorator extends TComponent {
}
/**
+ * @return boolean if the templates in this decoration need state. This defaults to false
+ */
+ public function getUseState()
+ {
+ return $this->_usestate;
+ }
+
+ /**
+ * @param boolean $value true to tell the decoration that the templates need state and should be
+ * placed in a control step before the state is saved.
+ */
+ public function setUseState($value)
+ {
+ $this->_usestate = TPropertyValue::ensureBoolean($value);
+ }
+
+ /**
* @return string gets the text before the open tag in the TWebControl
*/
public function getPreTagText() {
@@ -257,49 +287,69 @@ class TWebControlDecorator extends TComponent {
* This call attaches the ensureTemplateDecoration to the TPage onSaveStateComplete so
* these controls don't have page states. This is as close to not influencing the page as possible.
*/
- public function instantiate() {
-
- $this->_addedTemplateDecoration = false;
-
+ public function instantiate($outercontrol = null) {
if($this->getPreTagTemplate() || $this->getPreContentsTemplate() ||
- $this->getPostContentsTemplate() || $this->getPostTagTemplate())
- $control->getPage()->onSaveStateComplete[] = array($this, 'ensureTemplateDecoration');
- // OnPreRenderComplete onSaveStateComplete
+ $this->getPostContentsTemplate() || $this->getPostTagTemplate()) {
+
+ $this->_outercontrol = $outercontrol;
+ if($this->getUseState())
+ $this->ensureTemplateDecoration();
+ else
+ $this->_control->getPage()->onSaveStateComplete[] = array($this, 'ensureTemplateDecoration');
+ }
}
/**
- * This method places the templates around the open and close tag
+ * This method places the templates around the open and close tag. This takes a parameter which is
+ * to specify the control to get the outer template decoration. If no outer control is specified
+ * @param TComponent this indicates the component or control to get the outer tag elements, just in case it's
+ * different than attached TWebControl. If none is provided, the outer templates default to the attached
+ * control
* @return boolean returns true if the template decorations have been added
*/
- public function ensureTemplateDecoration() {
+ public function ensureTemplateDecoration($sender=null, $param=null) {
+
$control = $this->_control;
- if($this->_addedTemplateDecoration || !$control->Parent) return $this->_addedTemplateDecoration;
+ $outercontrol = $this->_outercontrol;
+ if($outercontrol === null)
+ $outercontrol = $control;
+
+ if($this->_addedTemplateDecoration)
+ return $this->_addedTemplateDecoration;
$this->_addedTemplateDecoration = true;
- if($this->getPreTagTemplate()) {
- $pretag = Prado::createComponent('TCompositeControl');
- $this->getPreTagTemplate()->instantiateIn($pretag);
- $control->getParent()->getControls()->insertBefore($control, $pretag);
- }
-
- if($this->getPreContentsTemplate()) {
+ if($this->getPreContentsTemplate())
+ {
$precontents = Prado::createComponent('TCompositeControl');
$this->getPreContentsTemplate()->instantiateIn($precontents);
$control->getControls()->insertAt(0, $precontents);
}
- if($this->getPostContentsTemplate()) {
+ if($this->getPostContentsTemplate())
+ {
$postcontents = Prado::createComponent('TCompositeControl');
$this->getPostContentsTemplate()->instantiateIn($postcontents);
$control->getControls()->add($postcontents);
}
- if($this->getPostTagTemplate()) {
+ if(!$outercontrol->getParent())
+ return $this->_addedTemplateDecoration;
+
+
+ if($this->getPreTagTemplate())
+ {
+ $pretag = Prado::createComponent('TCompositeControl');
+ $this->getPreTagTemplate()->instantiateIn($pretag);
+ $outercontrol->getParent()->getControls()->insertBefore($outercontrol, $pretag);
+ }
+
+ if($this->getPostTagTemplate())
+ {
$posttag = Prado::createComponent('TCompositeControl');
$this->getPostTagTemplate()->instantiateIn($posttag);
- $control->getParent()->getControls()->insertAfter($control, $posttag);
+ $outercontrol->getParent()->getControls()->insertAfter($outercontrol, $posttag);
}
return true;
}