Камрады, привет!
Каким образом добавить динамическое содержимое в node?
Исходные данные.
Drupal 7. Модули Domain Access, Taxonomy. В Таксономии - города.
Задача. На определенных нодах добавить динамическое содержимое.
Что пробовал.
Через редактирование ноды добавлял в нее php-код, в котором брал значение из глобального массива _SESSION.
Описываю действия:
Выбираю город, перехожу на соответствующий домен, открываю ноду. Значение из глобального массива - ОК.
Меняю город, соответственно открывается эта же нода, но на другом поддомене. Но динамическое содержимое остается с прошлой сессии. Помогает только ctrl+f5.
Я так понимаю, что при смене поддомена содержимое ноды берется из кэша.
Как мне решить поставленную задачу - для разных поддоменов на ноде выводить разную информацию?
Подскажите, пожалуйста, в какую сторону начать "копать"?
Комментарии
Странный кейс.
Во-первых, я не уверен, что сессия ребилдится при смене домена или как у вас вообще меняется там значение.
Во-вторых, CTRL+F5 вы кеш друпала не сбросите никакой.
Ставьте более точно задачу
Вангую, это все делается через views.
Во-первых, объясните, что за динамическое содержимое, возможно, хватит вьюса с контекстным фильтром.
Во-вторых, лучше писать не в сессию, а в куки.
Ну или вообще получать "динамическое содержимое " с помощью java script. И не придётся ломать кеш сервера, кеш сущностей, кеш браузеров, прокси, шмокси и тд
Камрады, привет! Извините за долгое отсутствие.
Вопрос маленько изменю, так как в некоторых вещах пришло понимание, но над одной "странностью" сломал голову.
И так. Исходные данные не изменились: 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'] верное во всех местах. И если тут же набрать в адресной строке любой другой поддомен, то в подвале будет значение из предыдущего сеанса.
Вопрос. Куда мне начать смотреть? Почему так происходит?
Зачем? Я так понимаю каждому городу свой поддомен? Почему не использовать поддомен чтоб получить текущий город?
Что именно зачем?
В принципе по поддомену и выбирается город, он и заносится в глобальную переменную. Или Вы имели в виду зачем он туда заносится?
То есть, например, сделать функцию, возвращающую название города по поддомену и вызывать ее в тех местах где надо?
Ну, да. Зачем этот огород с сессиями?
static $name;
if (!$name){
$name = 'получаете имя';
}
return $name;
}
Ну да! Это логично и правильно с точки зрения программирования.
Но, с другой стороны получается, что функция будет вызваться по несколько раз на одной и той же странице. Не проще вызвать ее один раз при формировании страницы, запомнить город в глобальной переменной и пользоваться ей?
Осталось понять где это место - "при формировании страницы".
Обычно для этого используются контексты.
Как думаете для чего возле переменной стоит ключевое слово static?
С точки зрения программирования, мы именно программированием и занимаемся.
Даже если допустить, что вам нужна глобальная переменная... Но сессия то вам зачем?
Понятно. Не теряем значение переменной после выхода из функции.
А подскажите, откуда правильнее осуществлять то самый единственный вызов функции?
На счет зачем сессия. Я не знаю, судя по обсуждениям - она не нужна. Так же как и глобальная переменная.
Но, мне кажется, была задумка брать информацию из куков, чтобы открывать пользователю тот домен, на котором он был в последнем сеансе.
Определять предпочтительный город/поддомен и выводить текущий город - это разные задачи, разные функции.
Определять предпочтение надо как можно раньше (в инициализиции, в миддлварах где-нить), чтоб в случае чего редиректнуть на желаемый домен. А получить имя текущего города - это уже что-то где-то возле вьюсов и шаблонов.
Уважаемый камрад.
Не могли бы Вы дать мне ссылку (или ссылки) на материал, что бы почитать про " ... в инициализиции, в миддлварах где-нить ..."?
Например, ранее попытался найти что-нибудь про хук _boot(), упомянутый в посте. Не нашел. Я понимаю, что, скорей всего, плохо искал, но факт остается фактом. Поэтому сразу прошу ссылку на ресурс, тем более, я уверен, Вы намного лучше ориентируетесь в материалах по drupal.
Благодарю.
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? В какой последовательности происходит формирование страниц?
Логично предположить, что рендер контента блока происходит раньше чем срабатыават ваш альтер. Именно по этому нужна не глобальная переменная, а геттер функция , которая получает данные если их нет и потом возвращает.
Уважаемый камрад, огромное Вам спасибо за терпеливое внимание к моим вопросам.
Не могли бы Вы еще ответить на один?! Я как раз понимал, что разное значение из-за разного момента времени появления (т.е. рендера) кусков страниц. Искал информацию о том, в какой последовательности движок drupal создает контент. Не нашел.
Есть ли у Вас ссылка и на эту тему? Заранее благодарю.
Ссылки нет. Но в вашей ситуации и не требуется знать последовательность если вы будите использовать функцию с кешированием результата в статик переменной. Первый вызов функции (из любого места) всегде будет получать данные, остальные вызовы будут использовать уже "сохранённое" значение. Не важно, кто будет первым, шаблон или блок.
Еще раз, большое Вам спасибо.