0

有什么方法可以在主视图文件中创建一个“占位符”,以便使用 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));
              }
            }
        }

主视图文件:

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'>");

基于尼古拉的回答的解决方案:

小部件类:

      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);
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'>");
4

2 回答 2

1

您可以为此目的使用renderPartial 。您可以放置​​ renderPartial 的代码而不是 $this->placeholder('placeholderName'); 例如:

$this->renderPartial('placeholderView', array($data));

检查其他参数 - 您可以从部分保存到字符串或处理 js/css。

于 2014-04-21T13:07:05.953 回答
0

您说“先前渲染的文件”,我解释说您已经在浏览器中查看了主文件,然后您希望控制器处理新数据并传回视图,为此您需要一个 ajax 调用从主视图文件以某种方式(可能通过 ajax 按钮)。如果是这样看看CHtml::ajaxButton

这允许您调用控制器操作并将结果视图推送到 DOM 占位符(使用 HTML id)。的replaceajaxOptionsCHtml::ajaxButton替换 DOM 占位符的内容。例如

'replace' => '#placeholder_id'

编辑

replace实际上会替换整个 DOM 元素。如果要替换 DOM 元素内的 html 内容,可以使用updatekey inajaxOptions

<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
?>

这是您的子视图(按照惯例,部分视图的前缀“_”)

<?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>";        
?>
于 2014-04-21T13:28:19.173 回答