[ Index ]
 

Code source de PRADO 3.0.6

Accédez au Source d'autres logiciels libresSoutenez Angelica Josefina !

title

Body

[fermer]

/framework/Web/UI/ -> TTemplateControl.php (source)

   1  <?php
   2  /**
   3   * TTemplateControl class file.
   4   *
   5   * @author Qiang Xue <qiang.xue@gmail.com>
   6   * @link http://www.pradosoft.com/
   7   * @copyright Copyright &copy; 2005 PradoSoft
   8   * @license http://www.pradosoft.com/license/
   9   * @version $Id: TTemplateControl.php 1397 2006-09-07 07:55:53Z wei $
  10   * @package System.Web.UI
  11   */
  12  
  13  /**
  14   * Includes TCompositeControl class
  15   */
  16  Prado::using('System.Web.UI.TCompositeControl');
  17  
  18  /**
  19   * TTemplateControl class.
  20   * TTemplateControl is the base class for all controls that use templates.
  21   * By default, a control template is assumed to be in a file under the same
  22   * directory with the control class file. They have the same file name and
  23   * different extension name. For template file, the extension name is ".tpl".
  24   *
  25   * @author Qiang Xue <qiang.xue@gmail.com>
  26   * @version $Id: TTemplateControl.php 1397 2006-09-07 07:55:53Z wei $
  27   * @package System.Web.UI
  28   * @since 3.0
  29   */
  30  class TTemplateControl extends TCompositeControl
  31  {
  32      /**
  33       * template file extension.
  34       */
  35      const EXT_TEMPLATE='.tpl';
  36  
  37      /**
  38       * @var ITemplate the parsed template structure shared by the same control class
  39       */
  40      private static $_template=array();
  41      /**
  42       * @var ITemplate the parsed template structure specific for this control instance
  43       */
  44      private $_localTemplate=null;
  45      /**
  46       * @var TTemplateControl the master control if any
  47       */
  48      private $_master=null;
  49      /**
  50       * @var string master control class name
  51       */
  52      private $_masterClass='';
  53      /**
  54       * @var array list of TContent controls
  55       */
  56      private $_contents=array();
  57      /**
  58       * @var array list of TContentPlaceHolder controls
  59       */
  60      private $_placeholders=array();
  61  
  62      /**
  63       * Returns the template object associated with this control object.
  64       * @return ITemplate|null the parsed template, null if none
  65       */
  66  	public function getTemplate()
  67      {
  68          if($this->_localTemplate===null)
  69          {
  70              $class=get_class($this);
  71              if(!isset(self::$_template[$class]))
  72                  self::$_template[$class]=$this->loadTemplate();
  73              return self::$_template[$class];
  74          }
  75          else
  76              return $this->_localTemplate;
  77      }
  78  
  79      /**
  80       * Sets the parsed template.
  81       * Note, the template will be applied to the whole control class.
  82       * This method should only be used by framework and control developers.
  83       * @param ITemplate the parsed template
  84       */
  85  	public function setTemplate($value)
  86      {
  87          $this->_localTemplate=$value;
  88      }
  89  
  90      /**
  91       * @return boolean whether this control is a source template control.
  92       * A source template control loads its template from external storage,
  93       * such as file, db, rather than from within another template.
  94       */
  95  	public function getIsSourceTemplateControl()
  96      {
  97          if(($template=$this->getTemplate())!==null)
  98              return $template->getIsSourceTemplate();
  99          else
 100              return false;
 101      }
 102  
 103      /**
 104       * @return string the directory containing the template. Empty if no template available.
 105       */
 106  	public function getTemplateDirectory()
 107      {
 108          if(($template=$this->getTemplate())!==null)
 109              return $template->getContextPath();
 110          else
 111              return '';
 112      }
 113  
 114      /**
 115       * Loads the template associated with this control class.
 116       * @return ITemplate the parsed template structure
 117       */
 118  	protected function loadTemplate()
 119      {
 120          Prado::trace("Loading template ".get_class($this),'System.Web.UI.TTemplateControl');
 121          $template=$this->getService()->getTemplateManager()->getTemplateByClassName(get_class($this));
 122          return $template;
 123      }
 124  
 125      /**
 126       * Creates child controls.
 127       * This method is overriden to load and instantiate control template.
 128       * This method should only be used by framework and control developers.
 129       */
 130  	public function createChildControls()
 131      {
 132          if($tpl=$this->getTemplate())
 133          {
 134              foreach($tpl->getDirective() as $name=>$value)
 135              {
 136                  if(is_string($value))
 137                      $this->setSubProperty($name,$value);
 138                  else
 139                      throw new TConfigurationException('templatecontrol_directive_invalid',get_class($this),$name);
 140              }
 141              $tpl->instantiateIn($this);
 142          }
 143      }
 144  
 145      /**
 146       * Registers a content control.
 147       * @param string ID of the content
 148       * @param TContent
 149       */
 150  	public function registerContent($id,TContent $object)
 151      {
 152          if(isset($this->_contents[$id]))
 153              throw new TConfigurationException('templatecontrol_contentid_duplicated',$id);
 154          else
 155              $this->_contents[$id]=$object;
 156      }
 157  
 158      /**
 159       * Registers a content placeholder to this template control.
 160       * This method should only be used by framework and control developers.
 161       * @param string placeholder ID
 162       * @param TContentPlaceHolder placeholder control
 163       */
 164  	public function registerContentPlaceHolder($id,TContentPlaceHolder $object)
 165      {
 166          if(isset($this->_placeholders[$id]))
 167              throw new TConfigurationException('templatecontrol_placeholderid_duplicated',$id);
 168          else
 169              $this->_placeholders[$id]=$object;
 170      }
 171  
 172      /**
 173       * @return string master class name (in namespace form)
 174       */
 175  	public function getMasterClass()
 176      {
 177          return $this->_masterClass;
 178      }
 179  
 180      /**
 181       * @param string  master control class name (in namespace form)
 182       */
 183  	public function setMasterClass($value)
 184      {
 185          $this->_masterClass=$value;
 186      }
 187  
 188      /**
 189       * @return TTemplateControl|null master control associated with this control, null if none
 190       */
 191  	public function getMaster()
 192      {
 193          return $this->_master;
 194      }
 195  
 196      /**
 197       * Injects all content controls (and their children) to the corresponding content placeholders.
 198       * This method should only be used by framework and control developers.
 199       * @param string ID of the content control
 200       * @param TContent the content to be injected
 201       */
 202  	public function injectContent($id,$content)
 203      {
 204          if(isset($this->_placeholders[$id]))
 205          {
 206              $placeholder=$this->_placeholders[$id];
 207              $controls=$placeholder->getParent()->getControls();
 208              $loc=$controls->remove($placeholder);
 209              $controls->insertAt($loc,$content);
 210          }
 211          else
 212              throw new TConfigurationException('templatecontrol_placeholder_inexistent',$id);
 213      }
 214  
 215      /**
 216       * Performs the OnInit step for the control and all its child controls.
 217       * This method overrides the parent implementation
 218       * by ensuring child controls are created first,
 219       * and if master class is set, master will be applied.
 220       * Only framework developers should use this method.
 221       * @param TControl the naming container control
 222       */
 223  	protected function initRecursive($namingContainer=null)
 224      {
 225          $this->ensureChildControls();
 226          if($this->_masterClass!=='')
 227          {
 228              $master=Prado::createComponent($this->_masterClass);
 229              if(!($master instanceof TTemplateControl))
 230                  throw new TInvalidDataValueException('templatecontrol_mastercontrol_invalid');
 231              $this->_master=$master;
 232              $this->getControls()->clear();
 233              $this->getControls()->add($master);
 234              $master->ensureChildControls();
 235              foreach($this->_contents as $id=>$content)
 236                  $master->injectContent($id,$content);
 237          }
 238          else if(!empty($this->_contents))
 239              throw new TConfigurationException('templatecontrol_mastercontrol_required',get_class($this));
 240          parent::initRecursive($namingContainer);
 241      }
 242  }
 243  
 244  ?>


Généré le : Sun Feb 25 21:07:04 2007 par Balluche grâce à PHPXref 0.7