2013-05-24 1 views
0

В приведенном ниже коде показано расположение двух столбцов в Yii. Переменная $ content содержит форму поиска и форму gridview. Я пытаюсь получить gridview, чтобы появиться справа от секции расширенного поиска в этом формате с двумя столбцами. Вид мозгов пукает здесь, где в стандартной структуре Giix есть переменная $ content, учитывая ее содержимое? Я не видел его в basemodel или контроллере.Yii/Giix - Стандартная компоновка колонок

Заранее спасибо.

<?php /* @var $this Controller */ ?> 
<?php $this->beginContent('//layouts/main'); ?> 
<div class="span-24"> 
    <div id="content"> 
     <?php echo $content; ?> 
    </div><!-- content --> 
</div> 

<div class="span-5 last"> 
    <div id="sidebar"> 
    <?php 
     $this->beginWidget('zii.widgets.CPortlet', array(
      'title'=>'Operations', 
     )); 
     $this->widget('zii.widgets.CMenu', array(
      'items'=>$this->menu, 
      'htmlOptions'=>array('class'=>'operations'), 
     )); 
     $this->endWidget(); 
    ?> 
    </div><!-- sidebar --> 

</div> 
<?php $this->endContent(); ?> 

ответ

1

$ содержания дается его содержанием, когда контроллер вызов $this->render() в конце его действия.

public function actionIndex() { 
    // renders the view file 'protected/views/site/index.php' 
    // using the default layout 'protected/views/layouts/main.php'   
    [some code...] 
    $this->render('index'); 
} 

Процесс включал немного запутанным, но вы можете легко отслеживать его вниз, установив точку останова и, глядя на стек в вашем отладчике.

Вы также можете прочитать код:

визуализации() является метод CController класса:

public function render($view, $data = null, $return = false) { 
    if ($this->beforeRender($view)) { 
     $output = $this->renderPartial($view, $data, true); // (1) 
     if (($layoutFile = $this->getLayoutFile($this->layout)) !== false) 
      $output = $this->renderFile($layoutFile, array('content' => $output), true); // (2) 
     [snip...] 
    } 
} 

(1) Если ошибка не возникнет перед визуализацией, то view и его код HTML присвоен $ output: $output = $this->renderPartial($view, $data, true);

(2) Тогда, если не указано в своем действии, что вид не должен быть украшен раскладку, Colling $this->setLayout(false), то Decorator pattern применяется и внутренний вид устанавливается в макете:

$output = $this->renderFile($layoutFile, array('content' => $output), true) 

Здесь вы должны заметить, что второй аргумент является массивом: array('content' => $output)

RenderFile() является метод CBaseController, которые в какой-то момент, будем называть

public function renderInternal($_viewFile_, $_data_ = null, $_return_ = false) { 
    // we use special variable names here to avoid conflict when extracting data 
    if (is_array($_data_)) 
     extract($_data_, EXTR_PREFIX_SAME, 'data'); // (1) 
    else 
     $data = $_data_; 
    if ($_return_) { 
     ob_start(); 
     ob_implicit_flush(false); 
     require($_viewFile_); // (2) 
     return ob_get_clean(); 
    } 
    else 
     require($_viewFile_); 
} 

И вот где ваш ответ лежит:

(1)данные $ еще наш array('content' => $output). Функция extract будет строить и инициализировать переменные из этого массива, а именно вашу переменную $ content.

(2) Файл макета теперь требуется. $ content существует в своем объеме, а также, конечно, как ваш контроллер, который находится за $ this

+0

Отличный ответ, спасибо Herode! – DaveyLaser

1

Используйте макет сетки в определенном виде. Он должен что-то вроде

<div class='span-10'> 
//search form 
</div> 
<div class='span-9'> 
//grid 
</div>