-
Notifications
You must be signed in to change notification settings - Fork 0
Home
Под окружением понимается набор параметров определённых для текущего посетителя сайта, например
- язык сайта,
- регион посетителя
- тема сайта
- часовой пояс
- тема сайта.
Расширение предоставляет интерфейс для определения этих параметров без наделения их смыслом. Предполагается, что за смысл и реализацию параметров окружения отвечают другие расширения. Делать многоязычный сайт с помощью этого расширения или как-то по другому остаётся на выбор, сама возможность не обязывает в окружении сохранять всё. Целесообразность определяется тем, что для каждого набора будет создаваться отдельный кэш и на сервере и в браузере. Кэш это и причина и препятствие для хранения всего в окружении.
По смыслу окружение в данном понятии похоже на локаль в php.
Каждому набору параметров в окружении даётся какое-то сокращённое имя. Например окружение samara может содержать в себе информацию и о регионе, и языке.
Параметры могу по разному комбинироваться имя может состоять из нескольких частей. Например, samara-en-def. Смысл и формула по которой формируется имя определяется конкретной реализацией.
Также с подключением окружения у любой страницы будет канонический адрес без информации об окружении и множество адресов содержащих имя окружения.
- /contacts - канонический
- /samara/contacts
- /ru/contacts
- /3diT4/contacts
На страницах с окружением все ссылки остаются в каноническом виде. Поисковые системы индексируют только канонические адреса сайта. Соответственно многоязычный сайт в данной реализации хоть и имеет свои адреса для отдельных языков продвигается только единственный канонический адрес. Серверная часть канонического адреса кэшируется с помощью заголовков Etag и modified. Имя окружения попадает в Etag определяет глобальных кэш серверного ответа и также отдельные параметры из окружения или всё имя окружения попадает в остальные условия кэширования Access::cache Cache::exec.
Боты поисковых систем заходят на сайт с разными IP и в каждом случае будет сформировано нужное окружение. Предполагается, что поисковая система понимает, что содержание сайта зависит от региона и проиндексирует версии для всех регионов в отдельности для участия в поиске по разным регионам, единственный адрес.
Имя окружения хранится в cookie. -env=samara Если его нет, определяется автоматически. Если есть, будет использоваться установленное. Если имя окружения в cookie конфликтует с именем в адресе, использоваться будет имя из адреса, а значение в cookie обновляется на новое. Для смены окружения устанавливается новое значение в cookie и выполняется Controller::check(); зависимые слои обновятся.
Если каноническая страница содержит заголовки кэширования public изменение окружения не запомнится в локальном кэше. Эта проблема как-раз и решается своими адресами для каждого окружения. Это сбрасывает локальный кэш браузера, но остаётся проблема кэша канонической страницы, так как редиректы не используются.
При посещении канонической страницы, содержание, которой берётся из локального кэша, скрипт сравнивает имя окружения собранной страницы с именем окружения хранящегося в cookie и если они разные выполняется location.reload(true);. Если посетитель перейдёт на новую страницу и снова обновит страницу и получит локальный новый-старый кэш reload сработает снова. При обновлении страницы со старым Etag c сервера придёт новый Etag и новый ответ попадёт в локальный кэш. Повторный заход пользователя на каноническую страницу не потребует вызова reload, так как cookie окружения совпадёт с окружением сгенерированной страницы.
Параметры окружения от которых зависит содержание ресурсов должны явно передаваться в адресе. php скрипты не могут использовать имя из кукиса для получения параметров, так как это приведёт к ошибкам в кэше. Если содержание меняется значит должен быть новый адрес, это обязывает передавать параметры в GET аргументах.
Интерфейс доступа к параметрам окружения по имени окружения используется только в шаблонах html и шаблонах адресов до данных.
{~env.region}, {~env.lang}
Переадресация не используются.
Для этого есть две функции одна по набору параметров создаёт имя, другая по имени возвращает набор параметров.
Env::set($obj);
Env::get($name);
Включается-разрабатывается отдельно если нужно. А зачем? Подменяется в Crumb одна крошка. Она как бы для контроллера становится невидимой.
Если страница не зависит от окружения для браузера это значение не имеет будет создаваться локальный кэш для каждого окружения страинцы. Предполагается, что окружения у пользователя меняться не будет и нагрузки браузеру это не добавит. На сервере каждое окружение будет определять свой серверный кэш генерируемый контроллером для всех слоёв. Серверный кэш отдельных слоёв уже определяется отдельными параметрами и вслепую для всех окружений не делается. К имени окружения привязывается только кэш всех слоёв контроллера, тогда как все другие расширения явно указывают от каких параметров из окружения зависят и эти параметры берутся из адресной строки. Другим словами везде, где кэш привязан к адресу, теперь же нужно учитывать, что адрес не идентифицирует содержание и нужно учитывать имя текущего окружения Env::name().
Управляются по логике infrajs/mark по адресу /-env/?mark=sdw:lang=eng. Так как проверка устанавливаемых значений происходит на сервере, клиент не может полагаться, что значение установится.
/-env/?mark=sdw:lang=eng установит новый cookie если значение применится и возвращает все параметры.
На клиенте после изменения запускается check(); Env.get(name) возвращает актуальное значение параметра и зависимые слои обновляются.
Нужно определить функцию определения значения по умолчанию. Например, новый параметр region и вот функция, которая его определяет.
Нужно определить функцию проверки параметра устанавливаемого пользователем Если новое значение проверку не проходит текущее значение не меняется.