Php 哎。从模块控制器访问函数
我的应用程序中有一个模块,在其默认控制器下有一个名为Php 哎。从模块控制器访问函数,php,yii,yii-components,Php,Yii,Yii Components,我的应用程序中有一个模块,在其默认控制器下有一个名为renderPageLinks的函数,它返回一个数组供小部件使用 从/themes/jui/views/layouts/main.php调用小部件genMenu(它生成一个菜单)。我需要将renderpage链接中的数据作为值传递给小部件: $this->widget('pageLinkGen', array('pages' => renderPageLinks())); 问题是我找不到函数renderPage链接 我尝试了以下几
renderPageLinks
的函数,它返回一个数组供小部件使用
从/themes/jui/views/layouts/main.php调用小部件genMenu
(它生成一个菜单)。我需要将renderpage链接中的数据作为值传递给小部件:
$this->widget('pageLinkGen', array('pages' => renderPageLinks()));
问题是我找不到函数renderPage链接
我尝试了以下几种不同的组合,但都没有效果
$this->widget('pageLinkGen', array('pages' => 'application.module.QuickDial.default.renderPageLinks()'));
有什么建议吗
p、 我试图将
renderPageLinks()
移动到控制器pageLinkGen,但是如果控制器具有renderPageLinks
功能,并且假设$this
是对正确控制器的引用,我找不到renderPageLinks()中使用的模型,尝试通过直接引用控制器来调用函数:
$this->widget('pageLinkGen', array('pages' => $this->renderPageLinks()));
$this->widget('pageLinkGen', array('pages' => DefaultController::renderPageLinks()));
据我所知,如果控制器具有renderPageLinks
函数,并且假设$this
是对正确控制器的引用,则PHP不支持隐式$this,请尝试通过直接引用控制器来调用该函数:
$this->widget('pageLinkGen', array('pages' => $this->renderPageLinks()));
$this->widget('pageLinkGen', array('pages' => DefaultController::renderPageLinks()));
据我所知,PHP不支持隐式$this
假设您查询的模型在您的模块中,有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.phpconfig文件中的yii自动加载数组。因此,将defaultcontroller renderPageLinks()函数更改为静态:
public static function renderPageLinks(){
// do whatever you were doing
}
通过修改protected/config/folder中的main configuration 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' => $this->renderPageLinks()));
$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
),
以便您的控制器可以找到模型。假设您要查询的模型在您的模块中,有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.phpconfig文件中的yii自动加载数组。因此,将defaultcontroller renderPageLinks()函数更改为静态:
public static function renderPageLinks(){
// do whatever you were doing
}
通过修改protected/config/folder中的main configuration 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' => $this->renderPageLinks()));
$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
),
这样你的控制器就可以找到模型了。bool.dev的建议很好,但在我的例子中仍然不起作用,我相信这是因为我这边的组织混乱。我首先将模型移动到/protected/models/
,然后创建了一个CPortlet
对象,其中包括页面呈现和调用。我是基于在中找到的文档。在这个实例中,我没有将视图从控制器中拆分,因为它目前只调用引导引导BootNavbar小部件。未来的主题可能会使用单独的查看页面
再次感谢您的帮助。bool.dev的建议很好,但在我的例子中仍然不起作用,我相信这是因为我这边的组织混乱。我首先将模型移动到/protected/models/
,然后创建了一个CPortlet
对象,其中包括页面呈现和调用。我是基于在中找到的文档。在这个实例中,我没有将视图从控制器中拆分,因为它目前只调用引导引导BootNavbar小部件。未来的主题可能会使用单独的查看页面
再次感谢您的帮助。我认为您应该首先调用您的Module::renderPageLinks()方法,然后传递返回的结果:
$pages = YourModule::renderPageLinks();
$this->widget('pageLinkGen', array('pages' => $pages));
我认为您应该首先调用您的module::renderPageLinks()方法,然后只传递返回的结果:
$pages = YourModule::renderPageLinks();
$this->widget('pageLinkGen', array('pages' => $pages));
根据另一个网站的建议,我尝试了$this->widget('pageLinkGen',array('pages'=>Yii::app()->getModule('QuickDial')->renderPageLinks())代码>没有任何结果。我收到以下错误:QuickDialModule及其行为没有名为“renderPageLinks”的方法或闭包