Ecshop Introduction Tutorial

ecshop程序的基本结构和介绍

Reference:
http://www.chinab4c.com/html/ecshopercikaifajiangzuo/201011/24731.html

  • 结构化

ecshop其实算是结构化的程序设计,不算是三层结构。ecshop主要采用的是ecshop自写的非标准化smarty模板引擎来实现的。

  • 模板

ecshop模板的核心程序在includes/cls_template.php。有关模板制作的教程,可以参考以下路径http://www.chinab4c.com/html/dianzishangwujiaocheng/ecshoptemplate/index.html

  • 主题模板

ecshop有一个安装的过程,除了配置一些模板信息,测试数据外。最重要的是规划好了模板的引用,以及数据库相关的配置信息。ecshop的模板位置于themes目录。

  • 配置

ecshop系统的配置文件信息位置于data/config.php文件。

  • include

ecshop处理整站程序的文件在includes目录里面。

  • 缓存

既然谈到了ecshop的模板引擎。那么一定要说说ecshop 的缓存目录。位于temp目录。

  • 语言

ecshop可以有不同的语言版本,他是靠语言包languages目录来控制的。

  • 管理

ecshop默认的后台路径位置与admin目录,他是整个后台管理的核心.

  • 图片

有朋友问我,如果修改ecshop浏览器里面显示的小推车图标.很简单,他就是根目录下的favicon.ico文件。你将他喜欢修改就可以.

  • WAP

大家都知道ecshop最大的特点是支持wap访问,所以mobile目录理所当然的就是wap程序所在的目录。如果要让ecshop支持wap访问,很简单。我们必须在ecshop后台的系统设置里面,wap设置里面开启wap功能就可以了。

ecshop初始化文件init.php组成和工作原理

大家都知道,ecshop核心处理文件是在includes目录里面,

  • 包括ecshop支付插件,
  • ecshop功能函数公共函数文件,
  • ecshop配送方式插件等.
  • 甚至包括ecshop模板解析文件cls_template.php文件.

ecshop中各个文件的初始化,引用。甚至是公共变量session等。都包含在includes/init.php的文件中。

  • 1: init.php包括了数据库初始化函数.$ecs = new ECS($db_name, $prefix);
  • 2: init.php中包含了以下函数. $smarty = new cls_template;声明和实例化smarty对象。
  • 3:init.php文件中包含以下代码,$smarty->assign('lang', $_LANG); 来设置ecshop的语言包。所以很多人问我,ecshop不是有languages目录啊.都是通过该方法来动态传递的。
  • 4:init.php文件还初始化ecshop登陆状态和等级状态.
     $_SESSION['user_id']     = 0;
            $_SESSION['user_name']   = '';
            $_SESSION['email']       = '';
            $_SESSION['user_rank']   = 0;
            $_SESSION['discount']    = 1.00;
  • 5:init.php以下代码 error_reporting(E_ALL);还登记和处理php的错误处理机制.
  • 6:init.php中开起了ecshop推荐功能的接口。该代码为if (isset($_GET['u']))

{
set_affiliate();
}

  • 7:init.php是如何加载ecshop系统的配置函数呢。通过该方法。$_CFG = load_config();得到了系统函数。

ecshop文件名称和基本功能

本段讲述ecshop不同的功能具体的对应文件在哪个位置,一般的文件位置和功能。ecshop二次开发中常常要用到那些文件。我们将结合ecshop二次开发的经验,来对ecshop文件名称和基本功能进行讲解。

  • 注册登陆:user.php
  • 购物车:flow.php
  • 产品列表:category.php
  • 品牌页面:brand.php
  • 搜索页面:search.php
  • 会员中心库文件:lib_transaction.php ,lib_passport.php
  • 核心函数库:lib_common.php ,lib_main.php ,lib_base.php
  • ecshop订单处理库文件:lib_order.php
  • 全站js库文件:js目录.
  • 模板文件:themes
  • 模板库文件:themes/name/library
  • 支付插件:includes/modules/payment
  • 配送方式插件:includes/modules/shipping
  • ecshop模板核心:includes/cls_template.php 这个文件非常重要,如果要掌握ecshop模板中标签.必须掌握这个。
  • ecshop编辑器:includes/fckeditor
  • ecshop的伪静态URL重写文件:.htaccess 特指是在apache下起作用
  • ecshop系统,数据库配置信息:data/config.php

