123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249 |
- <?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)));
- }
- }
|