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”的方法或闭包