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

时间:2014-04-21 12:57:35

标签: php yii yii-widgets

有没有办法创建一个"占位符"在主视图文件中使用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'>");

2 个答案:

答案 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>";        
?>