0

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

提前致谢。

<?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(); ?>
4

2 回答 2

1

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

<div class='span-10'> 
//search form
</div>
<div class='span-9'> 
//grid
</div>
于 2013-05-25T06:24:20.857 回答
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)然后,除非您在操作中声明视图不能通过 colling 由布局装饰,否则将$this->setLayout(false)应用装饰器模式并在布局中设置内部视图:

$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). extract 函数将从这个数组中构建和初始化变量,即你的$content变量。

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

于 2013-05-25T09:20:53.657 回答