网上有太多关于ecshop文件结构介绍的文章,但是感觉都很杂。很乱。没有重点,自己根据几百个ecshop二次开发项目总结的出结论。如果掌握了以上文件结构和思路。一般的ecshop二次开发已经足够。

ecshop二次开发常用的数据库表

本章讲述 ecshop二次开发常用的数据库表 ,只要你做一天的ecshop二次开发,你就必须知道ecshop数据库中到底有那些数据表,而且哪些是常用的。最常修改到或者检索到的字段,最常用或者最应该去使用的一些字段。

ecshop表大概有以下几种,会员信息表,订单信息表,商品信息表,管理员表,权限表,日志表,广告位置相关表,活动信息表,购物车相关表.还有其他的ecshop表就不一一的列举了。

  • 会员信息表:users
  • 商品信息表:goods
  • 订单基本信息表:order_info
  • 订单商品信息商品表:order_goods
  • 管理员信息表:admin_user
  • 文章表:article
  • 文章分类表:article_cat
  • 商品分类表:category
  • 商品属性,属性表:attribute,goods_attr
  • 购物车表:cart
  • 用户会话表:sessions
  • 客户留言投诉表:feedback
  • 评论表:comment
  • 系统设置参数表:shop_config
  • 会员等级表:user_rank
  • 帐户金额流动表:account_log
  • 收货地址管理表:user_address

以上表,是我们做ecshop二次开发和做ecshop修改最常用的表,只有掌握了这些表,我们才能知道如何去修改程序,如何合理的去调整ecshop。

ecshop二次开发模板和数据的赋值

本章将结合ecshop的smarty模板标准.来谈谈在ecshop二次开发中有些简单的模板和赋值的方法以及思路。

  • 1:ecshop模板变量是如何定义的。

{$username},比如以下格式.大括号"{}"成对出现的。如果是数组key.那么我们将使用"."点号的方式来访问某个key.比如{$info.name}表示访问数组$info的$info['name']

  • 2:ecshop中如何使用foreach循环.

比如数组
$array = array(
'1' => array('name' =>'name' , 'age' => 'age'),
'2' => array('name' =>'name2' , 'age' => 'age2'),
);
$smarty -> assign('array' , $array);
在ecshop的模板中。要以下方式来显示该数组.
foreach(from = $array item = item){
{$item.name} : {$item.age}
}
这里的item相当于一个数组元素.

  • 3:如何在ecshop模板中使用session对象。

$smarty.session.user_id 就相当于访问了$_SESSION['user_id'];

  • 4:如何在smarty中调用多个foreach循环

 首先我们要知道一个道理.smarty模板中的foreach就类似于php中的foreach.只不过写在模板中。我们看到的写法不大一样。比如有一个复杂数组.
foreach(from = $list item = item){
foreach($item.array as item = child){
{$child.name}:{$child.age}
}
}
以上就是简单的介绍了ecshop二次开发中。常用的ecshop将php数据传递给smarty模板的方法.

ecshop二次开发之数据库函数使用

本章将结合eschop二次开发一些常见的开发例子。来谈谈ecshop的数据库类和方法是如何处理数据库。

  • 1:ecshop的数据库类实例子化对象为$db;表的实例化对象为$ecs
  • 2:如何取得ecshop某个表中多行数据.该使用方法getAll()

$res = $db -> getAll();

  • 3:如何取得ecshop某一行的数据.该使用getRow()方法,比如

