1

我的应用程序中有一个模块,在其默认控制器下,它有一个调用函数,该函数renderPageLinks返回一个数组供小部件使用。

从 /themes/jui/views/layouts/main.php 调用小部件genMenu(它会生成一个菜单)我需要将 renderPageLinks 中的数据作为值传递给小部件:

$this->widget('pageLinkGen', array('pages' => renderPageLinks()));

问题是 Yii 找不到函数 renderPage Links。

我尝试了以下的不同组合以利用..

$this->widget('pageLinkGen', array('pages' => 'application.module.QuickDial.default.renderPageLinks()'));

有什么建议么?

ps 我试图移动renderPageLinks()到控制器 pageLinkGen 但 Yii 找不到renderPageLinks().

4

4 回答 4

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配置文件中的 yii 自动加载数组中。因此,将您的 defaultcontroller renderPageLinks() 函数更改为静态:

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 控制器),那么你必须将你需要的模型导入到主模块的配置 main.php 中(以便 yii 可以找到它) , 自动加载导入数组添加:

  // autoloading model and component classes
'import'=>array(
    'application.models.*',
    'application.components.*',
    'application.modules.quickdial.models.*' // this line is added
),

以便您的控制器可以找到模型。

于 2012-03-09T06:47:08.777 回答
1

如果控制器具有该renderPageLinks函数,并且假设$this是对正确控制器的引用,请尝试通过直接引用控制器来调用该函数:

$this->widget('pageLinkGen', array('pages' => $this->renderPageLinks()));

据我所知 PHP 不支持隐式$this

于 2012-03-07T18:47:17.747 回答
0

bool.dev 的建议很棒,但在我的例子中仍然不起作用,我相信这是由于我的组织混乱。我首先将模型移动到/protected/models/然后创建了一个CPortlet包含页面渲染和调用的对象。我基于在博客演示中找到的文档。在这个实例中,我没有从控制器中拆分视图,因为目前它只调用 Bootstrap BootNavbar 小部件。未来的主题可能会使用单独的视图页面。

再次感谢您的所有帮助。

于 2012-03-09T15:49:20.990 回答
0

我认为您应该首先调用 YourModule::renderPageLinks() 方法,然后传递返回的结果:

$pages = YourModule::renderPageLinks();
$this->widget('pageLinkGen', array('pages' => $pages));
于 2012-07-03T15:39:01.263 回答