first commit
This commit is contained in:
@@ -0,0 +1,218 @@
|
||||
<?php if (!defined('FW')) die('Forbidden');
|
||||
|
||||
/**
|
||||
* Set flash messages
|
||||
**
|
||||
* Store messages in session (to not be lost between redirects) and remove them after they were shown to the user
|
||||
*/
|
||||
class FW_Flash_Messages
|
||||
{
|
||||
private static $available_types = array(
|
||||
// 'type' => 'backend class/type' (only 2 backend types exists: error and updated)
|
||||
'error' => 'error',
|
||||
'warning' => 'update-nag',
|
||||
'info' => 'updated',
|
||||
'success' => 'updated'
|
||||
);
|
||||
|
||||
private static $session_key = 'fw_flash_messages';
|
||||
|
||||
private static $frontend_printed = false;
|
||||
|
||||
private static function get_messages()
|
||||
{
|
||||
$messages = FW_Session::get(self::$session_key);
|
||||
|
||||
if (empty($messages) || !is_array($messages)) {
|
||||
$messages = array_fill_keys(array_keys(self::$available_types), array());
|
||||
}
|
||||
|
||||
return $messages;
|
||||
}
|
||||
|
||||
private static function set_messages(array $messages)
|
||||
{
|
||||
FW_Session::set(self::$session_key, $messages);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove messages with ids from pending remove
|
||||
*/
|
||||
private static function process_pending_remove_ids()
|
||||
{
|
||||
$pending_remove = array();
|
||||
|
||||
foreach (self::get_messages() as $messages) {
|
||||
if (empty($messages)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach ($messages as $message) {
|
||||
if (empty($message['remove_ids'])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach ($message['remove_ids'] as $remove_id) {
|
||||
$pending_remove[$remove_id] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($pending_remove)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$types = self::get_messages();
|
||||
|
||||
foreach ($types as $type => $messages) {
|
||||
if (empty($messages)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach ($messages as $id => $message) {
|
||||
if (isset($pending_remove[$id])) {
|
||||
unset($types[$type][$id]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
self::set_messages( $types );
|
||||
}
|
||||
|
||||
/**
|
||||
* Add flash message
|
||||
**
|
||||
* @param string $id Unique id of the message
|
||||
* @param string $message Message (can be html)
|
||||
* @param string $type Type from $available_types
|
||||
* @param array $removed_ids Remove flashes with this id(s)
|
||||
* (For e.g. your message is success and some known error messages ids needs to be removed
|
||||
* because they are not relevant anymore, your success message suppress/cancels them)
|
||||
*/
|
||||
public static function add($id, $message, $type = 'info', array $removed_ids = array())
|
||||
{
|
||||
if (!isset(self::$available_types[$type])) {
|
||||
trigger_error(sprintf(__('Invalid flash message type: %s', 'tfuse'), $type), E_USER_WARNING);
|
||||
$type = 'info';
|
||||
}
|
||||
|
||||
$messages = self::get_messages();
|
||||
|
||||
$messages[$type][$id] = array(
|
||||
'message' => $message,
|
||||
'remove_ids' => $removed_ids,
|
||||
);
|
||||
|
||||
self::set_messages($messages);
|
||||
}
|
||||
|
||||
/**
|
||||
* Use this method to print messages html in backend
|
||||
* (used in action at the end of the file)
|
||||
* @internal
|
||||
*/
|
||||
public static function _print_backend()
|
||||
{
|
||||
if (!session_id()) {
|
||||
return; // fixes https://github.com/ThemeFuse/Unyson/issues/2219
|
||||
}
|
||||
|
||||
self::process_pending_remove_ids();
|
||||
|
||||
$html = array_fill_keys(array_keys(self::$available_types), '');
|
||||
|
||||
$all_messages = self::get_messages();
|
||||
|
||||
foreach ($all_messages as $type => $messages) {
|
||||
if (!empty($messages)) {
|
||||
foreach ($messages as $id => $data) {
|
||||
$html[$type] .=
|
||||
'<div class="'. self::$available_types[$type] .' fw-flash-message">'.
|
||||
'<p data-id="'. esc_attr($id) .'">'. $data['message'] .'</p>'.
|
||||
'</div>';
|
||||
|
||||
unset($all_messages[$type][$id]);
|
||||
}
|
||||
|
||||
$html[$type] = '<div class="fw-flash-type-'. $type .'">'. $html[$type] .'</div>';
|
||||
}
|
||||
}
|
||||
|
||||
unset($success, $error, $info);
|
||||
|
||||
self::set_messages($all_messages);
|
||||
|
||||
echo '<div class="fw-flash-messages">'. implode("\n\n", $html) .'</div>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Use this method to print messages html in frontend
|
||||
* @return bool If some html was printed or not
|
||||
*/
|
||||
public static function _print_frontend()
|
||||
{
|
||||
self::process_pending_remove_ids();
|
||||
|
||||
$html = array_fill_keys(array_keys(self::$available_types), '');
|
||||
$all_messages = self::get_messages();
|
||||
|
||||
$messages_exists = false;
|
||||
|
||||
foreach ($all_messages as $type => $messages) {
|
||||
if (empty($messages)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach ($messages as $id => $data) {
|
||||
$html[$type] .= '<li class="fw-flash-message">'. nl2br($data['message']) .'</li>';
|
||||
|
||||
unset($all_messages[$type][$id]);
|
||||
}
|
||||
|
||||
$html[$type] = '<ul class="fw-flash-type-'. $type .'">'. $html[$type] .'</ul>';
|
||||
|
||||
$messages_exists = true;
|
||||
}
|
||||
|
||||
self::set_messages($all_messages);
|
||||
|
||||
self::$frontend_printed = true;
|
||||
|
||||
if ($messages_exists) {
|
||||
echo '<div class="fw-flash-messages">';
|
||||
echo implode("\n\n", $html);
|
||||
echo '</div>';
|
||||
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static function _frontend_printed()
|
||||
{
|
||||
return self::$frontend_printed;
|
||||
}
|
||||
|
||||
public static function _get_messages($clear = false)
|
||||
{
|
||||
self::process_pending_remove_ids();
|
||||
|
||||
$messages = self::get_messages();
|
||||
|
||||
if ($clear) {
|
||||
self::_clear();
|
||||
}
|
||||
|
||||
return $messages;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear the FW_Flash_Messages messages
|
||||
*
|
||||
* @since 2.6.15
|
||||
*/
|
||||
public static function _clear() {
|
||||
self::set_messages(array());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user