* @since 2.0 */ class Widget extends Component { /** * @var View the view object that is used to create this widget. * This property is automatically set by [[View::createWidget()]]. * This property is required by [[render()]] and [[renderFile()]]. */ public $view; /** * @var string id of the widget. */ private $_id; /** * @var integer a counter used to generate IDs for widgets. */ private static $_counter = 0; /** * Returns the ID of the widget. * @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 ($autoGenerate && $this->_id === null) { $this->_id = 'w' . self::$_counter++; } return $this->_id; } /** * Sets the ID of the widget. * @param string $value id of the widget. */ public function setId($value) { $this->_id = $value; } /** * Executes the widget. */ public function run() { } /** * Renders a view. * The view to be rendered can be specified in one of the following formats: * * - path alias (e.g. "@app/views/site/index"); * - absolute path within application (e.g. "//site/index"): the view name starts with double slashes. * The actual view file will be looked for under the [[Application::viewPath|view path]] of the application. * - absolute path within module (e.g. "/site/index"): the view name starts with a single slash. * The actual view file will be looked for under the [[Module::viewPath|view path]] of the currently * active module. * - relative path (e.g. "index"): the actual view file will be looked for under [[viewPath]]. * * If the view name does not contain a file extension, it will use the default one `.php`. * @param string $view the view name. Please refer to [[findViewFile()]] on how to specify a view name. * @param array $params the parameters (name-value pairs) that should be made available in the view. * @return string the rendering result. * @throws InvalidParamException if the view file does not exist. */ public function render($view, $params = array()) { return $this->view->render($view, $params, $this); } /** * Renders a view file. * @param string $file the view file to be rendered. This can be either a file path or a path alias. * @param array $params the parameters (name-value pairs) that should be made available in the view. * @return string the rendering result. * @throws InvalidParamException if the view file does not exist. */ public function renderFile($file, $params = array()) { return $this->view->renderFile($file, $params, $this); } /** * Returns the directory containing the view files for this widget. * The default implementation returns the 'views' subdirectory under the directory containing the widget class file. * @return string the directory containing the view files for this widget. */ public function getViewPath() { $className = get_class($this); $class = new \ReflectionClass($className); return dirname($class->getFileName()) . DIRECTORY_SEPARATOR . 'views'; } /** * Finds the view file based on the given view name. * @param string $view the view name or the path alias of the view file. Please refer to [[render()]] * on how to specify this parameter. * @return string the view file path. Note that the file may not exist. */ protected function findViewFile($view) { if (strncmp($view, '@', 1) === 0) { // e.g. "@app/views/main" $file = Yii::getAlias($view); } elseif (strncmp($view, '//', 2) === 0) { // e.g. "//layouts/main" $file = Yii::$app->getViewPath() . DIRECTORY_SEPARATOR . ltrim($view, '/'); } elseif (strncmp($view, '/', 1) === 0 && Yii::$app->controller !== null) { // e.g. "/site/index" $file = Yii::$app->controller->module->getViewPath() . DIRECTORY_SEPARATOR . ltrim($view, '/'); } else { $file = $this->getViewPath() . DIRECTORY_SEPARATOR . ltrim($view, '/'); } return FileHelper::getExtension($file) === '' ? $file . '.php' : $file; } }