我的应用程序中有一个模块,在其默认控制器下,它有一个名为renderPageLinks
的函数,它返回一个供小部件使用的数组。
小部件genMenu
从/themes/jui/views/layouts/main.php调用(它生成一个菜单)我需要将数据从renderPageLinks传递给小部件作为值:< / p>
$this->widget('pageLinkGen', array('pages' => renderPageLinks()));
问题是Yii找不到函数renderPage Links。
我尝试了以下各种不同的组合,以利用..
$this->widget('pageLinkGen', array('pages' => 'application.module.QuickDial.default.renderPageLinks()'));
有什么建议吗?
P.S。我试图将renderPageLinks()
移动到控制器pageLinkGen,但是Yii找不到renderPageLinks()
中使用的模型。
答案 0 :(得分:4)
假设您查询的模型位于您的模块中,则有3种解决方法。
您可以在 QuickDialModule.php 文件中定义您的renderPageLinks()
函数,即在 QuickDialModule类中。然后你可以像这样使用它:
Yii::app()->getModule('QuickDial')->renderPageLinks();
您必须在QuickDialModule类中编写此函数:
Class QuickDialModule extends CWebModule{
public function init(){
// ... code ...
}
// ... code ... other functions
public function renderPageLinks(){
// ... do whatever you were doing inside the function ...
}
}
修改强>:
仅当应用程序收到来自用户的url请求时,控制器才由yii实例化。
通过声明您的功能static
,您还可以解决另一个问题。但是你必须将具有该功能类的php文件导入main.php config 文件中的yii自动加载数组。因此,将defaultcontroller的renderPageLinks()函数更改为static:
public static function renderPageLinks(){
// do whatever you were doing
}
通过修改protected / config /文件夹中的主要配置 main.php 来自动加载控制器:
// autoloading model and component classes
'import'=>array(
'application.models.*',
'application.components.*',
'application.modules.quickdial.controllers.*' // this line is added
),
然后直接调用静态函数:
$this->widget('pageLinkGen', array('pages' => DefaultController::renderPageLinks()));
当然要使用这个静态方法,你必须只有一个带有控制器DefaultController的模块,或者你不能导入其他模块的控制器,在任何情况下都可能出现名称冲突。
如果您将该功能移动到主模块中的控制器(即您提到的pageLinkGen控制器),那么您必须将所需的模型导入主模块的config main.php(以便yii可以找到它,自动加载导入数组添加:
// autoloading model and component classes
'import'=>array(
'application.models.*',
'application.components.*',
'application.modules.quickdial.models.*' // this line is added
),
以便您的控制器可以找到模型。
答案 1 :(得分:1)
如果控制器具有renderPageLinks
功能,并且假设$this
是对正确控制器的引用,请尝试通过直接引用控制器来调用该函数:
$this->widget('pageLinkGen', array('pages' => $this->renderPageLinks()));
据我所知,PHP不支持隐式$this
答案 2 :(得分:0)
bool.dev的建议很棒,但在我的实例中仍然没有用,我相信这是因为我的结论是无组织的。我首先将模型移动到/protected/models/
,然后创建了一个包含页面呈现和调用的CPortlet
对象。我的基础是blog demonstration中的文档。我没有在这个实例中拆分控制器的视图,因为目前它只调用Bootstrap BootNavbar小部件。未来的主题可能会使用单独的视图页面。
再次感谢您的帮助。
答案 3 :(得分:0)
我认为你应该先调用YourModule :: renderPageLinks()方法,然后传递返回的结果:
$pages = YourModule::renderPageLinks();
$this->widget('pageLinkGen', array('pages' => $pages));