Php 是否可以使用Yii将视图从控制器渲染到渲染页面?

Php 是否可以使用Yii将视图从控制器渲染到渲染页面?,php,yii,yii-widgets,Php,Yii,Yii Widgets,有没有办法在主视图文件中创建一个“占位符”,以便使用Yii呈现具有指定数据的其他视图文件 我想单独处理控制器中的数据,然后在渲染之前将其放置到视图文件中的指定位置 以下是一个小部件示例: 小部件类: class MyWidget extends CWidget { public $someData; public $mainData; public function init()

有没有办法在主视图文件中创建一个“占位符”,以便使用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));
              }
            }
        }
      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,然后将其传递给视图。我个人直接在我想要渲染这个局部视图的视图中使用它。