在phalcon中,默认的Flash消息服务仅提供默认的错误div。
<div class="alert alert-warning">Our message</div>
但我想在div框中添加这样的东西。
<div class="alert alert-warning"> <button class="close">x</button> Our Message </div>
然而,phalcon我们只允许根据我的知识设置每个消息的类。
$di->set('flash', function () {
return new FlashSession([
'error' => 'alert alert-danger alert-dismissible',
'success' => 'alert alert-success alert-dismissible',
'notice' => 'alert alert-info alert-dismissible',
'warning' => 'alert alert-warning alert-dismissible'
]);
});
是否有任何配置或任何其他方式在每条消息上添加关闭按钮。我想要像
这样的东西message = '<button class="close-btn">x</button>'+message
但是我不想在每个flash消息上添加此关闭按钮,因为将来可能需要更改关闭按钮的类,以便在这种情况下我需要从项目中更改所有内容。
答案 0 :(得分:0)
您可以通过扩展Phalcon \ FlashSession类并覆盖outputMessage()方法,或者通过创建自己的Flash组件来输出所需的HTML来实现此目的。下面是自定义flash组件的示例,当我们使用Falcon开发时,我们使用类似的类,该组件假定DI中存在会话组件。
这是未经测试的,但原则上代码可以让您能够为输出HTML添加关闭按钮,或者您可以为相关方法中的每种消息类型设置特定的HTML内容(错误,成功,警告,信息)
使用示例:
// settings messages in your controllers / components
// 2nd param defines a position
$this->flashMessage->error('Something is bad!', 'form_top');
$this->flashMessage->success('Something is right!');
$this->flashMessage->info('Something is interesting!');
$this->flashMessage->warning('Something is worrying!');
// rendering messages in your views
// 1st param will render messages for a specific position if a position was set
$this->flashMessage->render();
$this->flashMessage->render('form_top');
示例类:
class FlashMessage extends Phalcon\Mvc\User\Component
{
/**
* @var array
**/
public $classmap = array();
/**
* Sets defaults for the class map (optional)
*
* @param array $classmap
**/
public function __construct($classmap = array()) {
// -- set the defaults
$this->classmap = array(
'error' => 'flash_message-error',
'success' => 'flash_message-success',
'info' => 'flash_message-info',
'warning' => 'flash_message-warning'
);
// -- set new class map options (also optional)
if (!empty($classmap)) {
foreach ($classmap as $key => $value) {
$this->classmap[$key] = $value;
}
}
}
/**
* error(), success(), info(), warning()
* Sets the flash messages
*
* @param string message
* @param string position
* @return string
**/
public function error($message, $position = '')
{
$this->session->flashMessage = array(
'position' => $position,
'message' => '<div class="' . $this->classmap['error'] . '">
' . $message . '
</div>
');
}
public function success($message, $position = '')
{
$this->session->flashMessage = array(
'position' => $position,
'message' => '<div class="' . $this->classmap['success'] . '">
' . $message . '
</div>
');
}
public function info($message, $position = '')
{
$this->session->flashMessage = array(
'position' => $position,
'message' => '<div class="' . $this->classmap['info'] . '">
' . $message . '
</div>
');
}
public function warning($message, $position = '')
{
$this->session->flashMessage = array(
'position' => $position,
'message' => '<div class="' . $this->classmap['warning'] . '">
' . $message . '
</div>
');
}
/**
* Check if theres messages in the session to render
*
* @param string $position
* @return bool
**/
public function hasMessage($position = null)
{
if (isset($this->session->flashMessage) && !empty($position)) {
return $this->session->flashMessage['position'] == $position ? true : false ;
} else {
return $this->session->flashMessage ? true : false ;
}
}
/**
* Renders the flash message
*
* @param string $position
* @return string
**/
public function render($position = null)
{
// -- store the message locally
$message = $this->session->flashMessage;
// -- check if there is in fact a flashed message
if (empty($message))
return;
// -- then remove from the session
$this->session->remove('FlashMessage');
// -- if no position the just return the message
if (is_null($position)) {
return $message['message'];
// -- else return the requested position
} elseif ($position == $message['position']) {
return $message['message'];
}
}
}
答案 1 :(得分:0)
我正在使用这样的东西,你可以像你想要的那样扩展它。但这只是它如何运作的要点:
class Messenger extends Component
{
protected static $_messageCloseHtml = '<a href="#" class="close" data-dismiss="alert" aria-label="close" title="close">×</a>';
/**
* @param array|string $messages
*/
public static function flashError($messages)
{
$messages = !is_array($messages) ? [$messages] : $messages;
foreach ($messages as $message) {
\Phalcon\Di::getDefault()->get('flashSession')->error(self::_getBody($message));
}
}
/**
* @param string $message
* @return string
*/
protected static function _getBody($message)
{
return self::$_messageCloseHtml . $message;
}
}
对于每条消息,您都可以在消息中添加一些HTML代码。
我的flashError
用于显示错误消息。您可以为warning
,info
和success
添加相同的方法代码。
所以基本上你扩展了(现有的)FlashSession
,在分配消息时,你调用了一个全局方法,在你的消息中添加了额外的文本或html。