下面的代码显示了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(); ?>
答案 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
之后