Каким образом добавить динамическое содержимое в node?

Главные вкладки

Аватар пользователя roman-ivannikov roman-ivannikov 9 августа 2019 в 19:34

Камрады, привет!
Каким образом добавить динамическое содержимое в node?

Исходные данные.
Drupal 7. Модули Domain Access, Taxonomy. В Таксономии - города.
Задача. На определенных нодах добавить динамическое содержимое.

Что пробовал.
Через редактирование ноды добавлял в нее php-код, в котором брал значение из глобального массива _SESSION.
Описываю действия:
Выбираю город, перехожу на соответствующий домен, открываю ноду. Значение из глобального массива - ОК.
Меняю город, соответственно открывается эта же нода, но на другом поддомене. Но динамическое содержимое остается с прошлой сессии. Помогает только ctrl+f5.
Я так понимаю, что при смене поддомена содержимое ноды берется из кэша.

Как мне решить поставленную задачу - для разных поддоменов на ноде выводить разную информацию?
Подскажите, пожалуйста, в какую сторону начать "копать"?

Комментарии

Аватар пользователя Semantics Semantics 9 августа 2019 в 20:25
1

Странный кейс.

Во-первых, я не уверен, что сессия ребилдится при смене домена или как у вас вообще меняется там значение.
Во-вторых, CTRL+F5 вы кеш друпала не сбросите никакой.

Ставьте более точно задачу

Аватар пользователя gun_dose gun_dose 9 августа 2019 в 22:30
1

Во-первых, объясните, что за динамическое содержимое, возможно, хватит вьюса с контекстным фильтром.
Во-вторых, лучше писать не в сессию, а в куки.

Аватар пользователя Mnilionic Mnilionic 10 августа 2019 в 0:51
1

Ну или вообще получать "динамическое содержимое " с помощью java script. И не придётся ломать кеш сервера, кеш сущностей, кеш браузеров, прокси, шмокси и тд Smile

Аватар пользователя roman-ivannikov roman-ivannikov 21 августа 2019 в 12:23

Камрады, привет! Извините за долгое отсутствие.
Вопрос маленько изменю, так как в некоторых вещах пришло понимание, но над одной "странностью" сломал голову.
И так. Исходные данные не изменились: Drupal 7. Модули Domain Access, Taxonomy. В Таксономии - города.
Города выбираются из Представления (каждый город в виде гиперссылки со своим параметром). После выбора города происходит переход на соответствующий поддомен.

Весь "хоровод" вертится вокруг глобального массива _SESSION. Так было сделано изначально и сейчас пока не время это менять.

Что и как динамически формируется:
1. Title. Формируется в шаблоне html.tmp.php. Берется значение элемента из глобального массива (далее - _SESSION['city']).
2. Description. Формируется через хук basic_html_head_alter основной темы в файле tempate.php. Также используется _SESSION['city'].
3. _SESSION['city'] обретает значение в файле модуля .module в двух функциях _boot() и _page_alter(). В первой функции глобальное значение берется после определения ip посетителя страницы. Во второй функции глобальное значение заполняется из таксаномии в зависимости от домена. Здесь динамически формируется кусок страницы блока в шапке. Формируется нормально с нужным названием города.
4. В блоке в регионе footer вставил php-код для вывода _SESSION['city']. И вот здесь появилась странность.

Если выбрать город из списка, то все хорошо. И в Title, и в Description, и в подвале подставляется одно и тоже значение.
Но, если перейти на нужный поддомен через адресную строку, то в Title и Description значение будет верным, то есть соответствовать поддомену, а вот в Подвале значение будет из прошлого сеанса.
Например, в браузере с почищенными куками или в безопасном режиме захожу на домен или поддомен, то в Title и Description значение соответствуют городу, а в подвале значение пустое. Если перейти на поддомен через список городов, то значение _SESSION['city'] верное во всех местах. И если тут же набрать в адресной строке любой другой поддомен, то в подвале будет значение из предыдущего сеанса.

Вопрос. Куда мне начать смотреть? Почему так происходит?

Аватар пользователя Mnilionic Mnilionic 21 августа 2019 в 12:37

Зачем? Я так понимаю каждому городу свой поддомен? Почему не использовать поддомен чтоб получить текущий город?

Аватар пользователя roman-ivannikov roman-ivannikov 21 августа 2019 в 13:16

Mnilionic wrote:
Зачем? Я так понимаю каждому городу свой поддомен? Почему не использовать поддомен чтоб получить текущий город?

Что именно зачем?
В принципе по поддомену и выбирается город, он и заносится в глобальную переменную. Или Вы имели в виду зачем он туда заносится?
То есть, например, сделать функцию, возвращающую название города по поддомену и вызывать ее в тех местах где надо?

Аватар пользователя Mnilionic Mnilionic 21 августа 2019 в 13:29
1

То есть, например, сделать функцию, возвращающую название города по поддомену и вызывать ее в тех местах где надо?

Ну, да. Зачем этот огород с сессиями?

function mymodule_current_cityname(){
  static $name;
  if (!$name){
    $name = 'получаете имя';
  }
  return $name;
}
Аватар пользователя roman-ivannikov roman-ivannikov 21 августа 2019 в 21:07

Mnilionic wrote:

Ну, да. Зачем этот огород с сессиями?


