Как правильно установить постоянный файл cookie в Joomla 3.x?


8

Я хотел бы установить «целевой» cookie для всех пользователей на моем сайте, чтобы обслуживать индивидуальный контент. Файл cookie должен сохраняться при входе / выходе, поэтому я не могу использовать jSession, который очищается при входе / выходе.

Я могу добиться этого по старинке

setcookie( "destinationcookie", $_POST['destination'], strtotime( '+90 days' ) );
$destination =  isset($_POST['destination']) ? $_POST['destination'] : $_COOKIE["destinationcookie"];

... но я уверен, что у joomla есть куда лучше спрятаться. PS - документации по этому практически не существует, насколько я могу найти.


JSession нужен файл cookie для распознавания сессии, но это не одно и то же.
Валентин Деспа

Ответы:


5

Возможно, вы захотите взглянуть на плагин проверки подлинности cookie. Он устанавливает и читает постоянный файл cookie.

Он находится здесь: https://github.com/joomla/joomla-cms/tree/staging/plugins/authentication/cookie

Чтобы прочитать куки, вы можете использовать

$app = JFactory::getApplication();
$cookieValue = $app->input->cookie->get($cookieName);

Чтобы установить куки, вы используете

$app = JFactory::getApplication();
$app->input->cookie->set($cookieName, $cookieValue, time() + $lifetime, $app->get('cookie_path', '/'), $app->get('cookie_domain'), $app->isSSLConnection());

Некоторая документация находится на странице API: http://api.joomla.org/cms-3/classes/JInputCookie.html


Спасибо. пытаясь понять это. Документация не поддается расшифровке новичков, как я. Не могли бы вы показать мне, как установленный cookie применяется конкретно в моем случае? Как мне установить время жизни и для чего нужна ссылка на ssl?
user2097091

В этом случае $lifetimeпроисходит от параметра в плагине cookie. Аргумент - это время истечения срока действия куки. Вы просто передаете свою собственную ценность там. Аргумент SSL говорит, что cookie будет действителен только для SSL-соединений. В этом случае он просто смотрит на доступ к странице с использованием SSL и соответственно устанавливает флаг безопасности в куки.
Бакуаль

2

В последний раз, когда я проводил некоторые исследования в этой области (март 2013 года), я нашел это решение, которое не использует JInput:

Я проверил, как JFactory вызывает JSession, но я не нашел способа установить срок действия при хранении данных.

Внутри системного плагина, используя метод onAfterRender()

    $cookie = session_get_cookie_params();

    $cookie['lifetime'] = DESIRED LIFETIME;

    session_set_cookie_params($cookie['lifetime'], $cookie['path'], $cookie['domain'], $cookie['secure'], true);

Единственный недостаток, который я обнаружил, заключался в том, что теперь есть два куки с одинаковым именем и содержанием. Я не заметил никаких побочных эффектов.

Надеюсь это поможет.

Источник: Joomla! Общее развитие ›Установить срок действия сеанса интерфейсного пользователя


2

Попробуйте использовать что-то вроде следующего:

$input  = JFactory::getApplication()->input;
$cookie = $input->cookie;
$post = $input->post;

$cookie->set('destinationcookie', $post->get('destination'), strtotime( '+90 days' ));
$destination =  isset($post->get('destination')) ? $post->get('destination') : $cookie->get($name = 'destinationcookie', $defaultValue = null);

Неустранимая ошибка: невозможно использовать возвращаемое значение метода в контексте записи в /path/to/templates/template/html/com_entrusters/itemform/default.php в строке 28
user2097091

@ user2097091 - Я случайно добавил лишнюю точку с запятой. Обновил код. Можете ли вы попробовать еще раз сейчас?
Лоддер

Вы используете переменную, $inputCookieкоторую вы не определили - не так ли $cookie?
MrWhite

@ w3d - ах, да, плохо. Обновил код. Спасибо за указание на это
Lodder
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.