0

以下のコードは、Yii での 2 列のレイアウトを示しています。$content 変数は、検索フォームとグリッドビュー フォームを保持します。この 2 列のグリッド形式で、詳細検索セクションの右側にグリッドビューを表示しようとしています。ここで頭がおならのようなものです。標準の Giix 構造では、その内容が与えられた変数 $content はどこにありますか? ベースモデルまたはコントローラーには表示されませんでした。

前もって感謝します。

<?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(); ?>
4

2 に答える 2

1

$this->render()アクションの最後にコントローラーが呼び出すと、$contentにコンテンツが与えられます。

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

関連するプロセスは少し難読化されていますが、ブレークポイントを設定し、デバッガーでスタックを確認することで簡単に追跡できます。

コードを読むこともできます:

render()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)レンダリング前にエラーが発生しない場合は、ビューが作成され、その HTML コードが$outputに割り当てられます。$output = $this->renderPartial($view, $data, true);

(2)次に、ビューをレイアウトによって colling で装飾してはならないことをアクションで述べていない限り$this->setLayout(false)Decorator パターンが適用され、内部ビューがレイアウトに設定されます。

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

ここで、2 番目の引数が配列であることに注意してください。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) $dataはまだ私たちのarray('content' => $output). 抽出関数は、この配列から変数、つまり$content変数を構築して初期化します。

(2)レイアウトファイルが必要になりました。もちろん、$thisの背後にあるコントローラーとして、 $contentもそのスコープ内に存在します。

于 2013-05-25T09:20:53.657 に答える