我需要创建一个搜索表单,它将显示在页面顶部的所有页面上,甚至是错误页面上,所以我决定为它创建一个视图和模型,并在主布局中呈现此视图。所以我创造了一个简单的模型:
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">© 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 [
// тут определяются правила валидации
];
}
}
答案 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'); ?>
的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() ?>
以类似的方式,您可以在任何其他地方使用它。比直接包含视图更加清晰和安全的方法。