Как обратиться к базе из лейаута?

Помогите достать из базы элементы

Мне надо обратиться из лейаута а не из view.

В лейауте у меня строится главное меню которое не будет меняться нигде на сайте больше.

Но я не могу достать из бызы записи.

Помогите плиз.

Сделал вот что:

в Site Controller написал:


public $_model; 

	public function actionIndex()

	{

		$model=$this->loadSite();

		$this->render('index',array('model'=>$this->loadsite()));

		//$this->render('index');

	}

	

		public function loadsite($id=null)

	{

		if($this->_model===null)

		{

			if($id!==null || isset($_GET['id']))

				$this->_model=site::model()->findbyPk($id!==null ? $id : $_GET['id']);

			if($this->_model===null)

				throw new CHttpException(404,'The requested page does not exist.');

		}

		return $this->_model;

	}

в модели (…models/site.php) написал:


class site extends CActiveRecord

{

	public static function model($className=__CLASS__)

	{

		return parent::model($className);

	}

	public function tableName()

	{

		return 'menu';

	}

	public function rules()

	{

		return array(

			array('title', 'required'),

			array('pid, hide', 'numerical', 'integerOnly'=>true),

		);

	}




как вы поняли пункты меню должны доставаться из таблички "menu"

но вместо этого выдает:

404 Page Not Found

The requested page does not exist.

Подскажите как правильно пожалуйста.

такие вещи делаются виджетом!

т.е. в виджете пишите код работы с моделью, передаете полученные данные в отображения виджета.

а сам виджет вызываете в лайоте.

спасибо буду пробовать

pirrat +1

именно виджет.

На MainMenu смотреть, наверное, не надо, он несколько усложнен.

Просто почитай про виджеты в мануале, там все хорошо описано.

Вкратце, виджет - такой типа миниконтроллер, у которого свои вьюхи есть (лежат в подпапочке components/views).

Вставляешь на страницу виджет, он добывает данные, рендерит свой минишаблони выводится на странице. Очень удобно.

Спасибо буду пробовать

Вот что у меня пока получилось:

во views/siteMenu.php


<div id="menu">

   <ul>

    <?php 

    foreach($this->sites as $site) {

        if(isset($site['url'])) {

            echo '<li><div class="left">&nbsp;</div><div class="center"><p class="menutextposition">'.CHtml::link($site['name'], $site['url']).'</p></div><div class="right">&nbsp;</div></li>';

        } else {

            echo '<li><div class="selected_l">&nbsp;</div><div class="selected"><p class="menu_selected_position">'.$site['name'].'</p></div><div class="selected_r">&nbsp;</div></li>';

        }

    }

    ?>

  </ul>

</div>

сам виджет components/SiteMenu.php:


<?php


class SiteMenu extends CWidget {


    public $sites = array();

	

    public function run() {

        $this->render('siteMenu');

    }

 

}

?>

вызываю так:


<?php

$this->widget('application.components.SiteMenu',array(

	'sites'=>array(

		array('name'=>'Main page'),

		array('name'=>'Technologies', 'url'=>array('/menu/admin')),

		array('name'=>'Contacts', 'url'=>array('/site/index')),

	),

)); 

?>

Все работает - все круто!, Но это не совсем то что мне надо, мне надо циклом пройтись по всей таблице и взять все названия меню оттуда и вставить в этот виждет.

Как мне сформировать массив sites? если я немогу из лейаута в базу обратиться?

Помогите плиз кто знает.

Зачем вам из лайота обращаться к бд ,я так и не могу понять?!

в виджете обращаетесь к базе и формируете нужный массив:


class SiteMenu extends CWidget {       

    public function run() {

        $menuItems = site::model()->findAll();

        $this->render('siteMenu', array('menuItems'=> $menuItems));

    } 

}

в отображении views/siteMenu.php




<?foreach($menuItems as $item):?>

<li><a href=""><?=$item->name?></a></li>

<?endforeach;?>



в лайоте просто вызываете виджет:


$this->widget('application.components.SiteMenu');

Блин вот я лузер…

Спасибо большое:)