| 
	zencart网站中用户登陆后的跳转问题应该是很多人都经常碰到的问题。zen cart登陆后到底应该跳转到哪个页面呢?我认为正常的想法应该是用户在登陆后应该跳转到登陆之前他所在的页面,以便继续他的工作流程,如购物车或者继续填写地址信息资料的checkout_shipping页面等。当然呢,你可能是想让用户登陆后进入到某个页面,比如不管用户从哪个页面定向到登陆页,登陆后都要重定向到促销页或优惠券页面。当然可能你的要求更复杂,总之是想根据客户的不同情境做不同的动作。 
	无论是什么想法,我们需要做的都简单:zen cart的每一个页面(或者说action 吧),都有header.php,模板文件,语言文件。严格意义上说,zen cart不能算是MVC架构了,但是不凡这么理解,这样会清晰一些。把MVC应用到每个页面上来说,header.php应该是controller(C)+Model(M)了(实际上并没有model,充其量只能是DB存取层),模板文件应该是view,语言文件也只能是view(V)的一部分了。而index.php应该是总的controller(C)了。 
	所有我们无论要在登陆后重新定向到哪个页面,都要在header.php中操作,当然也可以在模板中写了。只是习惯不好。但这正是zen cart的灵活之处。没那么多束缚。 
	includes/moduels/pages/login/header.php 
	if (sizeof($_SESSION['navigation']->snapshot) > 0) {// $back = sizeof($_SESSION['navigation']->path)-2;
 //if (isset($_SESSION['navigation']->path[$back]['page'])) {
 // if (sizeof($_SESSION['navigation']->path)-2 > 0) {
 $origin_href = zen_href_link($_SESSION['navigation']->snapshot['page'], zen_array_to_string($_SESSION['navigation']->snapshot['get'], array(zen_session_name())), $_SESSION['navigation']->snapshot['mode']);
 // $origin_href = zen_back_link_only(true);
 $_SESSION['navigation']->clear_snapshot();
 zen_redirect($origin_href);
 } else {
 zen_redirect(zen_href_link(FILENAME_DEFAULT, '', $request_type));
 }
 
	这段代码决定了,login action 执行完后,将客户带回到login之前的页面。不过,这还需要在跳转到登陆页面前,将当前页面的URL记录下,这是通过$_SESSION['navigation']这个变量来完成的。应该在当前页面对应的header.php中添加如下代码: 
	$_SESSION['navigation']->set_snapshot(); 
	这个代码帮助zen cart记住了跳到到登陆页面前的页面的URL。 
	在zen cart网站中,客户从产品信息页进入点击进入到登陆页,他登陆后会返回到产品登陆前查看的产品页,我们看一下includes/modules/pages/product_info/header_php.php的这段代码: 
	if (!$_SESSION['customer_id']) {$_SESSION['navigation']->set_snapshot();
 }
 
	如果你需要其它的规则或者要修改掉这个动作,那么你可以在login的header.php中的这个判断前添加你的代码实现你需要的逻辑。 
	需要注意的是:zen_back_link函数和zen_back_link_only函数会影响到$_SESSION['navigation']−>set_snapshot();的作用。看一下这两个函数的定义 
	/includes/functions/functions_general.php 
	// Set back buttonfunction zen_back_link() {
 if (sizeof($_SESSION['navigation']−>path)−2 > 0) {
 $back = sizeof($_SESSION['navigation']−>path)−2;
 $link = '';
 } else {
 if (isset($_SERVER['HTTP_REFERER']) && strstr(HTTP_SERVER, $_SERVER['HTTP_REFERER'])) {
 $link= $_SERVER['HTTP_REFERER'];
 } else {
 $link = '';
 }
 $_SESSION['navigation'] = new navigationHistory;
 }
 return $link;
 }
 
	////// Set back link only
 function zen_back_link_only($link_only = false) {
 if (sizeof($_SESSION['navigation']−>path)−2 > 0) {
 $back = sizeof($_SESSION['navigation']−>path)−2;
 $link = zen_href_link($_SESSION['navigation']−>path[$back]['page'], zen_array_to_string($_SESSION['navigation']−>path[$back]['get'], array('action')), $_SESSION['navigation']−>path[$back]['mode']);
 } else {
 if (strstr(HTTP_SERVER, $_SERVER['HTTP_REFERER'])) {
 $link= $_SERVER['HTTP_REFERER'];
 } else {
 $link = zen_href_link(FILENAME_DEFAULT);
 }
 $_SESSION['navigation'] = new navigationHistory;
 }
 
	if ($link_only == true) {return $link;
 } else {
 return '';
 }
 }
 
	由于$_SESSION['navigation'] = new navigationHistory;这行代码,这两个函数都有可能重新初始化$_SESSION['navigation']这个变量,导致之前调用set_snapshot()保留的状态被丢弃。要么避免调用这两个函数,要么就只能在zen cart模板中的最后调用. 
	相信通过这个分析,对于zen cart网站中用户登陆后的重定向控制就非常清晰了。欢迎转载,转载请注意(责任编辑:最模板) |