$row = $db -> getRow();

  • 4:如何取得某一列的值.该使用方法getCol()

$res = $db ->getCol();

  • 5:如何取得指定的位置的几个数据.使用 selectLimit()

比如取得从第10行起的5条数据
$db -> selectLimit($sql , 10 ,5);

  • 6:修改和插入一个数组.该使用autoExecute()方法,而且必须是一个数组.

$db->autoExecute($ecs->table('link_goods'), $row, 'INSERT');也可以是UPDATE

  • 8:如何获得一个值得.使用getOne()

 $name = $db -> getOne("select user_name from ".$ecs->table('users')." where user_id = 1");

  • 9:如何执行修改和删除数据.使用query()也可以。

 比如$db -> query("update ".$ecs->table('users')." set user_name = '222' where user_id = 33");

ecshop如何给商品增加新字段

本次将结合ecshop后台商品编辑和商品录入。来谈谈如何给ecshop商品增加新的字段。当然这个字段是为了满足对ecshop二次开发的需要而设置的。

  • 1:我们必须给ecshop商品表增加字段:other_col

alter table ecs_goods add column other_col varchar(64);

  • 2:在ecshop后台的admin\templates\goods_info.htm中增加以下代码.

<tr>
<td class="label">自定义字段</td>
<td><input type="text" name="other_col" value="{$goods.other_col}" size="20"/>
</td>
</tr>

  • 3:在admin/goods.php的elseif ($_REQUEST['act'] == 'insert' || $_REQUEST['act'] == 'update')里面增加以下程序
     $sql = "INSERT INTO " . $ecs->table('goods') . " (goods_name, goods_name_style, goods_sn, " .
                    "cat_id, brand_id, shop_price, market_price, is_promote, promote_price, " .
                    "promote_start_date, promote_end_date, goods_img, goods_thumb, original_img, keywords, goods_brief, " .
                    "seller_note, goods_weight, goods_number, warn_number, integral, give_integral, is_best, is_new, is_hot, " .
                    "is_on_sale, is_alone_sale, is_shipping, goods_desc, add_time, last_update, goods_type, rank_integral, suppliers_id,other_col)" .
                "VALUES ('$_POST[goods_name]', '$goods_name_style', '$goods_sn', '$catgory_id', " .
                    "'$brand_id', '$shop_price', '$market_price', '$is_promote','$promote_price', ".
                    "'$promote_start_date', '$promote_end_date', '$goods_img', '$goods_thumb', '$original_img', ".
                    "'$_POST[keywords]', '$_POST[goods_brief]', '$_POST[seller_note]', '$goods_weight', '$goods_number',".
                    " '$warn_number', '$_POST[integral]', '$give_integral', '$is_best', '$is_new', '$is_hot', '$is_on_sale', '$is_alone_sale', $is_shipping, ".
                    " '$_POST[goods_desc]', '" . gmtime() . "', '". gmtime() ."', '$goods_type', '$rank_integral', '$suppliers_id','$_POST[other_col]')";

这样我们就完成了后台录入新字段的程序修改了。
那么在ecshop数据库表的goods中。我们就取得他的值.在前台通过{$goods.other_col}来完成新增字段的显示。

ecshop中ajax调用原理

本章将结合ecshop一些常见的使用规则。来谈谈ecshop中是如何调用ajax的.ecshop二次开发的过程中。

  • 1:首先ecshop是如何定义ajax对象的。

