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));
              }
            }
        }

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

ニコラの答えに基づく解決策:

ウィジェット クラス:

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

2 に答える 2

1

この目的でrenderPartialを使用できます。renderPartial isntead $this->placeholder('placeholderName'); のコードを配置できます。例えば:

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

他のパラメータを確認してください - 文字列に保存するか、パーシャルから js/css を処理できます。

于 2014-04-21T13:07:05.953 に答える
0

「以前にレンダリングされたファイル」と言いましたが、これは、メインファイルが既にブラウザーに表示されていると解釈し、コントローラーによって新しいデータを処理してビューを返したいと考えているため、ajax 呼び出しが必要になります。何らかの方法でメインビューファイルから(おそらくajaxボタンを介して)。もしそうなら、見てくださいCHtml::ajaxButton

これにより、コントローラー アクションを呼び出して、結果のビューを DOM プレースホルダーにプッシュできます (HTML ID を使用)。ofのreplaceキーは、DOM プレースホルダーの内容を置き換えます。例えばajaxOptionsCHtml::ajaxButton

'replace' => '#placeholder_id'

編集

replace実際には DOM 要素全体を置き換えます。DOM要素内のhtmlコンテンツを置き換えたい場合は、キーインを使用できupdateますajaxOptions

<div id="subviewPlaceholder_id">html content</div>

以下は、フォーム内に存在する例です。ボタンを押すと、フォーム データが get パラメータとして送信されます。コントローラー アクションを使用してパラメーターを読み取り、サブビューを$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 に答える