ecshop中ajax.call使用

ajax.call封装在js目录下transport.js这个文件.里面

<script type=”text/javascript”>// <![CDATA[
function colour_label(val,id)
{
   Ajax.call(“goods.php?act=img_label”, “label=” val “&#038;&id=” id, addresscolour_label , “POST”, “JSON”,false);
}

ajax.call后面的参数分别是(请求的URL地址,发送参数,回调函数,请求的方式,有”GET”和”POST”两种,响应类型,有”JSON”、”XML”和”TEXT”三种,是否异步请求的方式,是否安静模式请求)

function addresscolour_label(result)
{
    if(result == “true”)
    {

        alert(result.label);
        for (var one in result.colour_label)
        {
             laert(result.colour_label[one].img_id);
        }
    }
}

的result参数就是goods.php?act=img_label这里输出响应结果.下面是结果

{
“label”:”\u9ed1\u8272″,
“colour_label”:
  [
    {
       “img_id”        : “1012”,
       “img_url”       : “images\/201309\/goods_img\/439_P_1380475365329.jpg”,
       “thumb_url”     : “images\/201309\/thumb_img\/439_thumb_P_1380475365276.jpg”,
       “img_desc”      : “\u68d5\u8272”,
       “goods_id”      : “439”,
       “goods_attr_id” : “2435”
     },
     {
       “img_id”        : “1006”,
       “img_url”       : “images\/201309\/goods_img\/439_P_1380475364611.jpg”,
       “thumb_url”     : “images\/201309\/thumb_img\/439_thumb_P_1380475364120.jpg”,
       “img_desc”      : “\u767d\u8272”,
       “goods_id”      : “439”,
       “goods_attr_id” : “2457”
     },
     {
       “img_id”        : “1009”,
       “img_url”       : “images\/201309\/goods_img\/439_P_1380475365389.jpg”,
       “thumb_url”     : “images\/201309\/thumb_img\/439_thumb_P_1380475365508.jpg”,
       “img_desc”      : “\u9ed1\u8272”,
       “goods_id”      : “439”,
       “goods_attr_id” : “2434”
     }
  ],
“attr_price”:12
}
<script>

php 文件
if($_REQUEST[“act”] == “img_label”)
{
    include_once(“includes/cls_json.php”);
    $json      =   new JSON;

    $label     =   $_REQUEST[“label”];
    $goods_id  =   $_REQUEST[“id”];

    $result[“label”] = $label;
    $sql = “SELECT a.img_id, a.img_url, a.thumb_url, a.img_desc, a.goods_id, b.goods_attr_id” .
           ” FROM ” . $GLOBALS[“ecs”]->table(“goods_gallery”) .” as a “.
    ” left join  “. $GLOBALS[“ecs”]->table(“goods_attr”) .” as b on(a.goods_id = b.goods_id and a.img_desc= b.attr_value ) “.
           ” WHERE a.goods_id = “$goods_id” and a.img_label = “1” group by a.img_desc asc “;
    $result[“colour_label”] = $GLOBALS[“db”]->getAll($sql);

    die($json->encode($result));
}
// ]]></script>

ecshop 更换Kindeditor编辑器

网上的具体更换方法不重叙,需要注意的是后台邮件模版那里,
当切换模版或更改静态代码与html代码时,走的是js处理。
使用常规的KindEditor.ready(初始化时绑定dom)程序是不通的。

处理方法是在js返回页面编辑器代码后再次创建KindEditor对象方法。
在admin/templates/mail_template.htm文件中修改loadTemplateResponse函数
在document.getElementById(“conent_area”).innerHTML = result.content;之后加入以下代码

 //取单选框 mail_type 的当前选中值
 var em = document.forms["theForm"].elements;
 var em_radio = em["mail_type"];
 for (i = 0; i < em_radio.length; i )
 {
 if (em_radio[i].checked)
 {
 var type = em_radio[i].value;
 break;
 }
 }

	if(1 == type)
	{
 var editor;
	 editor = KindEditor.create("textarea[name=\"content\"]", {
	 allowFileManager : true,
	 width : "100%",
	 height: "300px",
	 resizeType: 0, //固定宽高
		 afterBlur : function() {
			this.sync();
			KindEditor.ctrl(document, 13, function() {
			 KindEditor("form[name=theForm]")[0].submit();
			});
			KindEditor.ctrl(this.edit.doc, 13, function() {
			 KindEditor("form[name=theForm]")[0].submit();
			});
		}
	 });

ecshop 后台左侧导航添加菜单

涉及改动的有两块:1是添加左侧菜单,2是添加权限菜单

1 添加左侧菜单

涉及文件:/admin/includes/inc_menu.php

若在“系统设置”内添加菜单,加入如下代码:

$modules[“11_system”][“05_warehouse_list”] = “warehouse_list.php?act=list”;

涉及文件:/languages/zh_cn/admin/common.php

$_LANG[“05_warehouse_list”] = “**列表”;

2 添加到权限菜单

涉及文件:/admin/includes/inc_priv.php

$purview[“05_warehouse_list”] = “warehouse_manage”;

涉及文件:/languages/zh_cn/admin/priv_action.php

$_LANG[“warehouse_manage”] = “**列表管理”;

之后在表ecs_admin_action中插入action_code=warehouse_manage的一条数据,

清缓存后即可看到菜单和权限列表中新加入的菜单项。

实现QQ登录ecshop

你是否也经常看到有些网站上有QQ登录、分享到QQ空间、关注等组件,这些都是腾讯推出的开放平台应用。腾讯开放平台包括两部分,一个是QQ互联开放平台,另一个是微博开放平台。这些开放平台应用对草根来说可是巨大福利,因为它可能给网站带来不可预想的回访机会,IP嗖嗖就上来了。

在这里我就简单说一下QQ互联网站介入。

QQ互联开放平台为第三方网站提供了丰富的API。第三方网站接入QQ互联开放平台后,即可通过调用平台提供的API实现用户使用QQ账号登录网站功能,且可以获取到腾讯QQ用户的相关信息。

一. 开发者注册

1. 在QQ互联开放平台首页 http://connect.qq.com/ ,点击右上角的“登录”按钮,使用QQ账号登录

2. 登录成功后会跳转到开发者注册页面,在注册页面需要提交公司或个人的基本资料

二. 网站接入申请

1.网站接入前,需首先进行申请,获得对应的appid与appkey,以保证后续流程中可正确对网站与用户进行验证与授权。

开发者注册成功后,会跳转到“管理中心”页面。点击创建应用,填写相应的信息,如下图所示:

应用信息填写完成,点击“创建应用”后,应用注册完成,进入管理中心,在管理中心可以查看到网站获取的appid和appkey,如下图所示:

在管理中心,点击申请的网站下的“编辑信息”,进入编辑页面,点击右上角的“编辑”按钮,页面进入编辑状态,即可对网站信息进行修改和完善,如下图所示:

现在就可以开发了网站了。
以下代码就是实现qq登录ecshop的代码
php文件(ecshop根目录下)
<?php
session_start();
define(“IN_ECS”, true);
require(dirname(__FILE__) . “/includes/init.php”);
include_once(dirname(__FILE__) . “/includes/lib_base.php”);
include_once(ROOT_PATH . “includes/lib_transaction.php”);
include_once(ROOT_PATH . “includes/lib_passport.php”);
//应用的APPID
$app_id = “xxxxxxx”;
//应用的APPKEY
$app_secret = “xxxxxxxxxxxxxxxxxxxxxxxxxx”;
//成功授权后的回调地址
$my_url = “http://www.XXXXXX.com/qq.php“;
/*第一步*/
$code = $_REQUEST[“code”];
if(empty($code))
{
   $_SESSION[“state”] = md5(uniqid(rand(), TRUE));   
   $dialog_url = “https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=”.$app_id.”&redirect_uri=”.urlencode($my_url).”&state=”.$_SESSION[“state”];
    header(“Location: “.$dialog_url.”\n”);
}
/*第二部*/
if($_REQUEST[“state”] == $_SESSION[“state”])
{
    $token_url = “https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&”.”client_id=”.$app_id.”&redirect_uri=”.urlencode($my_url).”&client_secret=”.$app_secret.”&code=”.$code;
         $response = file_get_contents($token_url);
         if (strpos($response, “callback”) !== false)
         {
                   $lpos = strpos($response, “(“);
                   $rpos = strrpos($response, “)”);
                   $response  = substr($response, $lpos 1, $rpos – $lpos -1);
                   $msg = json_decode($response);
                   if (isset($msg->error))
                   {
                              echo “<h3>error:</h3>” . $msg->error;
                              echo “<h3>msg  :</h3>” . $msg->error_description;
                              exit;
                     }
             }
         /*第三步*/
        $params = array();
        parse_str($response, $params);
        $graph_url = “https://graph.qq.com/oauth2.0/me?access_token=”.$params[“access_token”];
        $str  = file_get_contents($graph_url);
        if (strpos($str, “callback”) !== false)
        {
                 $lpos = strpos($str, “(“);
                 $rpos = strrpos($str, “)”);
                 $str  = substr($str, $lpos 1, $rpos – $lpos -1);
         }
        $user_info = json_decode($str);
         if (isset($user_info->error))
         {
                  echo “<h3>error:</h3>” . $user_info->error;
                  echo “<h3>msg  :</h3>” . $user_info->error_description;
                  exit;
           }

           /*第四部 数据处理*/
          $openid = “qq-” . $user_info->openid;
          $sql = “SELECT user_id, user_name, password, email FROM ” . $GLOBALS[“ecs”]->table(“users”) . ” WHERE openid=”$openid” LIMIT 1″;
           $row = $GLOBALS[“db”]->getRow($sql);
           $_SESSION[“fromqq”] = “”;
           if (!empty($row))
          {
                 //openid存在
                 $user->set_session($row[“user_name”]);
                 $user->set_cookie($row[“user_name”]);
                 if(!empty($row[“email”]))
                  {
                        //邮箱存在
                       header(“Location: index.html\n”); 
                   }
                   else
                   {
                            $_SESSION[“fromqq”] = “fromqq”;
                            //邮箱不存在
                             header(“Location: regbind.php\n”);
                    }
              }
             else
              {
                      $_SESSION[“fromqq”] = “fromqq”;
                       //openid不存在
                      $user_name = time() . “-” . $user_info->openid;
                      $reg_date  = time();
                      $password  = md5(time());
                      $ip = real_ip();
                      $GLOBALS[“db”]->query(“INSERT INTO ” . $GLOBALS[“ecs”]->table(“users”) . “(`user_name`, `password`, `reg_time`, `last_login`,`last_ip`, `openid`) VALUES (“$user_name”, “$password”, “$reg_date”, “$reg_date”,”$ip”, “$openid”)”); 
                      $user->set_session($user_name);
                      $user->set_cookie($user_name); 
                     header(“Location: regbind.php\n”); 
             }
}
else
{
    echo(“The state does not match. You may be a victim of CSRF.”);
}

regbind文件(ecshop根目录下)
<?php
session_start();
define(“IN_ECS”, true);
require(dirname(__FILE__) . “/includes/init.php”);
/* 载入语言文件 */
require_once(ROOT_PATH . “languages/” .$_CFG[“lang”]. “/regbind.php”);
if($_SESSION[“user_name”] && $_SESSION[“fromqq”] == “fromqq”)
{
       if($_POST[“username”])
       {
                 $username = isset($_POST[“username”]) ? trim($_POST[“username”]) : “”;
                 $email = isset($_POST[“email”]) ? trim($_POST[“email”]) : “”;
                 $pwd = isset($_POST[“password”]) ? trim(md5($_POST[“password”])) : “”;
                 $sql = “UPDATE ” . $ecs->table(“users”) . ” SET `email`=”$email”, `user_name`=”$username”,`password`=”$pwd”  WHERE `user_name`=”” . $_SESSION[“user_name”] . “””;
                $db->query($sql);
                $_SESSION[“fromqq”] == “”;
                $user->set_session($username);
                $user->set_cookie($username);
                header(“Location: index.html\n”);
       }
}
else
{
         header(“Location: index.html\n”);
}
$smarty->assign(“lang”, $_LANG);
$smarty->display(“regbind.dwt”);

qq登录ecshop,系统最新接口OAuth2.0代码分析

    qq登录需要分为五个步骤:

     在这说的这五部主要是获取信息的步骤,至于咋样去申请qq的AIP那就不介绍了。

     第一步:获取access_token

        QQ登录OAuth2.0提供了两种获取access_token的方法,分别是:server-side模式和client-side模式。腾讯建议使用的是server-side模式。

下面是第一步获取access_token的代码,其中state是为了防止CSRF攻击的一个必须填写值,至于填写什么那就看个人爱好了。                                                                             
$dialog_url = “https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=”.$app_id.”&redirect_uri=”.urlencode($back_url).”&state=”.$_SESSION[“state”];
    header(“Location: “.$dialog_url.”\n”);

    第二部:根据access_token获得对应用户身份的openid
    $token_url = “https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&”.”client_id=”.$app_id.”&redirect_uri=”.urlencode($back_url).”&client_secret=”.$app_secret.”&code=”.$code;
    $response = file_get_contents($token_url);

    第三部:根据access_token与openid调用OpenAPI                                         
   $graph_url = “https://graph.qq.com/oauth2.0/me?access_token=”.$params[“access_token”];
    $str  = file_get_contents($graph_url);

  第四部:根据获取信息等到用户的信息
      $info = “https://graph.qq.com/user/get_user_info?access_token=”.$params[“access_token”].”&oauth_consumer_key=100346418&openid=”.$user->openid.”&format=json “;

    得到的用户信息是一个json需要转换,至于咋样转json在这里就不做介绍,我在下一个步骤会直接用ecshop的方法来解决。

  第五步:数据的处理与整合                                                                                                在这一步 大家就可以各抒己见了,可以整合ecshop也可以整合其他的系统。               
require(ROOT_PATH . “includes/cls_json.php”);
    $json   = new JSON;
    $user_info  = $json->decode(get_contents($info));
    $_SESSION[“oauth_token”] = $params[“access_token”];
    $_SESSION[“openid”] = $user->openid;
    $username=$user_info->nickname;
    $password=time();//随便弄个密码
    $email=$_SESSION[“openid”].”@qq.com”;//没有返回邮箱
    $back_act =”user.php”;

   我的关于QQ登录ecshop OAuth2.0的接口就已经大概的介绍完了,下面我把代码贴出供大家研究,

qq.php

<?php
session_start();
define(“IN_ECS”, true);
require(dirname(__FILE__) . “/includes/init.php”);
include_once(ROOT_PATH . “includes/lib_transaction.php”);
include_once(ROOT_PATH . “includes/lib_passport.php”);
//应用的APPID
$app_id = “申请的APPID”;
//应用的APPKEY
$app_secret = “申请的APPKEY”;
//成功授权后的回调地址
$my_url = “回调地址,我这以网址加/qq.php”;
/*第一步*/
$code = $_REQUEST[“code”];
if(empty($code))
{
   $_SESSION[“state”] = md5(uniqid(rand(), TRUE));    
   $dialog_url = “https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=”.$app_id.”&redirect_uri=”.urlencode($my_url).”&state=”.$_SESSION[“state”];
    header(“Location: “.$dialog_url.”\n”);
}
/*第二部*/
if($_REQUEST[“state”] == $_SESSION[“state”])
{
    $token_url = “https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&”.”client_id=”.$app_id.”&redirect_uri=”.urlencode($my_url).”&client_secret=”.$app_secret.”&code=”.$code;
    $response = file_get_contents($token_url);
    if (strpos($response, “callback”) !== false)
    {
        $lpos = strpos($response, “(“);
        $rpos = strrpos($response, “)”);
        $response  = substr($response, $lpos 1, $rpos – $lpos -1);
        $msg = json_decode($response);
        if (isset($msg->error))
        {
            echo “<h3>error:</h3>” . $msg->error;
            echo “<h3>msg  :</h3>” . $msg->error_description;
            exit;
        }
    }
    /*第三步*/
    $params = array();
    parse_str($response, $params);
    $graph_url = “https://graph.qq.com/oauth2.0/me?access_token=”.$params[“access_token”];
    $str  = file_get_contents($graph_url);
    if (strpos($str, “callback”) !== false)
    {
        $lpos = strpos($str, “(“);
        $rpos = strrpos($str, “)”);
        $str  = substr($str, $lpos 1, $rpos – $lpos -1);
    }
    $user = json_decode($str);
    if (isset($user->error))
    {
        echo “<h3>error:</h3>” . $user->error;
        echo “<h3>msg  :</h3>” . $user->error_description;
        exit;
    }
    /*第四部 数据处理*/
    $info = “https://graph.qq.com/user/get_user_info?access_token=”.$params[“access_token”].”&oauth_consumer_key=100346418&openid=”.$user->openid.”&format=json “;
    require(ROOT_PATH . “includes/cls_json.php”);
    $json = new JSON;
    $user_info  = $json->decode(get_contents($info));
  /*这里特变说明一下*/

   $user_info的值是登陆返回的数据,包括OPENID,昵称,头像等信息。程序员可针对自己的系统处理数据,这里需要注意的是
    $_SESSION[“oauth_token”] = $params[“access_token”];
    $_SESSION[“openid”] = $user->openid;
    $username=$user_info->nickname;
    $password=time();//随便弄个密码
    $email=$_SESSION[“openid”].”@qq.com”;//没有返回邮箱
    $back_act =”user.php”;
    /* 检测用户名 */
    if (check_user($username)!==false){//账号存在直接完成登录

        /*判断openID*/

      if($db->getOne(“SELECT COUNT(*) FROM “.$ecs->table(“users”).” WHERE user_name=”$username” AND openid=””.$_SESSION[“openid”].”””)==1){

            set_session($username);
          //$GLOBALS[“user”]->set_cookie($username);
          header(“Location: user.php\n”);
          exit;

       }

      else

     {

            show_message(“对不起,用户名”.$username.”已经存在!”);

       }
       
    }else{
        $reg_date = time();
        $password =md5($password);
        $GLOBALS[“db”]->query(“INSERT INTO ” . $GLOBALS[“ecs”]->table(“users”) . “(`user_name`, `password`, `reg_time`, `last_login`, `openid`) VALUES (“$username”, “$password”, “$reg_date”, “$reg_date”, “$_SESSION[“openid”]”)”);//账号不存在 就写入数据库 并登陆
        set_session($username);
        //$GLOBALS[“user”]->set_cookie($username);
        header(“Location: user.php\n”);
        exit;
    }
    
}
else
{
    echo(“The state does not match. You may be a victim of CSRF.”);
}
 
function set_session($username=””)
{
    $sql = “SELECT user_id, password, email FROM ” . $GLOBALS[“ecs”]->table(“users”) . ” WHERE user_name=”$username” LIMIT 1″;
    $row = $GLOBALS[“db”]->getRow($sql);

    if ($row)
    {
        $_SESSION[“user_id”]   = $row[“user_id”];
        $_SESSION[“user_name”] = $username;
        $_SESSION[“email”]     = $row[“email”];
    }
}
function check_user($username)
{
    $sql = “SELECT user_id FROM ” . $GLOBALS[“ecs”]->table(“users”). ” WHERE user_name=”$username””;
    $row = $GLOBALS[“db”]->getRow($sql);
    if (!empty($row)){ return true; }else{return false;}
}
function get_contents($url)
{
       $curl = curl_init();
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
        curl_setopt($curl,CURLOPT_URL,$url);
        return curl_exec($curl);

}

ecshop 301重定向

当一个网站有许多域名时,为了让搜索引擎更好的收录唯一域名的网站。

需要使用301重新定向,使用户访问网站的其他域名时能够都定向为指定的唯一域名。

使用.htaccess和PHP都可以做到301重定向,这里仅介绍修改.htaccess方法

RewriteEngine On

# 忽略后台域名和想要301定向的网站域名

RewriteCond %{HTTP_HOST} !^后台域名$ [NC]

RewriteCond %{HTTP_HOST} !^网站域名$ [NC]

RewriteRule ^(.*)$ http://网站域名/$1 [L,R=301]

#这样其他的域名就会全部重定向为指定的网站域名

ecshop 屏蔽后台访问

网站的后台地址如果让普通用户正常访问是件很危险的事。

我们使用的方法是在服务器端apache的vhost内加入一个未进行域名解析的别名,

然后通过配置管理员客户端的hosts文件,来限制普通用户访问。

如果其他人不知道网站的ip和后台域名的话,是无法访问后台地址的。

方法如下:

1 服务器端apache的vhost内加入未进行域名解析的别名

<VirtualHost>

ServerAlias 后台域名

</VirtualHost>

2 修改admin/includes/init.php文件,在创建 ECSHOP对象之后添加如下代码:

$admin_path = preg_replace(“/:\d /”, “”, $ecs->url());
if(strpos($admin_path, “后台域名”) === false)
{

//如果使用正式域名访问后台,则直接跳转至前台首页

ecs_header(“Location: ../index.html\n”);

}

3 修改管理员客户端的hosts文件,加入如下一行代码:

网站IP 后台域名

12