249 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			249 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * CWidget class file.
 | |
|  *
 | |
|  * @author Qiang Xue <qiang.xue@gmail.com>
 | |
|  * @link http://www.yiiframework.com/
 | |
|  * @copyright 2008-2013 Yii Software LLC
 | |
|  * @license http://www.yiiframework.com/license/
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * CWidget is the base class for widgets.
 | |
|  *
 | |
|  * A widget is a self-contained component that may generate presentation
 | |
|  * based on model data.  It can be viewed as a micro-controller that embeds
 | |
|  * into the controller-managed views.
 | |
|  *
 | |
|  * Compared with {@link CController controller}, a widget has neither actions nor filters.
 | |
|  *
 | |
|  * Usage is described at {@link CBaseController} and {@link CBaseController::widget}.
 | |
|  *
 | |
|  * @property CBaseController $owner Owner/creator of this widget. It could be either a widget or a controller.
 | |
|  * @property string $id Id of the widget.
 | |
|  * @property CController $controller The controller that this widget belongs to.
 | |
|  * @property string $viewPath The directory containing the view files for this widget.
 | |
|  *
 | |
|  * @author Qiang Xue <qiang.xue@gmail.com>
 | |
|  * @package system.web.widgets
 | |
|  * @since 1.0
 | |
|  */
 | |
| class CWidget extends CBaseController
 | |
