对于使用Linux系统的空间、vps、或者服务器的用户来说,经常遇到在后台上传产品时提示图片目录不可写问题。
这些不是很大的问题,我们只要按照提示要求在FTP中找到对应的目录,右键属性设置权限为777即可。
对于使用Linux系统的空间、vps、或者服务器的用户来说,经常遇到在后台上传产品时提示图片目录不可写问题。
这些不是很大的问题,我们只要按照提示要求在FTP中找到对应的目录,右键属性设置权限为777即可。
zencart官方出于安全考虑,在后台登录以后有一个过期时间,如果没有任何操作的话最长15分钟后就自动退出,这个对于后台管理是比较麻烦的。
这个是zencart1.5及以后版本在安全性上做的一个改进,后台设置的最大就是15分钟。很多人都希望延迟这个后台登陆的时间。
那么怎么样才能让后台登陆的时间久一点而不自动退出呢?
可以通过修改代码来实现延长这个后台管理员会话时间。
打开文件includesfunctionssessions.php
if (IS_ADMIN_FLAG === true) { if (!$SESS_LIFE = (SESSION_TIMEOUT_ADMIN > 900 ? 900 : SESSION_TIMEOUT_ADMIN)) { $SESS_LIFE = (SESSION_TIMEOUT_ADMIN > 900 ? 900 : SESSION_TIMEOUT_ADMIN); } }
这里的SESSION_TIMEOUT_ADMIN就是后台设置的管理员会话时间,默认最多就是900秒。
将上面的代码修改为:
if (IS_ADMIN_FLAG === true) {
if (!$SESS_LIFE = (SESSION_TIMEOUT_ADMIN == 900 ? 900 : SESSION_TIMEOUT_ADMIN)) { $SESS_LIFE = (SESSION_TIMEOUT_ADMIN == 900 ? 900 : SESSION_TIMEOUT_ADMIN); }
}
然后在后台–基本设置–管理对话超时秒数 设置为9000秒就可以了,这样就可以在后台管理控制会话过期时间,既可以延长也可以缩短后台登录时间的长短。
今天帮客户升级了一下zencart,由zencart 1.3.8升级到zencart 1.5.4,前台客户登录的时候出现空白了,然后马上看了一下log目录下的错误提示:PHP Fatal error: Class ‘zcPassword’ not found in E:\wamp\www\eubagus\includes\functions\password_funcs.php on line 15
这个错误很明显是说明zcPassword函数找不到,然后搜索了一下代码里面这个函数又存在,那为什么又提示找不到呢?
google搜索了很多资料 都没有这个问题的说明解决,然后自己灵机一动,会不会是该函数没有加载?
果真如此,客户的程序对config.core.php该文件有修改,重新放入到了includes\auto_loaders \overrides\config.core.php目录下,zencart默认是在includes\auto_loaders \config.core.php,所以我们升级的这个核心文件没有被替换到。
所以接下来把overrides\config.core.php文件中有新加入的代码,直接复制出来,把这个文件删除掉,然后重新复制默认目录下的config.core.php文件进入,把刚才复制出来的新加入代码加进入就可以了。
现在看看zencart网站前台是不是可以登录了。
今天给大家讲讲怎么样延长zencart1.5后台的15分钟登录时间和取消90天强制更换密码
注: 此操作建议大家在做开发的时修改,真实环境建议不要修改,毕竟这是zencart上面的一个非常好的安全措施
延长zencart1.5后台的15分钟登录时间
打开includes\functions\sessions.php
1 |
if (IS_ADMIN_FLAG === true) { |
2 |
if (! $SESS_LIFE = (SESSION_TIMEOUT_ADMIN > 900 ? 900 : SESSION_TIMEOUT_ADMIN)) { |
3 |
$SESS_LIFE = (SESSION_TIMEOUT_ADMIN > 900 ? 900 : SESSION_TIMEOUT_ADMIN); |
4 |
} |
修改为
1 |
if (IS_ADMIN_FLAG === true) { |
2 |
if (! $SESS_LIFE = (SESSION_TIMEOUT_ADMIN >= 900 ? 9000 : SESSION_TIMEOUT_ADMIN)) { |
3 |
$SESS_LIFE = (SESSION_TIMEOUT_ADMIN >= 900 ? 9000 : SESSION_TIMEOUT_ADMIN); |
4 |
} |
SESSION_TIMEOUT_ADMIN是后台设置的管理员会话时间默认是900秒,现在延长到9000秒也就是150分钟
取消90天强制更换密码
法一: 打开admin/login.php
1 |
define( 'ADMIN_PASSWORD_EXPIRES_INTERVAL' , strtotime ( '- 90 day' )); |
吧90调整到你想要的数值
法二: 打开admin/includes/functions/admin_access.php
1 |
function zen_check_for_password_problems( $password , $adminID = 0) |
2 |
{ |
第一行添加 return false; 取消密码验证
zencart官方未了安全考虑,在zencart1.5版本及以后新增了密码过期时间,默认是90天,从密码被修改开始计算,过了90天后,密码需要被重置才能登录后台,且不能设置为之前四次使用过的密码,这些种种做法都是zencart官方为了安全考虑而新增的措施。
对于经常进入后台操作的我们来说,有时候这种措施变得有些麻烦,需要几个月就更换一次密码,而且不能之前4次设置过的,使得密码记忆起来没那么容易。
那么怎样延长这个后台登录密码的过期时间呢?
可以通过下面修改代码的方法来解决
打开文件 “后台目录/logo.php” 找到下面代码
define('ADMIN_PASSWORD_EXPIRES_INTERVAL', strtotime('- 90 day'));
将上面的90修改为你需要的过期时间天数即可。
通过上面的一处修改,便可以自己控制延长或者缩短zencart后台登录密码过去时间了。方便自己操作,不过,为了安全,我们还是要尽量经常修改后台登录密码。此处修改只是为了方便操作。
想对ZenCart深入了解的程序猿可以认真看看zencart的文件结构…
1.大家可以看到ZenCart根目录index.php文件中第一句话是包含include目录下的application_top.php文件,如:require(’includes/application_top.php’);
zencart系统中application_top.php负责的是初始化工作,比如加载配置文件include(’includes/configure.php’);,如果系统没检测到该文件的存在则会尝试调用安装文件。
然后它会自动遍历include/extra_configures下的配置文件并包含进来。
在加载了系统配置文件以后接下来是一个非常重要的文件,这也导致了zencart和oscommerce感觉上很大不同的原因,首先调用一个文件require(’includes/initsystem.php’);
在initsystem.php中最先加载include/auto_loaders/config.core.php,config.core.php 是一个二围数组$autoLoadConfig,即以数组的形式保存文件的信息供后面文件调用,然后系统会接着加载完 include/auto_loaders目录下所有文件名匹配$loaderPrefix(默认为config)的文件。
上面程序执行完以后就是加载自动执行程序了require(’includes/autoload_func.php’);在这里它会遍 历$autoLoadConfig数组,它最终执行的效果会包含所有必须用到的函数或者类的定义,还有变量的初始化,config.core.php里面 的注释比较清楚比如
$autoLoadConfig[0][] = array(’autoType’=>’class’,’loadFile’=>’class.base.php’);
在autoload_func.php里面执行完以后的效果就是require(DIR_WS_CLASSES . ‘class.base.php’),大部分的初始化化工作是通过包含init_includes目录下的文件来实现的,如:
$autoLoadConfig[110][] = array(’autoType’=>’init_script’,’loadFile’=> ‘init_templates.php’);
它在执行完autoload_func.php文件后就已经加载了init_includes目录下的init_templates.php文件。
2.下面来介绍下ZenCart是怎么根据摸版把内容显示出来的。
在index.php的第29行有句
$directory_array = $template->get_template_part($code_page_directory, ‘/^header_php/’);
由于所有初始化工作已经完成,所以我们就可以在上面的文件找到他们的定义,如
$autoLoadConfig[100][] = array(’autoType’=>’classInstantiate’,’className’=>’template_func’,’objectName’=>’template’);
在这里就定义了$template = new template_func(); ,然后$code_page_directory变量的定义是在init_includes/init_sanitize.php文件中定义在这里必须要 对class/template_func.php中定义的template_func类比较熟悉,在该类中主要定义了两个方法 get_template_dir()和get_template_part();
这两个方法在zencart的模板使用中起到了决定性的作用。
get_template_dir方法function get_template_dir($template_code, $current_template, $current_page, $template_dir, $debug=false),它定义了5个参数,第一个参数一般是个文件名,它是用来判断后两个参数组成的目录中有没有匹配$template_code 的这个文件,该类复写了默认的系统函数file_exists所以很多初学者可能会比较迷惑
function get_template_dir($template_code, $current_template, $current_page, $template_dir, $debug=false) {
//echo ‘template_default/’ . $template_dir . ‘=’ . $template_code;
if($this->file_exists($current_template . $current_page, $template_code)){
return $current_template . $current_page . ‘/’;
}elseif ($this->file_exists(DIR_WS_TEMPLATES . ‘template_default/’ . $current_page, ereg_replace(’/’, ”, $template_code), $debug)){
return DIR_WS_TEMPLATES . ‘template_default/’ . $current_page;
} elseif ($this->file_exists($current_template . $template_dir, ereg_replace(’/’, ”, $template_code), $debug)){
return $current_template . $template_dir;
} else {
return DIR_WS_TEMPLATES . ‘template_default/’ . $template_dir;
//return $current_template . $template_dir;
}
}
/*
如
includes/templates/zccn/index
includes/templates/template_default/index
includes/templates/zccn/common
includes/templates/template_default/common
*/
get_template_part()方法有两个函数,第一个参数是文件目录,第二个参数是匹配的条件,执行的结果是包含该目录下所有文件名匹配这个条件的文件
比如$directory_array = $template->get_template_part($code_page_directory, ‘/^header_php/’);
这句话执行的结果就是返回目录下$code_page_directory所有文件名以header_php开头的文件
如此时的url(http://localhost/zencart/index.php?main_page=product_info&cPath=49_27&products_id=83)
你现在应该查看init_sanitize.php中$code_page_directory的定义此时的$code_page_directory的值应该是includes/modules/product_info/
所以它就应该包含该目录下所有以header_php开头的文件,在这里好象就只有一个header_php.php
$directory_array = $template->get_template_part($code_page_directory, ‘/^header_php/’);这个包含文件其实是初始化前台不同页面显示所需要用到的变量函数,主要是初始化数据库的东西,因为每个页面需要的数据 资料都有可能不同,所以index.php?main_page=index 当main_page的值不同是在includes/modules/目录下都会有个对应的目录,这里是index目录
只要知道了这两个方法的用法,你就会知道模板文件都是怎么显示出来的了
再来解释一 require($template->get_template_dir(’html_header.php’,DIR_WS_TEMPLATE, $current_page_base,’common’). ‘/html_header.php’);
假设当前url:http://localhost/zencart/index.php?main_page=index&cPath=48
DIR_WS_TEMPLATE 定义是在includes/init_templates.php中定义define(’DIR_WS_TEMPLATE’, DIR_WS_TEMPLATES . $template_dir . ‘/’);,因为我现在用的是默认的zccn模板
所以现在的DIR_WS_TEMPLATE=includes/templates/zccn/
$current_page_base在这里已经就是index
上面已经解释了$template->get_template_dir()的方法了
程序会依次在
includes/templates/zccn/index
includes/templates/template_default/index
includes/templates/zccn/common
includes/templates/template_default/common
在以上四个目录中找html_header.php,最终在template_default/common目录下找到html_header.php,最先优先当前模板的。
zencart 注册流程简化教程
1)修改注册条目时首先应查看后台“商店设置——客户资料”,其栏目可更改一些可见项,可以根据自己的理念进行设置;false不显示,true显示。
2)在根据自己需要进行可见与不可见设置后,刷新即可看见自己设置的客户填写项目,发现zencart 模板都打上星号,是为必填,坦白说这功能需要改进,应该让站长根据需要进行设置嘛,我们接着来做这个工作;
3)首先要取消星号标示,免得让客户误解,解决方法方案如下:
A、找到includes/languages下的english.php文件,
B、用editplus编辑工具打开,找到诸如
define(‘ENTRY_TELEPHONE_NUMBER_TEXT’, ‘*’);
具体怎么对应,zencart命名挺规范,大家就自己猜啦;
C、去掉’*’中的星号,记得不是去掉单引号哦;
D、刷新,发现相关项目的红色星号不见了吧,不过此时注册仍然是必填项;
4)接着来修改表单检查一项,其为js完成检查,找到该JS,文件路径为:includes/modules/pages/create_account下的jscript_form_check.php,看看代码吧;
A、想好把哪些项目设置为选填项目后,即可注释掉该项目,根据操作,用/* */比较好,不会出错,比如:
/*<?php if ((int)ENTRY_LAST_NAME_MIN_LENGTH > 0) { ?> check_input(“lastname”, <?php echo ENTRY_LAST_NAME_MIN_LENGTH; ?>, “<?php echo ENTRY_LAST_NAME_ERROR; ?>”); <?php } ?>*/
B、注释所有你无需检查提交项目,完成保存即可;
5)自己注册下,怎么还是提示说XX最少为一个字符,不过细心点,这次提示错误是一个横条系统提示,明显不是来着js的CHECK_FORM的,接着下一步啦;
6)进入“商店——最小值”设置项目,把那些你想设置为选填的项目设置为0
7) 修改完成!
今天主要给大家推荐一个Zencart如何转移客户资料的简化版主要的用途就是就一个zencart网站的客户字全部迁移到另一个zencart外贸商城网站
<?php // +---------------------------------------------------------------------- // | Project:Zencart客户资料转移合并工具简化版 Customers Manage // +---------------------------------------------------------------------- // | Explanation:2013-12-1 // +---------------------------------------------------------------------- // | Version: V1.8 // +---------------------------------------------------------------------- header('Content-Type:text/html;charset=UTF-8'); require('includes/application_top.php'); function ez_get_customers_books($customers_id,$customers_default_address_id){ global $db; $books_data=array(); $books=$db->Execute("SELECT * FROM ".TABLE_ADDRESS_BOOK." WHERE customers_id=".$customers_id); while(!$books->EOF){ $books->fields['primary'] = ($books->fields['address_book_id']==$customers_default_address_id) ? 1 : 0; $books_data[]=$books->fields; $books->MoveNext(); } return $books_data; } function ez_get_customers_info($customers_id){ global $db; $customers_info=$db->Execute("SELECT * FROM ".TABLE_CUSTOMERS_INFO." WHERE customers_info_id=".$customers_id); unset($customers_info->fields['customers_info_id']); return $customers_info->fields; } $customers_data=array(); //导出 if($_GET['toolaction']=='export'){ $customers = $db->Execute("SELECT * FROM ".TABLE_CUSTOMERS); while(!$customers->EOF){ $customers->fields['books']=ez_get_customers_books($customers->fields['customers_id'],$customers->fields['customers_default_address_id']); $customers->fields['customers_info']=ez_get_customers_info($customers->fields['customers_id']); $customers_data[$customers->fields['customers_email_address']]=$customers->fields; $customers->MoveNext(); } file_put_contents(DIR_FS_SQL_CACHE.'/customers_data.log', json_encode($customers_data)); echo '导出成功'; exit; } //导入 if($_GET['toolaction']=='import'){ if(!file_exists(DIR_FS_SQL_CACHE.'/customers_data.log')) {echo '客户资料文件不存在';die;} $customers_data_json=file_get_contents(DIR_FS_SQL_CACHE.'/customers_data.log'); $customers_data=json_decode($customers_data_json,true); foreach($customers_data as $email_address => $email_data){ $check_email_query = "select count(*) as total from " . TABLE_CUSTOMERS . " where customers_email_address = '" . $email_address . "'"; $check_email = $db->Execute($check_email_query); if ($check_email->fields['total'] > 0) continue; //邮箱已存在跳出 $book_data=$email_data['books']; $customers_info=$email_data['customers_info']; unset($email_data['books'],$email_data['customers_id'],$email_data['customers_info']); //插入客户表 zen_db_perform(TABLE_CUSTOMERS, $email_data); $customers_id = $db->Insert_ID(); //插入客户信息表 $customers_info['customers_info_id']=$customers_id; zen_db_perform(TABLE_CUSTOMERS_INFO, $customers_info); //插入地址表 foreach($book_data as $book){ $book['customers_id']=$customers_id; unset($book['address_book_id']); $primary= ($book['primary']==1) ? 1 : 0; unset($book['primary'],$book['address_book_id']); zen_db_perform(TABLE_ADDRESS_BOOK, $book); $books_id = $db->Insert_ID(); //更新客户表默认地址 if($primary==1) $db->Execute("UPDATE ".TABLE_CUSTOMERS." SET customers_default_address_id=".$books_id." WHERE customers_id=".$customers_id); } } echo '导入成功'; exit; } ?> <a href="?toolaction=export">导出</a> <a href="?toolaction=import">导入</a> 使用方法很简单,只用将文件上传到网站根目录,然后浏览器运行http://xxx.com/customers_populate.php,导出后将cache/customers_data.log转移到另一个站的cache下,然后执行导入 下载地址:链接:http://pan.baidu.com/s/1bnFbOcf 密码:j6w2