2

У меня есть главный шаблон views/layouts/main.php в котором происходит подключение:

$this->head()
$this->beginBody();
echo $this->render('..' . DIRECTORY_SEPARATOR . 'layouts' . DIRECTORY_SEPARATOR . '_header_index').PHP_EOL;
echo $this->render('..' . DIRECTORY_SEPARATOR . 'layouts' . DIRECTORY_SEPARATOR . 'menu').PHP_EOL;
echo $content;
echo $this->render('..' . DIRECTORY_SEPARATOR . 'layouts' . DIRECTORY_SEPARATOR . '_footer').PHP_EOL;
$this->endBody();
$this->endPage()

Среди этого всего есть, как видите

echo $this->render('..' . DIRECTORY_SEPARATOR . 'layouts' . DIRECTORY_SEPARATOR . 'menu').PHP_EOL;

и мне очень не нравится, что оно грузится до того как загрузилась страница. Несмотря на то, что эта часть у меня в кеше из-за довольно-таки большого массива html подгрузка меню в такой очерёдности убивает около 8-9% по показателю пейджспида от гугла.

Соответственно вопрос: как можно зарендерить это меню в это же место, где оно находится сейчас после загрузки страницы? Может есть параметр, отвечающий за очерёдность загрузки блоков страницы? Самый плохой вариант, как по мне, - это

$(document).ready(function(){
//и как-то тут рендерить
})

Может кто-то знает какой-то виджет или плагин, который позволяет назначать очерёдность загрузки блоков и назначать события по которым они подгружаются? Не охота везде голый Query и Ajax тулить, хочется модулем каким-то.

Oughtem
  • 200
  • что, совсем никаких идей? – Oughtem Jun 11 '21 at 21:17
  • 2
    Пытался вникнуть, не получается понять суть проблемы. Рендерится всё в том порядке, в котором оно прописано в шаблоне. Как может быть иначе? Пейджспид помойка, обращать на это внимание себе дороже обычно. Но можно либо рендерить вот так, либо вынести меню в рендеринг асинхронный (делать ajax запрос после загрузки страницы) и отдавать html через renderPartial. Если подключаете шаблоны из той же директории, где layout, то достаточно просто прописать название, без указания разделителей и пути до туда (но это так, просто в глаза бросилось). – Floyat Jun 21 '21 at 07:52
  • Вставьте кусок в виде HTML разметки и все, что это меню меняется каждые пять минут в зависимости от силы ветра? – Leonid Jun 21 '21 at 08:58

2 Answers2

0

А нельзя повесить на событие данный рендер? Нашел в доке, что можно инитить и триггерить свои ивенты. Соответственно возможно это вам и надо? Так же увидел вот такие события на одном из форумов, сам не проверял:

Компонент представления yii\base\View :

  1. EVENT_AFTER_RENDER
  2. EVENT_BEFORE_RENDER
  3. EVENT_END_PAGE
  4. EVENT_BEGIN_PAGE
0

Вы пытаетесь решить проблему не стой стороны. Вместо лечения причины - лечите последствия. Найдите причину тормозов из-за рендеринга menu - долгие запросы в БД, подгрузка со сторонних ресурсов, файл лежит на подмапленном по ssh с другого сервера разделе, файл лежит на битых секторах диска и тд и тп.

А подгрузка после загрузки страницы проблемы не решит - ну увидит пользователь ajax-loader вместо меню в течении нескольких секунд пока идет подгрузка - думаете это спасет ситуацию? Пользователь нонче вредный, может фыркнуть и свалить с сайта который по его мнению подтормаживает...