Как добавить сообщение сеанса после вызова 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';

Я не смог правильно установить флэш-сообщение в сеансе adminhtml, хотя. Я подумал, что смогу назвать что-то вроде:

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).
Питер О'Каллаган
Для тех, кто заинтересован в этом, для того, чтобы заставить его работать правильно, вы должны unset($_SESSION). После этого initперезагрузите сессию правильно.
Питер О'Каллаган
@Cags Я обновил свой ответ, можете ли вы проверить, правильно ли он?
Рик Кейперс
Session_start не требуется, так как он initвызывается как часть вызова метода (в startкотором он вызывается init). Кроме этого, это должно работать.
Питер О'Каллаган
@Cags Спасибо, я обновил свой ответ! Я ценю, что вы вернулись с отзывами :)
Рик Кейперс