警予。从模块控制器访问功能

时间:2012-03-06 18:55:45

标签: php yii yii-components

我的应用程序中有一个模块,在其默认控制器下,它有一个名为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()中使用的模型。

4 个答案:

答案 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));