2014-04-21 2 views
0

Есть ли способ создать «заполнитель» внутри основного файла представления для рендеринга других файлов вида с указанными данными с помощью Yii?Можно ли отображать визуализированную страницу с помощью 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'>"); 

ответ

0

Вы сказали «ранее сделанный файл», который я интерпретирую, что у вас есть основной файл, уже находящийся в поле зрения в браузере, а затем вы хотели бы, чтобы новые данные обрабатывались контроллером и передавали представление, для которого вы нужно как-то вызвать ajax-вызов из основного файла вида (возможно, через кнопку ajax). Если да, взгляните на CHtml::ajaxButton.

Это позволяет вам вызвать действие контроллера и нажать результирующее представление на место DOM (используя идентификатор HTML). Ключ replace в ajaxOptions от CHtml::ajaxButton заменит содержимое заполнителя DOM. например

'replace' => '#placeholder_id' 

Редактировать

replace будет на самом деле заменить весь элемент DOM. Если вы хотите, чтобы заменить содержимое HTML внутри элемента DOM вы можете использовать update ключ в ajaxOptions

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

Вот пример, который находится внутри формы. Нажатие кнопки отправит данные формы как параметры получения.Используйте действие контроллера для чтения Params и $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>";   
?> 
+0

Спасибо за помощь. Да, я сказал «ранее сделанный файл», но это тоже нормально, если контроллер загружает основной вид, добавляет данные дескриптора в местозаполнитель (используя файл подзадачи), а затем отображает результат в браузере. Это тоже возможно? – Crabman

+0

Да. Проверьте дополнение к ответу! – nazim

+0

Еще раз спасибо! Еще один вопрос: в образце я использовал foreach для обработки массовых данных и добавлял каждый из них в основное представление с помощью _subview, и мне интересно, что мне нужно поместить foreach в mainView с обработкой ifs или возможно каким-то образом вызывать renderPartial из контрольного файла foreach, потому что я хочу, чтобы представления были простыми и ориентированными на дизайн, и я хочу обрабатывать такую ​​обработку в контроллере. – Crabman

1

Вы можете использовать renderPartial для этого цель. Вы можете поместить код для renderPartial isntead $ this-> placeholder ('placeholderName'); например .:

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

Chech другой PARAMS - вы можете сохранить строки или процесс JS/CSS от обертонов.

+0

Можно ли назвать renderPartial() от контроллера? – Crabman

+0

Да это :). Вы можете вызвать renderPartial из контроллера или из самого представления. Если вы вызовете его с контроллера, лучше сохранить ответ в переменной с 3-м параметром, установленным в true, а затем передать его в представление. Я лично использую его непосредственно в представлении, где я хочу сделать это частичное представление. – Nikola

Смежные вопросы