Làm thế nào để bạn thêm một thông báo phiên sau khi session_write_c Đóng được gọi?


9

Chúng tôi sử dụng mô-đun uRapidFlow tuyệt vời của Unirgy, nhưng đã gặp một chút phiền toái. Khi bạn chạy một trong những hồ sơ của họ, họ gọi session_write_close. Vấn đề với điều này là điều đó có nghĩa là nếu chúng tôi muốn chạy một quy trình từ bộ điều khiển adminhtml, chúng tôi không thể đặt thông báo flash phiên để thông báo cho người dùng về thành công hoặc bị bắt ngoại lệ.

Có thể khởi động lại phiên sau khi quá trình hoàn tất, để thêm một thông báo phiên?

Ban đầu tôi không chắc liệu có thể khởi động lại một phiên trong PHP hay không, nhưng bằng chứng về khái niệm PHP hoạt động:

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';

Mặc dù vậy, tôi chưa thể đặt chính xác một tin nhắn flash trên phiên adminhtml. Tôi nghĩ rằng tôi có thể gọi một cái gì đó dọc theo dòng:

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

Nhưng điều này dường như không hoạt động.


Nếu bạn muốn hiển thị thông báo cho khách hàng trong quá trình thực thi hồ sơ, bạn có thể sử dụng $ pofile-> getLogger () để lấy phiên bản của logger và chuyển tin nhắn đến nó. Nó không giống như hiển thị chúng trong trang, nhưng bạn sẽ có hồ sơ về chúng
Petar Dzhambazov

Câu trả lời:


4

Điều này sẽ làm việc:

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

Phiên không bị mất sau đó session_write_close(), nếu bạn muốn viết lại phiên, bạn sẽ phải mở lại. Bằng chứng của khái niệm:

<?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';

Gọi init trên phiên sẽ không kích hoạt session_start để được gọi, vì nó chỉ được gọi nếu $ _SESSION không được đặt (có vẻ như là sau khi gọi session_write_close).
Peter O'Callaghan

Đối với bất kỳ ai quan tâm đến việc này, để làm cho nó hoạt động chính xác, bạn phải làm unset($_SESSION). Sau khi làm điều này initsẽ tải lại phiên chính xác.
Peter O'Callaghan

@Cags Tôi đã cập nhật câu trả lời của mình, bạn có thể kiểm tra xem nó có đúng không?
Rick Kuipers

Phiên_start không bắt buộc vì nó được gọi là một phần của lệnh initgọi phương thức (cũng startđược gọi bởi init). Ngoài ra, nó nên hoạt động.
Peter O'Callaghan

@Cags Cảm ơn, tôi đã cập nhật câu trả lời của mình! Tôi đánh giá cao việc bạn quay lại với phản hồi :)
Rick Kuipers
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.