теметатеги рендерятся не в том месте, yii2
Есть шаблон (layout), схему которого я привожу ниже и на "схеме" показываю, где стоят маркеры типа head() и прочих.
$this->beginPage();?>
<html>
<head>
...
<title><?= Html::encode($this->title) ?></title>
<?= Html::csrfMetaTags() ?>
<?php $this->head() ?>
...
</head>
<body>
$this->beginBody();
echo $this->render('..' . DIRECTORY_SEPARATOR . 'layouts' . DIRECTORY_SEPARATOR . '_header_index').PHP_EOL;
...
echo $content;
...
echo $this->render('..' . DIRECTORY_SEPARATOR . 'layouts' . DIRECTORY_SEPARATOR . '_footer').PHP_EOL;
$this->endBody();
</body>
</html>
$this->endPage()
В $content загружается собственно индексный action, вид которого следующий:
<?php
use common\helpers\AppHelper;
use common\models\SystemSetting;
use frontend\controllers\BasketController;
use yii\helpers\Html;
use yii\helpers\Url;
use yii\validators\ValidationAsset;
use yii\widgets\ActiveFormAsset;
use yii\widgets\LinkPager;
use yii\widgets\Pjax;
use frontend\assets\AppAsset;
use frontend\assets\CategoriesAsset;
$session = Yii::$app->session;
$request = Yii::$app->request;
$isHomepage = $this->params['isHomepage'] ?? false;
$basket = (int)BasketController::CartCount();
$domain = Yii::getAlias('@webfront');
$user = Yii::$app->user->identity;
$get = Yii::$app->request->get();
CategoriesAsset::register($this);
$this->registerJs('CatalogComponent.init()');
if(isset($get['productParam']))
$params['productParam'] = $get['productParam'];
else
$params['productParam'] = [];
if(isset($get['cat']))
$params['cat'] = $get['cat'];
else
$params['cat'] = [];
if(isset($get['provider']))
$params['provider'] = $get['provider'];
else
$params['provider'] = [];
if(isset($get['mod']))
$params['mod'] = $get['mod'];
else
$params['mod'] = '';
?>
<?php
$this->registerJsVar('THIS_URL',Url::toRoute(['categories/index', 'alias' => $mainCategory->alias]),$this::POS_END);
$this->registerJsVar('modView',$params['mod'],$this::POS_END);
$this->registerJsVar('mainCategory', $mainCategory->id, $this::POS_END);
$this->registerJsVar('listR', $listR, $this::POS_END);
?>
<div id="rec16558234" class="r t-rec r_showed r_anim" data-animationappear="on" data-record-type="754">
<div class="t-container t754__container_mobile-grid">
<div class="breadcrumb">
<?= Html::a(Yii::$app->params['main_cat_name'], Url::toRoute(['categories/all-categories']));
if(!empty($list)): foreach ($list as $cat):
echo Html::tag('span', ' → ');
echo Html::a($cat['name'], $cat->getUrl());
endforeach; endif;
echo Html::tag('span', ' → ');
echo $mainCategory->name;
// echo Html::a($mainCategory->name, Url::toRoute(['categories/index', 'alias' => $mainCategory->alias]));
?>
</div>
<?= $this->render('..' . DIRECTORY_SEPARATOR . 'layouts' . DIRECTORY_SEPARATOR . 'filters',[
'productParam' => $productParam,
'productParams' => $productParams,
'seoProps' => $seoProps,
'providers' => $providers,
'params' => $params,
'full_count' => $full_count,
'listR' => $listR,
'mainCategory' => $mainCategory,
'productProvider' => $productProvider,
'title_name' => $title_name,
'nameValue' => $nameValue,
]).PHP_EOL;?>
</div>
<! ----------------- ВОТ ЭТО МЕСТО ------------------->
<?php
Pjax::begin([
'id' => 'pjax-container',
'formSelector' => 'filterByParams',
'timeout' => 10000,
'scrollTo' => 200,
]);
$data['products'] = $products;
$data['limit'] = $page_limit;
$data['productProvider'] = $productProvider;
echo frontend\controllers\ProductController::renderProductsPlate($data, $query);
if (Yii::$app->request->get('page') == NULL) {
echo Html::tag('div', $mainCategory->description, ['class' => 't-container t754__container_mobile-grid text__inner']);
}else {
if (Yii::$app->request->get('page') >= 1 AND Yii::$app->request->get('page') <= SystemSetting::getCountCategoryDescriptions() ){
echo Html::tag('div', $mainCategory->{description.Yii::$app->request->get('page')}, ['class' => 't-container t754__container_mobile-grid text__inner']);
}
}
Pjax::end();
?>
</div>
. В контроллере такой код:
Yii::$app->view->registerMetaTag(['name'=>'description', 'content' => $mainCategory->meta_description], 'description');
Yii::$app->view->registerMetaTag(['name'=>'keywords', 'content' => $mainCategory->meta_keywords], 'keyword');
Yii::$app->view->title = (strlen($mainCategory->meta_title))? $mainCategory->meta_title: $mainCategory->name;
Вставки "<----------------- ВОТ ЭТО МЕСТО ------------------->" в коде конечно же нету. Ею я показал место, где генерируется то, что должно быть сгенерировано в месте вызова <?php $this->head() ?>, а именно:
<meta name="description" content="..............">
<meta name="keywords" content=".............">
<link href="/assets/8b07a5ae/css/bootstrap.css?v=1582991338" rel="stylesheet">
<link href="/assets/5f52a4ef/css/style.css?v=1582991338" rel="stylesheet" position="1">
<link href="/assets/5f52a4ef/css/megamenu.css?v=1582991338" rel="stylesheet" position="1">
<link href="/assets/5f52a4ef/icon/font-awesome-4.7.0/css/font-awesome.min.css?v=1582991338" rel="stylesheet" position="1">
<script src="/assets/328e8b1a/jquery.js?v=1582991338"></script>
<script src="/assets/9aebc51e/yii.js?v=1582991338"></script>
<script src="/assets/8b07a5ae/js/bootstrap.js?v=1582991338"></script>
<script src="/assets/5f52a4ef/js/jquery-1.10.2.min.js?v=1582991338"></script>
Грубо говоря, у меня вот эта вставка генериится посреди страницы. Собственно вопрос: почему в теле страницы у меня метатеги и некоторые скрипты сгененрировались, в произвольном месте? Как сделать так, чтоб метатеги вывелись там, где стоит маркер <?php $this->head() ?>?
Ответы (1 шт):
При рендеринге одного из блоков использовался метод renderAjax(), а надо render(), т.к. renderAjax() рендерит именованный вид без шаблона, и добавляет все зарегистрированные JS/CSS скрипты и стили.