在yii2中的布局视图内渲染视图

时间:2018-06-02 02:32:41

标签: php yii2 rendering

我需要创建一个搜索表单,它将显示在页面顶部的所有页面上,甚至是错误页面上,所以我决定为它创建一个视图和模型,并在主布局中呈现此视图。所以我创造了一个简单的模型:

SearchModel.php

<?php

namespace app\models;

use Yii;
use yii\base\Model;

class SearchFormModel extends Model
{
    public $query;

    public function rules()
    {
        return [

        ];
    }
}

观点:

SearchView.php

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;

$form = ActiveForm::begin([
    'id' => 'search-nav-form',
    'options' => ['class' => 'form-inline ml-3'],
]) ?>

<div class="input-group input-group-sm">
    <?= $form->field($model, 'text')->textInput(['class' => 'form-control form-control-navbar', 'placeholder'
    => 'Search'])->label('Search'); ?>

    <div class="input-group-append">
        <button class="btn btn-navbar" type="submit">
            <i class="fa fa-search"></i>
        </button>
    </div>
</div>


<?php ActiveForm::end() ?>

这是一个搜索表单。现在我还有主要布局:

<?php

use app\widgets\Alert;
use yii\helpers\Html;
use yii\bootstrap\Nav;
use yii\bootstrap\NavBar;
use yii\widgets\Breadcrumbs;
use app\assets\AppAsset;
AppAsset::register($this);
?>
<?php $this->beginPage() ?>
<!DOCTYPE html>
<html lang="<?= Yii::$app->language ?>">
<head>
    <meta charset="<?= Yii::$app->charset ?>">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <?php $this->registerCsrfMetaTags() ?>
    <title><?= Html::encode($this->title) ?></title>
    <?php $this->head() ?>
</head>
<body>
<?php $this->beginBody() ?>

<div class="wrap">


    <div class="container">
        <?= Breadcrumbs::widget([
            'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [],
        ]) ?>
        <?= Alert::widget() ?>
        <?= $content ?>
    </div>
</div>

<footer class="footer">
    <div class="container">
        <p class="pull-left">&copy; My Company <?= date('Y') ?></p>

        <p class="pull-right"><?= Yii::powered() ?></p>
    </div>
</footer>

<?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>

我不明白的是,我如何从布局视图中渲染搜索表单?我需要把它放在控制器中,但控制器只为特定的页面路由提供动作。

更新

我摆脱了所有错误,但现在表单只是没有在页面上呈现,甚至没有表单标签。以下是我在 main.php 中的呈现方式:

 $model = new SearchFormModel;
 $this->render('@app/views/site/SearchFormView',['model' => $model]);

我修复了模型SearchFormModel.php,如下所示:

class SearchFormModel extends Model
{

    public $search;

    public function rules()
    {
        return [
            // тут определяются правила валидации
        ];
    }
}

3 个答案:

答案 0 :(得分:1)

您可以使用

在布局文件中渲染视图
<?= $this->render('//layouts/path/to/view') ?>

<?= $this->render('@app/views/path/to/view') ?>

<?= Yii::$app->view->renderFile('@app/views/path/to/view.php'); ?>

请参阅render()renderFile()

的DOCS

答案 1 :(得分:0)

Yii2中的渲染函数返回渲染结果。你必须明确回应。试试吧:

$model = new SearchFormModel;
echo $this->render('@app/views/site/SearchFormView',['model' => $model]);

答案 2 :(得分:0)

您应该将表单提取到窗口小部件中并在布局中使用它。布局应该比较简单,包括一些外部视图,它看起来像代码气味,而在视图文件内部创建模型(包括布局文件)基本上是违反了MVP模式。

使用表单创建窗口小部件:

class SearchFormWidget extends \yii\base\Widget {

    public function run() {
        $model = new SearchFormModel();
        $model->load(Yii::$app->request->get());
        return $this->render('search-form-widget', ['model' => $model]);
    }
}

将表单放在widgets/views/search-form-widget.php中(或类似路径,具体取决于您放置窗口小部件的位置),并在布局中使用窗口小部件:

<?= SearchFormWidget::widget() ?>

以类似的方式,您可以在任何其他地方使用它。比直接包含视图更加清晰和安全的方法。

相关问题