Redirect
Материал из Eludia.
Описание
Генерирует ответ-перенаправление на заданный URL.
1-й параметр задаёт целевой URL. Этот аргумент может быть задан в 2 разных формах:
- строкой — в этом случае он используется как есть, URL rewriting гне работает до такой степени, что не подставляется даже параметр sid;
- хэшем — в этом случае URL-строка генерируется при помощи create_url и, соответственно, туда входят со своими значениями все параметры $_REQUEST, имена которых не начинаются на '_'.
2-й параметр — набор опций, главная из которых — kind — может принимать 2 значения:
- http
- перенаправление осуществляется при помощи HTTP-ответа с кодом 302;
- js
- перенаправление производится путём исполнения javaScript.
В последнем случае, помимо того, что целевым окном браузера может оказаться не текущее, а другое (например, охватывающий фрейм). Это управляется опцией target.
Кроме того, в js-варианте перед уходом с текущего адреса можно исполнить произвольный js-код. Он задаётся опцией before. Наиболее ходовой вариант before — выбрасывание alert с заданным сообщением. Если это всё, что Вам нужно, достаточно задать только его текст в виде опции label.
Шаг вперёд и шаг вбок
Когда серверная процедура перенаправляет клиента на заданный URL, под этим может подразумеваться одно из двух:
- указание нового экрана, на который требуется перейти после выполнения некоторого действия (шаг вперёд);
- подмена запрашиваемого экрана тем, который, по Вашему мнению, больше подходит в данной ситуации (шаг вбок).
Разница между этими 2 вариантами заключается в том, какая ссылка будет генерироваться функцией esc_href:
- для шага вперёд возврат будет произведён туда, откуда звали redirect;
- для шага вбок — туда, откуда звали то, что вызвало redirect.
А зачем вообще требуется обманывать историю навигации и шагать вбок? Рассмотрим пример: экран типа "карточка документа" (docs). С документом у текущего пользователя может быть связана актуальная задача визирования. Причём, если это так, то пользователь должен видеть карточку другого типа: не docs, а docs_to_appprove. В этом случае имеет смысл вписать в get_item_of_docs фрагмент:
if ($my_approve_task -> {id}) {
redirect ({type => 'docs_to_appprove'}, {keep_esc => 1});
}
Опция keep_esc здесь — это и есть признак шага вбок.
Синопсис
redirect ({type => 'users'}); # параметры, кроме type, наследуются
redirect ("/?type=users&sid=$_REQUEST{sid}"); # не наследуется даже sid
redirect ("/?type=users", {
kind => 'js',
label => 'Перенаправление. Ждите ответа...',
before => 'void(0)', # это для примера
target => '_self', # как правило, по умолчанию распознаётся правильно
});
