Yii / Giix - 标准2列布局

时间:2013-05-24 18:51:09

标签: yii yii-extensions

下面的代码显示了Yii中的两个列布局。 $ content变量包含搜索表单和gridview表单。 我试图让gridview显示在这个双列网格格式的高级搜索部分的右侧。这里的大脑放屁,在标准的Giix结构中是给定内容的变量$ content?我没有在basemodel或控制器中看到它。

提前致谢。

<?php /* @var $this Controller */ ?>
<?php $this->beginContent('//layouts/main'); ?>
<div class="span-24">
    <div id="content">
        <?php echo $content; ?>
    </div><!-- content -->
</div>

<div class="span-5 last">
    <div id="sidebar">
    <?php
        $this->beginWidget('zii.widgets.CPortlet', array(
            'title'=>'Operations',
        ));
        $this->widget('zii.widgets.CMenu', array(
            'items'=>$this->menu,
            'htmlOptions'=>array('class'=>'operations'),
        ));
        $this->endWidget();
    ?>
    </div><!-- sidebar -->

</div>
<?php $this->endContent(); ?>

2 个答案:

答案 0 :(得分:1)

在特定视图中使用网格布局。它应该像

<div class='span-10'> 
//search form
</div>
<div class='span-9'> 
//grid
</div>

答案 1 :(得分:1)

当您的控制器在其操作结束时调用$this->render()时,

$ content 会获得其内容。

public function actionIndex() {
    // renders the view file 'protected/views/site/index.php'
    // using the default layout 'protected/views/layouts/main.php'        
    [some code...]
    $this->render('index');
}

所涉及的过程有点混淆,但您可以通过设置断点并查看调试器中的堆栈来轻松跟踪它。

您还可以阅读代码:

render() CController 类的一种方法:

public function render($view, $data = null, $return = false) {
    if ($this->beforeRender($view)) {
        $output = $this->renderPartial($view, $data, true); // (1)
        if (($layoutFile = $this->getLayoutFile($this->layout)) !== false)
            $output = $this->renderFile($layoutFile, array('content' => $output), true); // (2)
        [snip...]
    }
}

(1)如果在渲染之前没有发生错误,则会填充视图并将其HTML代码分配给 $ output $output = $this->renderPartial($view, $data, true);

(2)然后,除非您在操作中声明视图不能通过整理$this->setLayout(false)进行布局修饰,否则Decorator pattern将被应用并且内部布局中设置的视图:

$output = $this->renderFile($layoutFile, array('content' => $output), true)

在这里,你应该注意到第二个参数是一个数组:array('content' => $output)

renderfile()是一种 CBaseController 的方法,在某些时候会调用

public function renderInternal($_viewFile_, $_data_ = null, $_return_ = false) {
    // we use special variable names here to avoid conflict when extracting data
    if (is_array($_data_))
        extract($_data_, EXTR_PREFIX_SAME, 'data'); // (1)
    else
        $data = $_data_;
    if ($_return_) {
        ob_start();
        ob_implicit_flush(false);
        require($_viewFile_); // (2)
        return ob_get_clean();
    }
    else
        require($_viewFile_);
}

这就是你的答案所在:

(1) $ data 仍然是我们的array('content' => $output)。提取函数将构建并初始化此数组中的变量,即 $ content 变量。

(2)现在需要布局文件。当然, $ content 存在于其范围内,因为您的控制器位于 $ this

之后