ecshop中的ajax对象是在js/transport.js文件中定义的。里面是ajax对象文件。声明了一个var Ajax = Transport;对象和一个方法Ajax.call = Transport.run;

  • 2:ecshop中ajax可以使用两种方式传递数据.一种是get方式,一种是post方式.
     Ajax.call( 'user.php?act=is_registered', 'username=' + username, registed_callback , 'GET', 'TEXT', true, true );
     Ajax.call('user.php?act=return_to_cart', 'order_id=' + orderId, returnToCartResponse, 'POST', 'JSON');
  • 3:ecshop中的 ajax可以是传递text数据,也可以是一个json对象。比如以下代码
  goods.quick    = quick;
  goods.spec     = spec_arr;
  goods.goods_id = goodsId;
  goods.number   = number;
  goods.parent   = (typeof(parentId) == "undefined") ? 0 : parseInt(parentId);
  Ajax.call('flow.php?step=add_to_cart', 'goods=' + goods.toJSONString(), addToCartResponse, 'POST', 'JSON');

里面的goods就是对象.而且是靠json来传递的。返回的结果result也是对象.
  • 4:ecshop ajax函数里面.第三个参数就是回掉函数的名称。比如以上代码addToCartResponse 这个函数就是ajax处理结果的回调函数.
  • 5:在ecshop的php代码中,一般是通过get或者post方式来接受函数。比如以下例子,如果接受的是对象。还需要用json数据格式来处理.比如以下
   include_once('includes/cls_json.php');
    $_POST['goods'] = json_str_iconv($_POST['goods']);

处理的返回结果,也需要是json格式发送给js
   die($json->encode($result));

以上就是简单的介绍了ecshop中ajax使用的简单规则。

ecshop模板中foreach的分析

本章将结合ecshop模板中的一些使用例子,来谈谈ecshop模板如何使用foreach循环,我们通过结合示例,让你更加明白foreach循环在ecshop模板中的重要性。对ecshop二次开发工作,也是有非常重要的意义。

  • 1:foreach使用规则,他有以下几个参数 from ,item name iteration index
  • 2:如何使用foreach循环

  如果php要传递一个数组给ecshop的smarty模板.那么我们将通过from=$array 来接受,写法是{foreach from = $array item = item}

  • 3:ecshop中smarty的下标如何表示.

{foreach from = $array item = item name=name} 这里的 {$smarty.foreach.name.iteration}{/foreach} 这里的iteration就是从1开始的下标,如果要从0开始的下标,应该使用{$smarty.foreach.name.index}

  • 4:如何判断是否是foreach循环的开始和结束,最后一个元素.

{if $smarty.foreach.last}表示循环的最后一个元素.{if $smarty.freach.first}表示循环的开始.

  • 5:如何使用双重循环.

我们在php程序本身也可以使用多重循环,只不过在php中的写法是$array['test']这样的写法。但是在foreach中。我们是用"."号的方式来访问。比如
{foreach from = $test item =item}
{$item.name}表示item中的name值.
{/foreach}

ecshop配置文件init.php

  
本章将结合ecshop一些常用的二次开发需求。来谈谈ecshop一个非常重要,也是非常关键的文件includes/init.php

  • 1: 首先在所有ecshop的页面,先都会加载init.php.要做一个判断。判断该系统是否被安装.

if (!file_exists(ROOT_PATH . 'data/install.lock') && !file_exists(ROOT_PATH . 'includes/install.lock')
&& !defined('NO_CHECK_INSTALL'))
{
header("Location: ./install/index.php\n");
exit;
}
如果没被安装,那么将跳转到安装页面install目录

  • 2:初始化ecshop一些参数
@ini_set('memory_limit',          '64M');
@ini_set('session.cache_expire',  180);
@ini_set('session.use_trans_sid', 0);
@ini_set('session.use_cookies',   1);
@ini_set('session.auto_start',    0);
@ini_set('display_errors',        1);

包括缓存,ecshop的session等。
  • 3:加载一些ecshop数据库相关配置信息。

require(ROOT_PATH . 'data/config.php');包括数据库帐户信息。

  • 4:包含一些ecshop中最重要的功能函数和公共模块.
