1С-Битрикс. D7: пример работы с сущностями Request, Response и Server
Небольшой пример работы с сущностями Request, Response и Server на новом ядре D7.
В моём примере мы проверим, что пришёл запрос методом POST, добавим значение в куку, полученную из объекта Request и средиректим на нужный адрес, отправив заголовки.
Пример кода
use Bitrix\Main; use Bitrix\Main\Context; use Bitrix\Main\Web\Cookie; define('NEED_AUTH', true); require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/header.php'); $request = Context::getCurrent()->getRequest(); $response = Context::getCurrent()->getResponse(); $server = Context::getCurrent()->getServer(); if ($request->isPost()) { $response->addCookie( new Cookie( 'selftest-filter-section-include-sub', trim((string)$request->getPost('selftest-filter-section-include-sub')) ) ); $filterPostSection = array_filter((array)$request->getPost('selftest-filter-section')); if (!empty($filterPostSection)) { $response->addCookie(new Cookie('selftest-filter-section', implode(',', $filterPostSection))); $response->addHeader('Location', '/path/to/url/'); $response->flush(); } } require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/footer.php');
Код выдран из проекта и зависит, конечно, от контекста.
Получение куки на новом ядре D7
use Bitrix\Main\Context; require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/header.php'); $request = Context::getCurrent()->getRequest(); $someCookie = $request->getCookie('some-cookie');
При работе с куками через API битрикса, не забываем, что каждой куки автоматически добавляется префикс, который формируется так:
$cookiePrefix = \Bitrix\Main\Config\Option::get('main', 'cookie_name', 'BITRIX_SM') . '_';
9 комментариев
В чем отличие от классических переменных PHP?
Отличий много. Начиная от хорошего тона и заканчивая ошибками.
Примеры.
хорошим тоном считается когда данные фильтруют поэтому код
по урл /test_filter_vars.php?id=user_value1
выдает
string(11) "user_value1"
т.е. при использовании фильтра используется оригинальное значение а не которое задано в рантайме.
при этом мы получаем 1 строку кода вместо 10 и повышаем читабельность.
про установку куки https://dev.1c-bitrix.ru/api_help/main/reference/cmain/set_cookie.php пишется в одну строку и тоже не имеем проблем с префиксом названия куки
Для такой возможности придётся поставить отдельное расширение для php, которое не на каждом сервере есть.
При использовании внутри тела функции одной строкой не отделаться. Да и использование глобальных переменных — моветон.
Кроме того, CMain::set_cookie использует при вызове сразу setcookie. Это по спецификации HTTP-протокола подразумевает, что до её вызова не должно быть никакого вывода. Отсюда нужны костыли с буферизацией вывода. Новое ядро решает эту проблему: \Bitrix\Main\HttpResponse::addCookie(), не используя setcookie, складывает куки в хранилище и куки(заголовки) выплёвываются методом \Bitrix\Main\Response::flush() в самом-самом конце, отработавшей страницы.
http://php.net/manual/ru/filter.installation.php " Начиная с версии PHP 5.2.0 расширение filter включено по умолчанию. До этой версии использовалось экспериментальное PECL-расширение, однако, оно больше не обновляется и поэтому не рекомендуется к использованию. "
Не подскажете откуда инфа? Я не нашел данной информации на официальном сайте PHP - http://php.net/
Ага, документацию я умею читать. Я вам говорю исходя из собственного опыта. Не раз сталкивался, что на шаред-хостинге это расширение было выключено.
Область видимости переменной - даже там есть абзац, про неожиданное поведение.
В общем-то, если для вас всё это в порядке вещей, то нам по разные стороны дороги.
Покажите пожалуйста где на этом сайте четко указано что глобальные переменные моветон или deprecated - и не рекомендуются использовать вообще в разработке PHP. Все deprecated функции они регулярно четко указывают и удаляют в последующих версиях PHP. в случае глобальных PHP переменных я не вижу данной информации. Быть может разработчикам PHP лучше знать что такое моветон а что нет? Чем изобретателям чудоспасительныз фреймворков и не имеющих никакого отношения к разработке ядра PHP?
это подчеркиваю - стандартное расширение входящее в php. Bitrix требует минимальной версии php 5.3 как это расширение может быть не установлено? http://www.1c-bitrix.ru/products/cms/requirements.php и И даже в этом случае - на всех нормальных хостингах есть возможность вручную включить расширения.
а как тут лайки ставить?