从/protected/config/main.php访问模型

从/protected/config/main.php访问模型,php,yii,Php,Yii,我想更改/protected/views/layouts/main.php中的顶部菜单,以便将其存储在数据库中。我认为应该这样做:在/protected/config/main.php中,添加一个数组,从该数组返回一个菜单项数组: return array( 'basePath' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '..', 'name' => 'My Web Application', 'preload

我想更改/protected/views/layouts/main.php中的顶部菜单,以便将其存储在数据库中。我认为应该这样做:在/protected/config/main.php中,添加一个数组,从该数组返回一个菜单项数组:

return array(
    'basePath' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '..',
    'name' => 'My Web Application',
    'preload' => array('log'),
    'menu' => array(
        array('label' => 'Home', 'url' => array('/site/index')),
        array('label' => 'About', 'url' => array('/site/page')),
        array('label' => 'Contact', 'url' => array('/site/contact'))
    ),
但菜单项应该像菜单模型类的对象一样从数据库中获取。我感兴趣的问题是如何从/protected/config/main.php访问模型。如果我在/protected/config/main.php中编写

$types = PageType::model()->findAll();
当PageType是现有模型类时,我得到一个错误:

警告: include(PageType.php)[function.include]:打开流失败:否 中的此类文件或目录 Z:\home\localhost\www\yii-1.1.16.bca042\framework\YiiBase.php联机 432

警告:include()[function.include]:打开“PageType.php”失败 用于在中包含(include_path='.;/usr/local/php5/PEAR') Z:\home\localhost\www\yii-1.1.16.bca042\framework\YiiBase.php联机 432

致命错误:在中找不到类“PageType” 第8行的Z:\home\localhost\www\mycms\protected\config\main.php


我不想直接从此脚本连接到数据库。

全部完成。我使用component而不是/config/main.php来实现这一点,我只是在/protected/components/directory组件类中创建的

class MainMenu extends CComponent {

private $items;

public function getItems() {
    $types=MainMenuItem::model()->findAll();
    return $types;
}
并在/protected/views/layouts/main.php中使用此组件

$mainMenu = new MainMenu();
$itemsModel = $mainMenu->items;
$items = array();
foreach ($itemsModel as $m) {
    $label = $m->label;
    $url = $m->url;
    if (!empty($m->visible) && $m->visible == 'isGuest' && !Yii::app()->user->isGuest 
        || !empty($m->visible) && $m->visible != 'isGuest' && Yii::app()->user->isGuest) 
        continue;
    $item = array('label'=>$label . ($label == 'Logout' ? '('.Yii::app()->user->name.')' : ''), 'url'=>array($url));
    $items[] = $item;
}
$this->widget('zii.widgets.CMenu',array('items'=>$items));

为什么要在protected/config/main上获取菜单数据?在protected/config/main中,所有框架组件尚未初始化。我建议您改变创建组件的方法,例如protected/components/main菜单,并在protected/views/layouts/main上使用它。在这个组件中,您可以执行任何操作,例如获取数据、构建菜单和渲染。谢谢您的建议。组件是我真正需要的。全部完成。这真的很酷,现在我可以从自动生成的表单中添加菜单项了。很好!请自动回答问题并关闭它。请发布解决方案的详细信息,以使此答案更有意义并对其他人有帮助。