require(ROOT_PATH . 'includes/inc_constant.php');
require(ROOT_PATH . 'includes/cls_ecshop.php');
require(ROOT_PATH . 'includes/cls_error.php');
require(ROOT_PATH . 'includes/lib_time.php');
require(ROOT_PATH . 'includes/lib_base.php');
require(ROOT_PATH . 'includes/lib_common.php');
require(ROOT_PATH . 'includes/lib_main.php');
require(ROOT_PATH . 'includes/lib_insert.php');
require(ROOT_PATH . 'includes/lib_goods.php');
require(ROOT_PATH . 'includes/lib_article.php');
  • 5:包含和创建数据库连接对象
    require(ROOT_PATH . 'includes/cls_mysql.php');
$db = new cls_mysql($db_host, $db_user, $db_pass, $db_name);
$db->set_disable_cache_tables(array($ecs->table('sessions'), $ecs->table('sessions_data'), $ecs->table('cart')));
$db_host = $db_user = $db_pass = $db_name = NULL;
  • 6:初始化ecshop的session和smarty模板
      require(ROOT_PATH . 'includes/cls_template.php');
    $smarty = new cls_template;
  • 7:加载语言包和一些cookie
      require(ROOT_PATH . 'languages/' . $_CFG['lang'] . '/common.php');

以上就是ecshop的init.php的重大功能作用,也是我们做ecshop二次开发常常遇到的。

ecshop语言包lang的加载原理

  本章节将结合ecshop的一些常用规则。来谈谈ecshop语言包是如何加载和使用的。
  首先我们看下ecshop目录下的languages目录.这个是ecshop语言包所在。ecshop默认的中文简体是zh_cn目录.语言包的载入过程都是通过ecshop的init.php中的require(ROOT_PATH . 'languages/' . $_CFG['lang'] . '/common.php')处理和控制代码来加载的.
这个$_CFG['lang']是存储在数据库shop_config的。里面的code=lang字段的值就是该语言包名称。默认是zh_cn所有语言包中的数组名称是$_LANG.我们可以看到在init.php中,通过smarty来初始化 $smarty->assign('lang', $_LANG);
  当ecshop语言包得到初始化之后,我们就可以在模板中通过{$lang.edit}方式来访问语言包中各个名称了。
ecshop的后台,也有讲究.语言包加载.他的控制文件在admin/includes/init.php里面.

      require(ROOT_PATH . 'languages/' .$_CFG['lang']. '/admin/common.php');
      require(ROOT_PATH . 'languages/' .$_CFG['lang']. '/admin/log_action.php');
if (file_exists(ROOT_PATH . 'languages/' . $_CFG['lang'] . '/admin/' . basename(PHP_SELF)))
{
    include(ROOT_PATH . 'languages/' . $_CFG['lang'] . '/admin/' . basename(PHP_SELF));
}

如果是后台的admin/category.php。那么这个页面的模板文件是加载languages\zh_cn\admin\category.php这个要特别注意。如果你新建立页面.那么也要在语言包里面建立新的语言包文件。

ecshop二次开发支付插件

本章节讲述ecshop支付插件的工作原理。
首先我们知道ecshop支付插件,是在后台可以安装和卸载的。ecshop 数据库中有一个表ecs_payment .这个表就是用来存储ecshop支付方式的。
ecshop的插件位于includes\modules\payment目录.文件的名称也就是支付方式的标志代码。
每个支付插件类有两个方法。

1: function get_code($order, $payment)
2: function respond()

说说上面两个方法,一个是获得支付页面提交的参数,第二个就是支付完后返回的动作处理函数.这个文件在跟目录的respond.php里面非常有用.
我们看下支付后返回处理动作.
     $pay_code = !empty($_REQUEST['code']) ? trim($_REQUEST['code']) : '';
//获取首信支付方式
if (empty($pay_code) && !empty($_REQUEST['v_pmode']) && !empty($_REQUEST['v_pstring']))
{
    $pay_code = 'cappay';
}
//获取快钱神州行支付方式
if (empty($pay_code) && ($_REQUEST['ext1'] == 'shenzhou') && ($_REQUEST['ext2'] == 'ecshop'))
{
    $pay_code = 'shenzhou';
}

