有没有办法创建一个"占位符"在主视图文件中使用Yii?
呈现具有指定数据的其他视图文件我想在控制器中单独处理数据,然后在渲染之前将它们放置在视图文件中的指定位置。
这是一个小部件示例:
小部件类:
class MyWidget extends CWidget
{
public $someData;
public $mainData;
public function init()
{
}
public function run()
{
$this->render('mainView',array('data'=>$someData));
foreach($data as $dat)
{
if(dat["color"]=="red")
{
$display = 4;
}
else if(dat["color"]=="blue")
{
$display = 6;
}
etc....
//this is the fictional method for that purpose
$this->addToPage('mainView','subView','placeholderName',
array('display'=>$display,'mainData'=>$main));
}
}
}
mainView文件:
echo("<div class='someDesign'>");
echo($data);
$this->placeholder('placeholderName');
echo("</div>");
子视图文件:
if($display>0 && $display<=4)
echo("<div class='dataColorG'>");
else if($display>0 && $display<=4)
echo("<div class='dataColorD'>");
echo $mainData;
echo("</div'>");
解决方案基于Nikola的回答:
小部件类:
class MyWidget extends CWidget
{
public $someData;
public $mainData;
public function init()
{
}
public function run()
{
$output ="";
foreach($data as $dat)
{
if(dat["color"]=="red")
{
$display = 4;
}
else if(dat["color"]=="blue")
{
$display = 6;
}
//If it's a widget we need to use $this->controller->renderPartial() instead of $this->renderPartial()
$output.= $this->controller->renderPartial('subView',array('display'=>$display,'mainData'=>$main),true);
}
$this->render('mainView',array('subView'=>$output,'data'=>$someData));
}
}
mainView文件:
echo("<div class='someDesign'>");
echo($data);
echo($subView); //the 'placeholder'
echo("</div'>");
子视图文件:
if($display>0 && $display<=4)
echo("<div class='dataColorG'>");
else if($display>0 && $display<=4)
echo("<div class='dataColorD'>");
echo $mainData;
echo("</div'>");
答案 0 :(得分:1)
您可以使用renderPartial来实现此目的。您可以为renderPartial设置代码isntead $ this-&gt; placeholder('placeholderName'); e.g:
$this->renderPartial('placeholderView', array($data));
选择其他参数 - 你可以保存为字符串或处理部分的js / css。
答案 1 :(得分:0)
你说&#34;之前呈现的文件&#34;我解释说你已经在浏览器中查看了主文件,然后你想让控制器处理新数据并传回视图,你需要以某种方式从主视图文件中调用ajax(也许通过ajax按钮)。如果有,请查看CHtml::ajaxButton
。
这允许您调用控制器操作并将结果视图推送到DOM占位符(使用HTML id)。 replace
ajaxOptions
中的CHtml::ajaxButton
键将替换DOM占位符的内容。例如
'replace' => '#placeholder_id'
修改强>
replace
实际上会替换整个DOM元素。如果要替换DOM元素中的html内容,可以使用update
中的ajaxOptions
键
<div id="subviewPlaceholder_id">html content</div>
这是一个示例,它位于表单内。按钮按钮将发送表单数据作为获取参数。使用控制器操作来读取参数并$this->renderPartial('subView',array(... params ...))
发回子视图:
<?php
echo '<div id="subviewPlaceholder_id"></div>';
echo CHtml::ajaxButton('Get Sub View Button Name',array(
'controller/getSubView','param1'=>$presetParam),
array( // this is the ajaxOptions
'type'=>'GET',
'update'=>'#subviewPlaceholder_id', // id of DOM element for subview
), array( // this is the htmlOptions
'class'=>'normalButton',
));
?>
<强>加强>
如果要在初始渲染时将子视图放在另一个视图中。使用@ Nikola的建议
$this->renderPartial('subView',array(...params...));
示例主视图文件(后跟子视图文件)。将两个文件放在视图文件夹中:
<?php // mainView.php
echo '<h1>MAIN VIEW</h1>';
echo '<div class="class">'.$mainData->attribute1.'</div>';
echo '<div class="class">'.$mainData->attribute2.'</div>';
// render anything else
// parameters for subView (processing should be done in controller actually)
$display = $condition==$criteria?1:2;
//this is where subview.php would be placed
//You could get '_subView' from a variable and switch your subView according
//to your criteria.
$this->renderPartial('_subView', array(
'display'=>$display,
'param2'=>$param2));
echo '<div>MAIN VIEW CONTINUED</div>'; // add any other rendering for main view
?>
这是您的子视图(前缀&#34; _&#34;按惯例的部分视图)
<?php // _subView.php
if($display>0 && $display<=4)
echo("<div class='dataColorG'>");
else if($display>0 && $display<=4)
echo("<div class='dataColorD'>");
echo $param2; // add anything else to be rendered.
echo "</div>";
?>