Php 是否可以使用Yii将视图从控制器渲染到渲染页面?
有没有办法在主视图文件中创建一个“占位符”,以便使用Yii呈现具有指定数据的其他视图文件 我想单独处理控制器中的数据,然后在渲染之前将其放置到视图文件中的指定位置 以下是一个小部件示例: 小部件类:Php 是否可以使用Yii将视图从控制器渲染到渲染页面?,php,yii,yii-widgets,Php,Yii,Yii Widgets,有没有办法在主视图文件中创建一个“占位符”,以便使用Yii呈现具有指定数据的其他视图文件 我想单独处理控制器中的数据,然后在渲染之前将其放置到视图文件中的指定位置 以下是一个小部件示例: 小部件类: class MyWidget extends CWidget { public $someData; public $mainData; public function init()
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));
}
}
}
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));
}
}
主视图文件:
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'>");
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'>");
主视图文件:
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'>");
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'>");
echo(“”);
回波(数据);
echo($子视图)//“占位符”
回声(“”);
您可以为此目的使用。您可以放置renderPartial isntead$this->placeholder('placeholder name')的代码;e、 g:
选中其他参数-您可以保存到字符串或处理来自部分的js/css。您说的是“先前呈现的文件”,我解释为您在浏览器中已经看到主文件,然后您希望控制器处理新数据并传回视图,为此,您可能需要从主视图文件中调用ajax(可能通过ajax按钮)。如果有,请看一看
这允许您调用控制器操作并将结果视图推送到DOM占位符(使用HTML id)。CHtml::ajaxButton
的replace
键将替换DOM占位符的内容。e、 g
'replace' => '#placeholder_id'
编辑
replace
实际上将替换整个DOM元素。如果要替换DOM元素中的html内容,可以使用update
输入ajaxOptions
<div id="subviewPlaceholder_id">html content</div>
已添加
如果要在初始渲染时将子视图放置在另一个视图中。使用@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
?>
这是您的子视图(按照惯例,局部视图的前缀为“ux”)
谢谢你的帮助。是的,我说的是“先前渲染的文件”,但如果控制器加载主视图,将句柄数据添加到占位符(使用子视图文件),然后将结果渲染到浏览器,也可以。也可能吗?是的。检查并添加答案!再次感谢!还有一个问题:在示例中,我使用foreach处理大量数据,并使用_子视图将它们添加到主视图中,我想知道我需要将foreach与处理ifs一起放到主视图中,还是可以从控制器的foreach调用renderPartial,因为我想保持视图的简单性,我想在控制器中处理这种处理。在控制器中进行处理,并将结果$display传递给mainview。主视图可以将$display变量传递给_子视图-ps。如果对您有效,请将答案标记为正确!谢谢。可以从控制器调用renderPartial()吗?可以:)。可以从控制器或视图本身调用renderPartial。如果从控制器调用它,最好将响应保存在变量中,并将第3个参数设置为true,然后将其传递给视图。我个人直接在我想要渲染这个局部视图的视图中使用它。