Як додати повідомлення сеансу після виклику session_write_close?


9

Ми використовуємо чудовий модуль uRapidFlow від Unirgy, але натрапили на роздратування. Коли ви запускаєте один з їх профілів, вони дзвонять session_write_close. Проблема в цьому полягає в тому, що це означає, що якщо ми хочемо запустити процес з контролера adminhtml, ми не можемо встановити флеш-повідомлення сеансу, щоб повідомити користувача про успіх або спіймані винятки.

Чи можливо перезапустити сеанс після завершення процесу, щоб додати сесійне повідомлення?

Спочатку я не був впевнений, чи можна перезапустити сеанс в PHP, але доказ концепції PHP працює:

session_start();
// if this is the second run, show the value
if (!empty($_SESSION['foo'])) {
    echo $_SESSION['foo'], PHP_EOL;
}
// set an initial value
$_SESSION['foo'] = 'bar';

// start running profile
session_write_close();
// after running profile
session_start();
// set a value to see if it takes
$_SESSION['foo'] = 'foo';

Я не зміг правильно встановити флеш-повідомлення на сесії адміністратора. Я думав, що можу щось зателефонувати:

Mage::getSingleton('adminhtml/session')
    ->init('core', 'adminhtml')
    ->addSuccess('Whoop');

Але це, здається, не працює.


Якщо ви хочете показати повідомлення клієнтові під час виконання профілю, ви можете скористатися $ pofile-> getLogger (), щоб отримати екземпляр реєстратора та передати йому повідомлення. Це не те саме, що показувати їх на сторінці, але ви будете мати записи про них
Петро Джамбазов

Відповіді:


4

Це має працювати:

unset($_SESSION);
Mage::getSingleton('adminhtml/session')
    ->init('core', 'adminhtml')
    ->addSuccess('Whoop');

Сеанс не втрачається після session_write_close(), якщо ви хочете записати на сеанс ще раз, вам доведеться його знову відкрити. Доказ концепції:

<?php
session_start();
// if this is the second run, show the value
if (!empty($_SESSION['foo'])) {
    echo $_SESSION['foo'], PHP_EOL;
}
// set an initial value
$_SESSION['foo'] = 'bar';

// start running profile
session_write_close();

// after running profile
session_start();
var_dump($_SESSION);
//// set a value to see if it takes
$_SESSION['test'] = 'foo';

Виклик init на сеансі не призведе до виклику session_start, оскільки він викликається лише у тому випадку, якщо $ _SESSION не встановлено (що, здається, після дзвінка session_write_close).
Peter O'Callaghan

Для всіх, хто зацікавлений у цьому, щоб зробити це правильно, ви повинні unset($_SESSION). Після цього initсеанс буде перезавантажено правильно.
Peter O'Callaghan

@Cags Я оновив свою відповідь, чи можете ви перевірити, чи правильно вона?
Рік Куйперс

Session_start не потрібен, оскільки він викликається як частина initвиклику методу (добре, в startякому викликається init). Крім цього, це повинно працювати.
Пітер О'Каллаган

@Cags Спасибі, я оновив свою відповідь! Дякую, що ви повертаєтесь із відгуками :)
Рік Куйперс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.