Ну да! Это логично и правильно с точки зрения программирования.
Но, с другой стороны получается, что функция будет вызваться по несколько раз на одной и той же странице. Не проще вызвать ее один раз при формировании страницы, запомнить город в глобальной переменной и пользоваться ей?
Осталось понять где это место - "при формировании страницы".

Аватар пользователя Mnilionic Mnilionic 22 августа 2019 в 1:53
1

Как думаете для чего возле переменной стоит ключевое слово static?
С точки зрения программирования, мы именно программированием и занимаемся.
Даже если допустить, что вам нужна глобальная переменная... Но сессия то вам зачем?

Аватар пользователя roman-ivannikov roman-ivannikov 22 августа 2019 в 14:39

Mnilionic wrote:
Как думаете для чего возле переменной стоит ключевое слово static?
С точки зрения программирования, мы именно программированием и занимаемся.
Даже если допустить, что вам нужна глобальная переменная... Но сессия то вам зачем?

Понятно. Не теряем значение переменной после выхода из функции.
А подскажите, откуда правильнее осуществлять то самый единственный вызов функции?
На счет зачем сессия. Я не знаю, судя по обсуждениям - она не нужна. Так же как и глобальная переменная.
Но, мне кажется, была задумка брать информацию из куков, чтобы открывать пользователю тот домен, на котором он был в последнем сеансе.

Аватар пользователя Mnilionic Mnilionic 22 августа 2019 в 19:54
1

Определять предпочтительный город/поддомен и выводить текущий город - это разные задачи, разные функции.
Определять предпочтение надо как можно раньше (в инициализиции, в миддлварах где-нить), чтоб в случае чего редиректнуть на желаемый домен. А получить имя текущего города - это уже что-то где-то возле вьюсов и шаблонов.

Аватар пользователя roman-ivannikov roman-ivannikov 23 августа 2019 в 9:14

Mnilionic wrote:
Определять предпочтительный город/поддомен и выводить текущий город - это разные задачи, разные функции.
Определять предпочтение надо как можно раньше (в инициализиции, в миддлварах где-нить), чтоб в случае чего редиректнуть на желаемый домен. А получить имя текущего города - это уже что-то где-то возле вьюсов и шаблонов.

Уважаемый камрад.
Не могли бы Вы дать мне ссылку (или ссылки) на материал, что бы почитать про " ... в инициализиции, в миддлварах где-нить ..."?
Например, ранее попытался найти что-нибудь про хук _boot(), упомянутый в посте. Не нашел. Я понимаю, что, скорей всего, плохо искал, но факт остается фактом. Поэтому сразу прошу ссылку на ресурс, тем более, я уверен, Вы намного лучше ориентируетесь в материалах по drupal.
Благодарю.

Аватар пользователя roman-ivannikov roman-ivannikov 26 августа 2019 в 7:06

Mnilionic wrote:
https://api.drupal.org/api/drupal/modules%21system%21system.api.php/func...

Камрад, благодарю.
Не могли бы Вы помочь мне разобраться еще в одном вопросе, связанным с темой.
Я уже эту ситуацию описывал. Опишу еще раз.
Значение глобальной переменной использовалось в нескольких местах:
1. Шаблон html.tmp.php;
2. В tempate.php в функции basic_html_head_alter. Basic - название основной темы;
3. В файле модуля в функции page_alter();
4. В одно из блоков в регионе Подвал в php-коде.

Почему значение этой глобальной переменной в местах из пунктов 1-3 отличается от значения в месте из пункта 4? В какой последовательности происходит формирование страниц?

Аватар пользователя Mnilionic Mnilionic 26 августа 2019 в 15:02
1

Логично предположить, что рендер контента блока происходит раньше чем срабатыават ваш альтер. Именно по этому нужна не глобальная переменная, а геттер функция , которая получает данные если их нет и потом возвращает.

Аватар пользователя roman-ivannikov roman-ivannikov 28 августа 2019 в 18:31

Mnilionic wrote:
Логично предположить, что рендер контента блока происходит раньше чем срабатыават ваш альтер. Именно по этому нужна не глобальная переменная, а геттер функция , которая получает данные если их нет и потом возвращает.

Уважаемый камрад, огромное Вам спасибо за терпеливое внимание к моим вопросам.
Не могли бы Вы еще ответить на один?! Я как раз понимал, что разное значение из-за разного момента времени появления (т.е. рендера) кусков страниц. Искал информацию о том, в какой последовательности движок drupal создает контент. Не нашел.
Есть ли у Вас ссылка и на эту тему? Заранее благодарю.

Аватар пользователя Mnilionic Mnilionic 28 августа 2019 в 18:51
1

Ссылки нет. Но в вашей ситуации и не требуется знать последовательность если вы будите использовать функцию с кешированием результата в статик переменной. Первый вызов функции (из любого места) всегде будет получать данные, остальные вызовы будут использовать уже "сохранённое" значение. Не важно, кто будет первым, шаблон или блок.

Аватар пользователя roman-ivannikov roman-ivannikov 28 августа 2019 в 19:02

Mnilionic wrote:
Ссылки нет. Но в вашей ситуации и не требуется знать последовательность если вы будите использовать функцию с кешированием результата в статик переменной. Первый вызов функции (из любого места) всегде будет получать данные, остальные вызовы будут использовать уже "сохранённое" значение. Не важно, кто будет первым, шаблон или блок.

Еще раз, большое Вам спасибо.