我希望在我的布局main.php页面上列出一些类别名称。 由于布局没有任何关联的控制器或模型,我希望在类别模型上创建这样的静态方法:
public static function getHeaderModels()
{
// get all models here
return $models;
}
然后在主要布局
<?php
$models = Category::getHeaderModels();
foreach($models as $model)
{
// ....
}
?>
我的问题是一个非常基本的问题: 如何从模型中检索这些类别名称?
以下是完整模型:
class Category extends CActiveRecord {
public static function model($className=__CLASS__) {
return parent::model($className);
}
public function tableName() {
return 'category';
}
public function rules() {
return array(
array('parent_id', 'numerical', 'integerOnly' => true),
array('name', 'length', 'max' => 255),
array('id, parent_id, name', 'safe', 'on' => 'search'),
);
}
public function relations() {
return array(
'users' => array(self::MANY_MANY, 'User', 'categories(category_id, user_id)'),
);
}
public function scopes()
{
return array(
'toplevel'=>array(
'condition' => 'parent_id IS NULL'
),
);
}
public function attributeLabels() {
$id = Yii::t('trans', 'ID');
$parentId = Yii::t('trans', 'Parent');
$name = Yii::t('trans', 'Name');
return array(
'id' => $id,
'parent_id' => $parentId,
'name' => $name,
);
}
public function search() {
$criteria = new CDbCriteria;
$criteria->compare('id', $this->id);
$criteria->compare('parent_id', $this->parent_id);
$criteria->compare('name', $this->name, true);
return new CActiveDataProvider(get_class($this), array(
'criteria' => $criteria,
));
}
public static function getHeaderModels() {
//what sintax should I use to retrieve the models here ?
return $models;
}
答案 0 :(得分:19)
可能这个答案可以帮到你。首先,您必须创建一个Widget,以便更有效地使用它。
首先创建一个新小部件。假设名称为CategoryWidget
。将此小部件放在组件目录protected/components
下。
class CategoryWidget extends CWidget {
public function run() {
$models = Category::model()->findAll();
$this->render('category', array(
'models'=>$models
));
}
}
然后为此小部件创建一个视图。文件名是category.php。
把它放在protected/components/views
<强> category.php 强>
<?php if($models != null): ?>
<ul>
<?php foreach($models as $model): ?>
<li><?php echo $model->name; ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
然后从主布局调用此小部件。
<强> main.php 强>
// your code ...
<?php $this->widget('CategoryWidget') ?>
...
答案 1 :(得分:6)
如果我没有弄错,你也可以将视图中可用的任何变量传递给布局。 您只需从包含变量的视图中执行此操作。 这是一个问题:您需要在控制器中声明将接收您的值的变量,如下所示:
<?php
class MyController extends Controller
{
public $myvariable;
在此之后,您将在视图中为此公共变量分配模型或其他内容, 像这样:
$this->myvariable = $modeldata;
将模型数据分配给控制器的公共属性后, 您可以轻松地在布局中显示它,例如
echo $this->myvariable;
Yii已经通过将菜单项分配给column2侧栏菜单,从视图中执行此操作,如下所示:
$this->menu=array(
array('label'=>'List Item', 'url'=>array('index')),
array('label'=>'Manage Item', 'url'=>array('admin')),
);
您可以在gii crud创建的所有创建/更新视图中看到它。