这里返回要获得支付方式的参数,目的就是获取所用的支付方式名称,然后通过调用支付插件所在文件里面的返回处理函数.
      $plugin_file = 'includes/modules/payment/' . $pay_code . '.php';
        /* 检查插件文件是否存在,如果存在则验证支付是否成功,否则则返回失败信息 */
        if (file_exists($plugin_file))
        {
            /* 根据支付方式代码创建支付类的对象并调用其响应操作方法 */
            include_once($plugin_file);
            $payment = new $pay_code();
            $msg     = ($payment->respond()) ? $_LANG['pay_success'] : $_LANG['pay_fail'];
        }
        else
        {
            $msg = $_LANG['pay_not_exist'];
        }

大家看下,都是为了respond()方法的调用。

ecshop让购买流程不填写email

本章将结合平常被咨询的最多的关于ecshop的一个问题。那就是ecshop二次开发让购买流程中不用填写email 。这个问题是最常见的一个ecshop二次开发的问题。也是我们应该引起重视的问题,只要是从事ecshop开发一天。我们就可能会遇到这个问题。

  • 1:ecshop购买流程中的地址填写页面的模板文件位于library/consignee.lbi中。
  • 2:控制购买中填写收货信息的js位于js/shopping_flow.js目录。以下函数是控制函数function checkConsignee(frm)

我们需要找到该ecshop中的js程序。然后删除以下代码。

  if ( ! Utils.isEmail(frm.elements['email'].value))
  {
    err = true;
    msg.push(invalid_email);
  }
  • 3:校验ecshop收货地址的php程序位于includes/lib_order.php中。

function check_consignee_info($consignee, $flow_type)
 这个就是控制ecshop订单处理的核心文件,删除以下代码就可以了

!empty($consignee['email'])

通过以上的修改和改进,我们可以将ecshop购买流程中的邮件地址填写去掉.从而达到简化购买的作用。

ecshop留言板功能分析

本章将结合ecshop二次开发谈谈ecshop留言板的问题。ecshop留言板的数据存储在feedback表中。 ecshop的留言代码在message.php页面。主要提交的参数是留言类型,标题,和内容以及时间。分别是msg_type,msg_title,msg_content三个字段。

     $message = array(
        'user_id'     => $user_id,
        'user_name'   => $user_name,
        'user_email'  => isset($_POST['user_email']) ? htmlspecialchars(trim($_POST['user_email']))     : '',
        'msg_type'    => isset($_POST['msg_type']) ? intval($_POST['msg_type'])     : 0,
        'msg_title'   => isset($_POST['msg_title']) ? trim($_POST['msg_title'])     : '',
        'msg_content' => isset($_POST['msg_content']) ? trim($_POST['msg_content']) : '',
        'order_id'    => 0,
        'msg_area'    => 1,
        'upload'      => array()
     );

  当然如果是匿名留言,那么这里的user_id将等于0.
留言内容的显示,先统计留言的数量,然后统计ecshop留言板不同的留言类型,在ecshop留言板里面,评论也将在里面显示.具体的代码参考以下.
      $sql = "SELECT COUNT(*) FROM " .$GLOBALS['ecs']->table('comment')." WHERE STATUS =1 AND comment_type =0 ";
    $record_count = $db->getOne($sql);
    $sql = "SELECT COUNT(*) FROM " .$GLOBALS['ecs']->table('feedback')." WHERE `msg_area`='1' AND `msg_status` = '1' ";
    $record_count += $db->getOne($sql);

每页流言的显示数量可以从后台设置.$pagesize = get_library_number('message_list', 'message_board');
 在ecshop留言板列表中,都是通过合并ecshop评论和留言两个表来显示数据。具体在该函数里面显示.
function get_msg_list($num, $start)
ecshop留言板内容的提交在该函数里面,add_message().他通过获得$_POST来提交给数据库.