Files
iTop/datamodels/2.x/itop-portal-base/portal/src/Helper/SessionMessageHelper.php

183 lines
4.9 KiB
PHP

<?php
/**
* Copyright (C) 2013-2020 Combodo SARL
*
* This file is part of iTop.
*
* iTop is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* iTop is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
*/
namespace Combodo\iTop\Portal\Helper;
use ArrayIterator;
use IteratorAggregate;
use Symfony\Component\DependencyInjection\ContainerInterface;
use utils;
/**
* Class SessionMessageHelper
*
* @package Combodo\iTop\Portal\EventListener
* @since 2.7.0
*/
class SessionMessageHelper implements IteratorAggregate
{
/** @var string ENUM_SEVERITY_INFO */
const ENUM_SEVERITY_INFO = 'info';
/** @var string ENUM_SEVERITY_OK */
const ENUM_SEVERITY_OK = 'ok';
/** @var string ENUM_SEVERITY_WARNING */
const ENUM_SEVERITY_WARNING = 'warning';
/** @var string ENUM_SEVERITY_ERROR */
const ENUM_SEVERITY_ERROR = 'error';
/** @var string DEFAULT_SEVERITY */
const DEFAULT_SEVERITY = self::ENUM_SEVERITY_INFO;
/** @var \Symfony\Component\DependencyInjection\ContainerInterface $oContainer */
private $oContainer;
/** @var array $aAllMessages */
private $aAllMessages = array();
/**
* SessionMessageHelper constructor.
*
* @param \Symfony\Component\DependencyInjection\ContainerInterface $oContainer
*/
public function __construct(ContainerInterface $oContainer)
{
$this->oContainer = $oContainer;
}
/**
* Add a message to the session messages to be fetch later.
* Will be for this portal only.
*
* @param string $sId
* @param string $sContent
* @param string $sSeverity
* @param array $aMetadata An array of key => scalar value
* @param int $iRank
*/
public function AddMessage($sId, $sContent, $sSeverity = self::DEFAULT_SEVERITY, $aMetadata = array(), $iRank = 1)
{
$sKey = $this->GetMessagesKey();
if(!isset($_SESSION['obj_messages'][$sKey]))
{
$_SESSION['obj_messages'][$sKey] = array();
}
$_SESSION['obj_messages'][$sKey][$sId] = array(
'severity' => $sSeverity,
'rank' => $iRank,
'message' => $sContent,
'metadata' => $aMetadata,
);
}
/**
* Remove the message identified by $sId (for this portal) from the session messages
*
* @param string $sId
*/
public function RemoveMessage($sId)
{
$sKey = $this->GetMessagesKey();
if(isset($_SESSION['obj_messages'][$sKey][$sId]))
{
unset($_SESSION['obj_messages'][$sKey][$sId]);
}
}
/**
* @return \ArrayIterator|\Traversable
*/
public function getIterator()
{
$this->FetchMessages();
return new ArrayIterator($this->aAllMessages);
}
/**
* Return the key under which the session messages of the portal are stored ("GUI:<PORTAL_ID>")
*
* @return string
*/
private function GetMessagesKey()
{
return 'GUI:' . $this->oContainer->getParameter('combodo.portal.instance.id');
}
/**
* Fetch session messages and delete them afterwards
* Note: We keep this system instead of following the Symfony system to make it simpler for extension developers to use them across the admin. console and the portal.
*
* @return void
*/
private function FetchMessages()
{
if (!empty($this->aAllMessages))
{
return;
}
$this->aAllMessages = array();
if ((array_key_exists('obj_messages', $_SESSION)) && (!empty($_SESSION['obj_messages'])))
{
foreach ($_SESSION['obj_messages'] as $sMessageKey => $aMessageObjectData)
{
$aObjectMessages = array();
$aRanks = array();
foreach ($aMessageObjectData as $sMessageId => $aMessageData)
{
$sMsgClass = 'alert alert-dismissible alert-';
switch ($aMessageData['severity'])
{
case static::ENUM_SEVERITY_INFO:
$sMsgClass .= 'info';
break;
case static::ENUM_SEVERITY_WARNING:
$sMsgClass .= 'warning';
break;
case static::ENUM_SEVERITY_ERROR:
$sMsgClass .= 'danger';
break;
case static::ENUM_SEVERITY_OK:
default:
$sMsgClass .= 'success';
break;
}
$sMsgMetadata = '';
foreach ($aMessageData['metadata'] as $sMetadatumName => $sMetadatumValue)
{
$sMsgMetadata .= 'data-'.str_replace('_', '-', $sMetadatumName).'="'.utils::HtmlEntities($sMetadatumValue).'" ';
}
$aObjectMessages[] = array('css_classes' => $sMsgClass, 'message' => $aMessageData['message'], 'metadata' => $sMsgMetadata);
$aRanks[] = $aMessageData['rank'];
}
unset($_SESSION['obj_messages'][$sMessageKey]);
array_multisort($aRanks, $aObjectMessages);
foreach ($aObjectMessages as $aObjectMessage)
{
$this->aAllMessages[] = $aObjectMessage;
}
}
}
}
}