it-blog.club
Почему нельзя использовать логику скриптов в кешируемых областях?

Почему нельзя использовать логику скриптов в кешируемых областях?

Ответ прост, ваш скрипт закешируется и в случае передачи на страницу других параметров, он просто напросто не отработает по новому.

Ну вот например у вас есть карта на странице, и (сейчас будет пример для 1С Битрикс) под картой у вас красивенько выводятся элементы из инфоблока Города.

При клике на город на карте должны меняться координаты, при этом БЕЗ перезагрузки страницы. Допустим , что всё у вас прекрасно отрабатывает, координаты меняются, тот элемент на который вы кликнули, перекрашивается в стили активного.

Так же у вас например есть каталог услуг, при этом какая либо услуга оказывается в определённом городе. Всё супер и всё отлично, вы даже решили, что было бы круто, разместить на детальной сстраницы услуга ссылку города, которая будет вести на станицу контактов (та самая с картой и списком городов), и делать определённый город активный.

Проследите ещё раз. Есть контакты, на которых карта, и список городов, при клике на город, делаем его активным и меняем координаты на карте. По эмолчанию, у нас первый город и есть активный.

Далее, детальная услуг, на каждой детально свой город, с ссылкой на контакты, переходя по которой, на конечно страницы, нужной город должен стать активным.

Реализуем это передачей парамтра GET в урле.

/contacts/?CITY=Шахты

Теперь мы перешли на нашу страницу передав нужный параметр. Далее у нас есть 2 пути, либо делать это на PHP, либо на JS. JS я сразу откидываю, так как он исполнится в самом конце, после загрузки всех страницы, а при плохой скорости, у нас загрузится страница, с первым активным элементом, а потом резко переключится на нужный. Будет походе на баг если честно.

И так, будет это делать на PHP. Самое простое это просто проверять наш параметр, сравнивать и делать активным тот элемент, название которого совпало. Вот так и сделаем.

Например наш список городов выводится на контакты через news.list компонент, разумеется, у вас может быть и по другому, но я просто уверен что в 80% случаев, список элементов выводится именно ньюс листом.  Лезем в шаблон нашего компонента.


//Тут код карты, ниже выводим список городов
foreach($arResult[‘ITEMS’] as $item){?>
<div class=”<?=$_REQUEST[‘CITY’] == $item[‘NAME’] ? ‘active’ : ‘not-active’?>” координаты и прочее служебное><?=$item[‘NAME’]?></div>
<?}

Собственно вот, у нас будет делать активным тот город, который передали в параметрах. Кстати, я упустил проверку на вообще наличие реквеста, не забывайте, что мы можем ведь и просто попасть на страницу с контактами, тогда должен становиться активным первый город. Ну это уже другая история.

Вроде бы всё хорошо, но нет. Не так просто. Зайдите на страницу передав в параметре город (например Москва), а потом замените город (на Шахты) в параметре и у вас всё равно откроется Москва. Это всё потому что ваш скрипт закешировался и теперь посетителю просто отдаётся страничка, не производя каких либо логических вычислений.

Никогда не используйте логику в шаблонах компонентов. Тоже самое касается и вызовов других компонентов!

Данный пример можно решить довольно просто. Незачем нам проверять $_REQUEST в шаблоне компонента. Сделаем это прямо в index.php наших контактов. А именно там где вызывается наш news list.

Вам необходимо создать новый параметр для компонента. Прописываем его в . parameters.php и в вызове компонента. Например создадим параметр SELECT_CITY. Ну и при вызове укажем


‘SELECT_CITY’=>$_REQUEST[‘CITY’]

Не стоит забывать, что кеширование страниц происходит в зависимости от параметров компонента. При изменении параметров, происходит новое кеширование, с новыми параметрами компонента. И вот тут то мы можем и поставить наше условие, только уже не от реквеста, а от $arParams


//Тут код карты, ниже выводим список городов
foreach($arResult[‘ITEMS’] as $item){?>
<div class=”<?=$arParams [‘SELECT _CITY’] == $item[‘NAME’] ?‘active’ : ‘not-active’?>” координаты и прочее служебное><?=$item[‘NAME’]?></div>
<?}

Благодаря этому, мы можем спокойно передавать название городов в урле. Да и не только городов, на самом деле, это только один пример, из огромного количества других.


it-blog.club 389
Автор: Ярослав Хмель


Если Вам понравилась статья, то можете поддержать блог переведя N сумму на кофе авторам или оплату хостинга!
В любом случае спасибо! А так же не забывайте про группу в ВК
ПОИСК ПО САЙТУ
Поддержать