Zen-cart消息提示messageStack类详解[转载]
类文件:includes/classes/message_stack.php
初始化:
$autoLoadConfig[0][] = array('autoType'=>'class', 'loadFile'=>'message_stack.php'); $autoLoadConfig[130][] = array('autoType'=>'classInstantiate', 'className'=>'messageStack', 'objectName'=>'messageStack');
最终得到一个消息堆栈类变量$messageStack。首先看此类的构造函数:
function messageStack() { $this->messages = array(); if (isset($_SESSION['messageToStack']) && $_SESSION['messageToStack']) { $messageToStack = $_SESSION['messageToStack']; for ($i=0, $n=sizeof($messageToStack); $i<$n; $i++) { $this->add($messageToStack[$i]['class'], $messageToStack[$i]['text'], $messageToStack[$i]['type']); } $_SESSION['messageToStack']= ''; } }
用messages数组来保存消息栈,然后接收来自$_SESSION[‘messageToStack’]的消息(如果有),调用add压入数组。实际上,当调用add_session方法时,信息将记录到$_SESSION[‘messageToStack’]数组中,表示这个信息是来自上一次请求产生的。
这个类最重要的就是add方法:
function add($class, $message, $type = 'error') { global $template, $current_page_base; $message = trim($message); $duplicate = false; if (strlen($message) > 0) { if ($type == 'error') { $theAlert = array('params' => 'class="messageStackError larger"', 'class' => $class, 'text' => zen_image($template->get_template_dir(ICON_IMAGE_ERROR, DIR_WS_TEMPLATE, $current_page_base,'images/icons'). '/' . ICON_IMAGE_ERROR, ICON_ERROR_ALT) . ' ' . $message); } elseif ($type == 'warning') { } elseif ($type == 'success') { } elseif ($type == 'caution') { } else { $theAlert = array('params' => 'class="messageStackError larger"', 'class' => $class, 'text' => $message); } //确保不重复 for ($i=0, $n=sizeof($this->messages); $i<$n; $i++) { if ($theAlert['text'] == $this->messages[$i]['text'] && $theAlert['class'] == $this->messages[$i]['class']) $duplicate = true; } if (!$duplicate) $this->messages[] = $theAlert; } }
这个方法的第一个参数是信息的分组标识符,比如在购物车产生的信息,可用shopping_cart这个标识符来记录所有的信息,方法的第三参数是信息类型,一共有error warning success caution,success表示成功操作时使用,error表示产生错误时使用,warning和caution都表示警告,warning的程度比较重,用来发出警告信息时使用。
add_session方法的调用跟add方法类似,不过它会把信息同时压入$_SESSION[‘messageToStack’]中(构造函数利用它获取来此上次请求的消息):
function add_session($class, $message, $type = 'error') { if (!$_SESSION['messageToStack']) { $messageToStack = array(); } else { $messageToStack = $_SESSION['messageToStack']; } $messageToStack[] = array('class' => $class, 'text' => $message, 'type' => $type); $_SESSION['messageToStack'] = $messageToStack; $this->add($class, $message, $type); }
要注意正确使用add和add_session,如果信息不需要在下一个请求中共享,只需要调用add即可。一般,如果POST提交了,最后可能发起一次新的请求,如果POST过程有信息产生,这个时候就要用add_session。
output($class)方法用来输出信息,$class表示分组标识符。size($class)表示$class这个分组的信息大小。