| {
 | |
| 	/**
 | |
| 	 * @var string the prefix to the IDs of the {@link actions}.
 | |
| 	 * When a widget is declared an action provider in {@link CController::actions},
 | |
| 	 * a prefix can be specified to differentiate its action IDs from others.
 | |
| 	 * The same prefix should then also be used to configure this property
 | |
| 	 * when the widget is used in a view of the controller.
 | |
| 	 */
 | |
| 	public $actionPrefix;
 | |
| 	/**
 | |
| 	 * @var mixed the name of the skin to be used by this widget. Defaults to 'default'.
 | |
| 	 * If this is set as false, no skin will be applied to this widget.
 | |
| 	 * @see CWidgetFactory
 | |
| 	 * @since 1.1
 | |
| 	 */
 | |
| 	public $skin='default';
 | |
| 
 | |
| 	/**
 | |
| 	 * @var array view paths for different types of widgets
 | |
| 	 */
 | |
| 	private static $_viewPaths;
 | |
| 	/**
 | |
| 	 * @var integer the counter for generating implicit IDs.
 | |
| 	 */
 | |
| 	private static $_counter=0;
 | |
| 	/**
 | |
| 	 * @var string id of the widget.
 | |
| 	 */
 | |
| 	private $_id;
 | |
| 	/**
 | |
| 	 * @var CBaseController owner/creator of this widget. It could be either a widget or a controller.
 | |
| 	 */
 | |
| 	private $_owner;
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns a list of actions that are used by this widget.
 | |
| 	 * The structure of this method's return value is similar to
 | |
| 	 * that returned by {@link CController::actions}.
 | |
| 	 *
 | |
| 	 * When a widget uses several actions, you can declare these actions using
 | |
| 	 * this method. The widget will then become an action provider, and the actions
 | |
| 	 * can be easily imported into a controller.
 | |
| 	 *
 | |
| 	 * Note, when creating URLs referring to the actions listed in this method,
 | |
| 	 * make sure the action IDs are prefixed with {@link actionPrefix}.
 | |
| 	 *
 | |
| 	 * @return array
 | |
| 	 *
 | |
| 	 * @see actionPrefix
 | |
| 	 * @see CController::actions
 | |
| 	 */
 | |
| 	public static function actions()
 | |
| 	{
 | |
| 		return array();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Constructor.
 | |
| 	 * @param CBaseController $owner owner/creator of this widget. It could be either a widget or a controller.
 | |
| 	 */
 | |
| 	public function __construct($owner=null)
 | |
| 	{
 | |
| 		$this->_owner=$owner===null?Yii::app()->getController():$owner;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns the owner/creator of this widget.
 | |
| 	 * @return CBaseController owner/creator of this widget. It could be either a widget or a controller.
 | |
| 	 */
 | |
| 	public function getOwner()
 | |
| 	{
 | |
| 		return $this->_owner;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns the ID of the widget or generates a new one if requested.
 | |
| 	 * @param boolean $autoGenerate whether to generate an ID if it is not set previously
 | |
| 	 * @return string id of the widget.
 | |
| 	 */
 | |
| 	public function getId($autoGenerate=true)
 | |
| 	{
 | |
| 		if($this->_id!==null)
 | |
| 			return $this->_id;
 | |
| 		elseif($autoGenerate)
 | |
| 			return $this->_id='yw'.self::$_counter++;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Sets the ID of the widget.
 | |
| 	 * @param string $value id of the widget.
 | |
| 	 */
 | |
| 	public function setId($value)
 | |
| 	{
 | |
| 		$this->_id=$value;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns the controller that this widget belongs to.
 | |
| 	 * @return CController the controller that this widget belongs to.
 | |
| 	 */
 | |
| 	public function getController()
 | |
| 	{
 | |
| 		if($this->_owner instanceof CController)
 | |
| 			return $this->_owner;
 | |
| 		else
 | |
| 			return Yii::app()->getController();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Initializes the widget.
 | |
| 	 * This method is called by {@link CBaseController::createWidget}
 | |
| 	 * and {@link CBaseController::beginWidget} after the widget's
 | |
| 	 * properties have been initialized.
 | |
| 	 */
 | |
| 	public function init()
 | |
| 	{
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Executes the widget.
 | |
| 	 * This method is called by {@link CBaseController::endWidget}.
 | |
| 	 */
 | |
| 	public function run()
 | |
| 	{
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns the directory containing the view files for this widget.
 | |
| 	 * The default implementation returns the 'views' subdirectory of the directory containing the widget class file.
 | |
| 	 * If $checkTheme is set true, the directory "ThemeID/views/ClassName" will be returned when it exists.
 | |
| 	 * @param boolean $checkTheme whether to check if the theme contains a view path for the widget.
 | |
| 	 * @return string the directory containing the view files for this widget.
 | |
| 	 */
 | |
| 	public function getViewPath($checkTheme=false)
 | |
| 	{
 | |
| 		$className=get_class($this);
 | |
| 		$scope=$checkTheme?'theme':'local';
 | |
| 		if(isset(self::$_viewPaths[$className][$scope]))
 | |
| 			return self::$_viewPaths[$className][$scope];
 | |
| 		else
 | |
| 		{
 | |
| 			if($checkTheme && ($theme=Yii::app()->getTheme())!==null)
 | |
| 			{
 | |
| 				$path=$theme->getViewPath().DIRECTORY_SEPARATOR;
 | |
| 				if(strpos($className,'\\')!==false) // namespaced class
 | |
| 					$path.=str_replace('\\','_',ltrim($className,'\\'));
 | |
| 				else
 | |
| 					$path.=$className;
 | |
| 				if(is_dir($path))
 | |
| 					return self::$_viewPaths[$className]['theme']=$path;
 | |
| 			}
 | |
| 
 | |
| 			$class=new ReflectionClass($className);
 | |
| 			return self::$_viewPaths[$className]['local']=dirname($class->getFileName()).DIRECTORY_SEPARATOR.'views';
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Looks for the view script file according to the view name.
 | |
| 	 * This method will look for the view under the widget's {@link getViewPath viewPath}.
 | |
| 	 * The view script file is named as "ViewName.php". A localized view file
 | |
| 	 * may be returned if internationalization is needed. See {@link CApplication::findLocalizedFile}
 | |
| 	 * for more details.
 | |
| 	 * The view name can also refer to a path alias if it contains dot characters.
 | |
| 	 * @param string $viewName name of the view (without file extension)
 | |
| 	 * @return string the view file path. False if the view file does not exist
 | |
| 	 * @see CApplication::findLocalizedFile
 | |
| 	 */
 | |
| 	public function getViewFile($viewName)
 | |
| 	{
 | |
| 		if(($renderer=Yii::app()->getViewRenderer())!==null)
 | |
| 			$extension=$renderer->fileExtension;
 | |
| 		else
 | |
| 			$extension='.php';
 | |
| 		if(strpos($viewName,'.')) // a path alias
 | |
| 			$viewFile=Yii::getPathOfAlias($viewName);
 | |
| 		else
 | |
| 		{
 | |
| 			$viewFile=$this->getViewPath(true).DIRECTORY_SEPARATOR.$viewName;
 | |
| 			if(is_file($viewFile.$extension))
 | |
| 				return Yii::app()->findLocalizedFile($viewFile.$extension);
 | |
| 			elseif($extension!=='.php' && is_file($viewFile.'.php'))
 | |
| 				return Yii::app()->findLocalizedFile($viewFile.'.php');
 | |
| 			$viewFile=$this->getViewPath(false).DIRECTORY_SEPARATOR.$viewName;
 | |
| 		}
 | |
| 
 | |
| 		if(is_file($viewFile.$extension))
 | |
| 			return Yii::app()->findLocalizedFile($viewFile.$extension);
 | |
| 		elseif($extension!=='.php' && is_file($viewFile.'.php'))
 | |
| 			return Yii::app()->findLocalizedFile($viewFile.'.php');
 | |
| 		else
 | |
| 			return false;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Renders a view.
 | |
| 	 *
 | |
| 	 * The named view refers to a PHP script (resolved via {@link getViewFile})
 | |
| 	 * that is included by this method. If $data is an associative array,
 | |
| 	 * it will be extracted as PHP variables and made available to the script.
 | |
| 	 *
 | |
| 	 * @param string $view name of the view to be rendered. See {@link getViewFile} for details
 | |
| 	 * about how the view script is resolved.
 | |
| 	 * @param array $data data to be extracted into PHP variables and made available to the view script
 | |
| 	 * @param boolean $return whether the rendering result should be returned instead of being displayed to end users
 | |
| 	 * @return string the rendering result. Null if the rendering result is not required.
 | |
| 	 * @throws CException if the view does not exist
 | |
| 	 * @see getViewFile
 | |
| 	 */
 | |
| 	public function render($view,$data=null,$return=false)
 | |
| 	{
 | |
| 		if(($viewFile=$this->getViewFile($view))!==false)
 | |
| 			return $this->renderFile($viewFile,$data,$return);
 | |
| 		else
 | |
| 			throw new CException(Yii::t('yii','{widget} cannot find the view "{view}".',
 | |
| 				array('{widget}'=>get_class($this), '{view}'=>$view)));
 | |
| 	}
 | |
| } |