存档在 ‘ecshop’ 分类

ECSHOP商品详情页单独调用某一项商品属性值

2016年5月7日

ECSHOP的商品分类商品属性还是很给力的,不过商品详情页是统一调用显示所有的属性值的,这当然有点差强人意。
我们希望单独调用某一项属性值。
第一步:
打开 goods.php 文件, 在最后面插入以下代码:

function get_attr_value($goods_id,$attr_id)
{
 $sql="select attr_value from ".$GLOBALS['ecs']->table('goods_attr')." where goods_id='$goods_id' and attr_id='$attr_id'";
 $re= $GLOBALS['db']->getOne($sql);
 if(!empty($re))
 {
  return $re;
 }
 else
 {
  return false;
 }
}

第二步:
继续查找:

$goods = get_goods_info($goods_id);

在下面添加以下代码:

$example_url=get_attr_value($goods_id,182);
$goods['attr_value']=$example_url;

注意:182为后台的商品属性的ID值,这个非常重要,想调用哪个属性,这里就填写ID。
第三步:
打开 goods.dwt 模板文件相应的位置使用以下代码调用:

{$goods.attr_value}

新增/修改/删除ECSHOP后台左侧导航菜单

2016年5月6日

ECSHOP后台有许多管理菜单,如何增加、删除、修改菜单。

通过以下方法可以实现:
例如:我们要在后台新增一个菜单分类项“APP管理”,再增加一个 APP推送的 子菜单。
1、打开 /admin/includes/inc_menu.php,
查找:

/*APP管理*/
$modules['17_apptuisong']['apptuisong']             = 'apptuisong.php';

ecshop默认一级菜单项有16项,所里这里的例子从17开始。当然这个key可以随便取的,index.php文件中对菜单用了ksort排序。
“17_apptuisong” 表示一级菜单,“apptuisong”表示二级菜单。等号后面的值表示该菜单栏目打开的页面链接。
2、打开/languages/zh_cn/admin/common.php 设置语言项
在合适位置添加:

/*APP管理*/
$_LANG['17_apptuisong'] = 'APP管理';
$_LANG['apptuisong'] = 'APP推送';

3、打开 /languages/zh_cn/admin/priv_action.php
在 权限管理的一级分组 这一块加入以下代码:

$_LANG['apptuisong_manage'] = 'APP管理';

接着在文件最底部 ?> 前一条添加以下代码:

//APP管理
$_LANG['apptuisong']         = 'APP推送';

4、打开/admin/includes/inc_priv.php
查找:

$purview['goods_auto']           = 'goods_auto';

在其下面或者其它合适位置增加:

//APP管理权限
    $purview['apptuisong']           = 'apptuisong';//APP推送

5、把一级菜单和二级菜单的权限关联起来
进入 phpmyadmin 中
找到 ecs_admin_action 表,新增两行数据。如下图
1
OK了。
2

3
如果只是删除菜单栏目,修改 /admin/includes/inc_menu.php 就行了

PHP”cannot modify header information – headers already sent by”错误

2016年5月6日

[06-May-2016 23:00:05 Asia/Shanghai] PHP Warning: Cannot modify header information – headers already sent by (output started at /Applications/MAMP/htdocs/languages/zh_cn/admin/common.php:1) in /Applications/MAMP/htdocs/includes/cls_template.php on line 57

开启:set output_buffering = On in php.ini (开启php.ini中的output_buffering )
如果使用mamp,方法为菜单->File-> Edit template,选择你正在使用的php版本就行。

ecshop表简介

2016年5月2日

user/account

ecs_account_log // 用户账目日志表
  ecs_users // 会员(一些会员信息)
  ecs_user_account // 会员资金流动表,包括提现和充值
  ecs_user_address // 用户收货地址
  ecs_user_bonus // 已经发放的红包清单
  ecs_bonus_type // 红包类型
  ecs_user_rank // 会员等级类型
  ecs_collect_goods // 用户收藏的商品
  ecs_feedback // 用户回馈
  ecs_reg_fields // 会员注册项配置,默认有六项,自己添加的id从100开始,属于扩展注册项
  ecs_reg_extend_info // 记录具体会员扩展项的表,也就是ecs_reg_fields中id大于等于100的项的具体值。
 
 

admin

ecs_admin_user // 管理员资料许可权清单
  ecs_admin_action // 管理员许可权列表树
  ecs_admin_message // 管理员间的留言记录表
  ecs_admin_log // 管理员操作日志
  ecs_agency // 办事处
  ecs_role // 管理员角色,权限表
 
 

goods

ecs_goods // 商品表
  ecs_goods_article // 文章关联产品表
  ecs_article_cat // 文章分类
  ecs_article // 文章列表
  ecs_goods_attr // 具体的各个商品属性表
  ecs_attribute // 商品类型属性表。该表记录每个商品类型具有的属性表
  ecs_goods_type // 商品类型
  ecs_goods_category // 商品分类
  ecs_goods_cat // 具体的商品的扩展商品分类对应表
  ecs_group_goods // 具体的商品配件列表
  ecs_goods_gallery // 商品相册表,只出现在页面的商品相册中
  ecs_booking_goods // 缺货登记
  ecs_comment // 用户评论。任何浏览者对商品或文章的评论。经过管理员审核后才能显示
  ecs_link_goods // 商品关联表,用于在相关商品栏显示
  ecs_member_price // 具体商品为不同等级会员单独制定的价格
  ecs_products // 具体商品的属性库存对应表。在商品列表页面点击货品进入编辑
  ecs_tag // 具体商品具有的标签。比如说标签为音乐手机的商品在搜索音乐手机时会被搜到
  ecs_virtual_card // 虚拟商品(虚拟卡)卡号库
  ecs_volume_price // 具体商品的优惠价格表。比如说原价为1300,当购买数量达到3时 则每台的价格为1200
 
 

activity

ecs_goods_activity // 夺宝奇兵、团购活动、拍卖活动、超值礼包配置资讯
  ecs_snatch_log // 夺宝奇兵出价记录
  ecs_auction_log // 拍卖出价记录
  ecs_favourable_activity // 优惠活动资讯表
  ecs_card // 祝福贺卡
 
 

order

ecs_order_info // 订单的配送,贺卡等详细信息
  ecs_order_goods // 定单中的商品
  ecs_order_action // 对订单操作日志,显示在订单详情最下面
  ecs_cart // 购物车,用户退出后,相应购物车也将清空,在购物车中提交订单后,商品数据转向order
  ecs_back_order // 退货单列表
  ecs_back_goods // 退货单中的商品
  ecs_delivery_order // 发货清单
  ecs_delivery_goods // 发货清单中的商品
  ecs_pay_log // 支付记录
 
 

region

ecs_region // 地区清单
  ecs_shipping // 配送方式
  ecs_shipping_area // 配送方式所属的配送区域和配送费用资讯
  ecs_area_region // 记录表ecs_shipping_area中包括的ecs_region中的城市
 
 

adsense

ecs_ad
  ecs_ad_position
  ecs_ad_custom
  ecs_topic // 专题活动配置表。专题活动可以发表为站外广告。首页flash图片,点击图片进入专题介绍页面并列出专题中的商品
 
 

other

ecs_affiliate_log // 分成相关的表
  ecs_auto_manage // 处理文章,商品自动上下线的计划任务列表;需要ecshop安装计划任务插件才有效
  ecs_crons // 计划任务外挂程式安装配置资讯
  ecs_error_log // 该表用来记录计划任务时失败所产生的错误。從程式來看,目前主要是記錄某計畫任務所對應的外掛程式檔不存在的錯誤
  ecs_cat_recommend // ?
  ecs_email_list // 邮件订阅列表
  ecs_email_sendlist // ?
  ecs_exchange_goods // ?
  ecs_friend_link // 友情链接
  ecs_keywords // 用户在页面搜索关键字统计
  ecs_mail_templates // 各种邮件的配置范本包括杂志范本
  ecs_nav // 自定义导航栏
  ecs_pack // 商品包装配置表
  ecs_package_goods // ?
  ecs_payment // 安装的支付方式配置表
  ecs_plugins // ?
  ecs_searchengine // 搜索引擎访问记录
  ecs_sessions // 管理员或用户登录后session 记录表
  ecs_sessions_data // session资料表(超过255位元组的session内容会保存在该表)
  ecs_shop_config // 全站配置表,对应文件language/zh_ch/admin/shop_config.php
  ecs_stats // 访问咨询记录列表
  ecs_suppliers // 供货商列表
  ecs_template // 模板设置
  ecs_vote // 网站调查咨询记录表
  ecs_vote_log // 投票记录
  ecs_vote_option // 投票的选项内容表
  ecs_wholesale // 批发方案表

smarty foreach详解

2016年4月24日

{foreach} is used to loop over an associative array as well a numerically-indexed array, unlike {section} which is for looping over numerically-indexed arrays only. The syntax for {foreach} is much easier than {section}, but as a tradeoff it can only be used for a single array. Every{foreach} tag must be paired with a closing {/foreach} tag.

{foreach} 用于像循环访问一个数字索引数组一样循环访问一个关联数组,与仅能访问数字索引数组的{section}不同,{foreach}的语法比 {section}的语法简单得多,但是作为一个折衷方案也仅能用于单个数组。每个{foreach}标记必须与关闭标记{/foreach}成对出现。

Attribute Name属性名称 Type类型 Required必要 Default默认值 Description描述
from array数组 Yes必要 n/a The array you are looping through
循环访问的数组
item string字符串 Yes必要 n/a The name of the variable that is the current element
当前元素的变量名
key string字符串 No可选 n/a The name of the variable that is the current key
当前键名的变量名
name string字符 No可选 n/a The name of the foreach loop for accessing foreach properties
用于访问foreach属性的foreach循环的名称
  • Required attributes are from and item.
  • from和item是必要属性
  • The name of the {foreach} loop can be anything you like, made up of letters, numbers and underscores, like PHP variables.
  • {foreach}循环的name可以是任何字母,数组,下划线的组合,参考PHP变量。
  • {foreach} loops can be nested, and the nested {foreach} names must be unique from each other.
  • {foreach}循环可以嵌套,嵌套的{foreach}的名称应当互不相同。
  • The from attribute, usually an array of values, determines the number of times {foreach} will loop.
  • from属性通常是值数组,被用于判断{foreach}的循环次数。
  • {foreachelse} is executed when there are no values in the from variable.
  • 在from变量中没有值时,将执行{foreachelse}。
  • {foreach} loops also have their own variables that handle properties. These are accessed with: {$smarty.foreach.name.property} with “name” being the name attribute.
  • {foreach}循环也有自身属性的变量,可以通过{$smarty.foreach.name.property}访问,其中”name”是name属性。

    Note: The name attribute is only required when you want to access a {foreach} property, unlike {section}. Accessing a {foreach} property with name undefined does not throw an error, but leads to unpredictable results instead.

  •   注意:name属性仅在需要访问{foreach}属性时有效,与{section}不同。访问未定义name的{foreach}属性不会抛出一个错误,但将导致不可预知的结果。

  • {foreach} properties are indexiterationfirstlastshowtotal.
  • {foreach}属性有index, iteration, first, last, show, total.

Example 7-5. The item attribute
例 7-5. item属性

<?php
$arr = array(1000, 1001, 1002);
$smarty->assign('myArray', $arr);
?>

Template to output $myArray in an un-ordered list
用模板以无序列表输出$myArray

<ul>
{foreach from=$myArray item=foo}
    <li>{$foo}</li>
{/foreach}
</ul>

The above example will output:
上例将输出:

<ul>
    <li>1000</li>
    <li>1001</li>
    <li>1002</li>
</ul>

Example 7-6. Demonstrates the item and key attributes
例 7-6. 演示item和key属性

<?php
$arr = array(9 => 'Tennis', 3 => 'Swimming', 8 => 'Coding');
$smarty->assign('myArray', $arr);
?>

Template to output $myArray as key/val pair, like PHP’s foreach.
用模板按键名/键值对的形式输出$myArray, 类似于PHP的foreach。

<ul>
{foreach from=$myArray key=k item=v}
   <li>{$k}: {$v}</li>
{/foreach}
</ul>

The above example will output:
上例将输出:

<ul>
    <li>9: Tennis</li>
    <li>3: Swimming</li>
    <li>8: Coding</li>
</ul>

Example 7-7. {foreach} with associative item attribute
例 7-7. {foreach}的item属性是关联数组

<?php
$items_list = array(23 => array('no' => 2456, 'label' => 'Salad'),
                    96 => array('no' => 4889, 'label' => 'Cream')
                    );
$smarty->assign('items', $items_list);
?>

Template to output $items with $myId in the url
模板中,url通过$myId输出$items

<ul>
{foreach from=$items key=myId item=i}
  <li><a href="item.php?id={$myId}">{$i.no}: {$i.label}</li>
{/foreach}
</ul>

The above example will output:
上例将输出:

<ul>
  <li><a href="item.php?id=23">2456: Salad</li>
  <li><a href="item.php?id=96">4889: Cream</li>
</ul>

Example 7-8. {foreach} with nested item and key
例 7-8. {foreach}使用嵌套的item和key
Assign an array to Smarty, the key contains the key for each looped value.
向Smarty设置一个数组,对于每个键名对应的每个循环值都包括键。

<?php
 $smarty->assign('contacts', array(
                             array('phone' => '1',
                                   'fax' => '2',
                                   'cell' => '3'),
                             array('phone' => '555-4444',
                                   'fax' => '555-3333',
                                   'cell' => '760-1234')
                             ));
?>

The template to output $contact.
用于输出$contact的模板。

{foreach name=outer item=contact from=$contacts}
  <hr />
  {foreach key=key item=item from=$contact}
    {$key}: {$item}<br />
  {/foreach}
{/foreach}

The above example will output:
上例将输出:

<hr />
  phone: 1<br />
  fax: 2<br />
  cell: 3<br />
<hr />
  phone: 555-4444<br />
  fax: 555-3333<br />
  cell: 760-1234<br />

Example 7-9. Database example with {foreachelse}
例 7-9. 使用{foreachelse}的数据库示例
A database (eg PEAR or ADODB) example of a search script, the query results assigned to Smarty
一个数据库(例如PEAR或ADODB)的搜索脚本示例,

<?php
  $search_condition = "where name like '$foo%' ";
  $sql = 'select contact_id, name, nick from contacts '.$search_condition.' order by name';
  $smarty->assign('results', $db->getAssoc($sql) );
?>

The template which display “None found” if no results with {foreachelse}.
借助{foreachelse}标记在没有结果时模板输出”None found”字样。

{foreach key=cid item=con from=$results}
    <a href="contact.php?contact_id={$cid}">{$con.name} - {$con.nick}</a><br />
{foreachelse}
    No items were found in the search
{/foreach}

.index
index contains the current array index, starting with zero.
.index包含当前数组索引,从零开始。

Example 7-10. index example
例 7-10. index示例

{* The header block is output every five rows *}
{* 每五行输出一次头部区块 *}
<table>
{foreach from=$items key=myId item=i name=foo}
  {if $smarty.foreach.foo.index % 5 == 0}
     <tr><th>Title</th></tr>
  {/if}
  <tr><td>{$i.label}</td></tr>
{/foreach}
</table>

.iteration
iteration contains the current loop iteration and always starts at one, unlike index. It is incremented by one on each iteration.
iteration包含当前循环次数,与index不同,从1开始,每次循环增长1。

Example 7-11. iteration and index example
例 7-11. iteration和index示例

{* this will output 0|1, 1|2, 2|3, ... etc *}
{* 该例将输出0|1, 1|2, 2|3, ... 等等 *}
{foreach from=$myArray item=i name=foo}
{$smarty.foreach.foo.index}|{$smarty.foreach.foo.iteration},
{/foreach}

.first
first is TRUE if the current {foreach} iteration is the initial one.
first在当前{foreach}循环处于初始位置时值为TRUE。

Example 7-12. first property example
例 7-12. first属性示例

{* show LATEST on the first item, otherwise the id *}
{* 对于第一个条目显示LATEST而不是id *}
<table>
{foreach from=$items key=myId item=i name=foo}
<tr>
  <td>{if $smarty.foreach.foo.first}LATEST{else}{$myId}{/if}</td>
  <td>{$i.label}</td>
</tr>
{/foreach}
</table>

.last
last is set to TRUE if the current {foreach} iteration is the final one.
last在当前{foreach}循环处于最终位置是值为TRUE。

Example 7-13. last property example
例 7-13. last属性示例

{* Add horizontal rule at end of list *}
{* 在列表结束时增加一个水平标记 *})
{foreach from=$items key=part_id item=prod name=products}
  <a href="#{$part_id}">{$prod}</a>{if $smarty.foreach.products.last}<hr>{else},{/if}
{foreachelse}
  ... content ...
{/foreach}

.show
show is used as a parameter to {foreach}. show is a boolean value. If FALSE, the {foreach} will not be displayed. If there is a {foreachelse} present, that will be alternately displayed.
show是{foreach}的参数. show是一个布尔值。如果值为FALSE,{foreach}将不被显示。如果有对应的{foreachelse},将被显示。
.total
total contains the number of iterations that this {foreach} will loop. This can be used inside or after the {foreach}.
total包括{foreach}将循环的次数,既可以在{foreach}中使用,也可以在之后使用。

Example 7-14. total property example
例 7-14. total属性示例

{* show rows returned at end *}
{* 在结束位置显示行数 *}
{foreach from=$items key=part_id item=prod name=foo}
{$prod.name><hr/>
{if $smarty.foreach.foo.last}
  <div id="total">{$smarty.foreach.foo.total} items</div>
{/if}
{foreachelse}
 ... something else ...
{/foreach}

See also {section} and $smarty.foreach.
参考{section}和$smarty.foreach。

ecshop二次开发中增加input输入框,并且写入到数据库

2016年4月24日

首先打开注册页面。user.php?act=register这个是注册的url首先我们去找user.php然后找到act=register动作

if ($action == 'register')
{
    if ((!isset($back_act)||empty($back_act)) && isset($GLOBALS['_SERVER']['HTTP_REFERER']))
    {
        $back_act = strpos($GLOBALS['_SERVER']['HTTP_REFERER'], 'user.php') ? './index.php' : $GLOBALS['_SERVER']['HTTP_REFERER'];
    }

    /* 取出注册扩展字段 */
    $sql = 'SELECT * FROM ' . $ecs->table('reg_fields') . ' WHERE type < 2 AND display = 1 ORDER BY dis_order, id';
    $extend_info_list = $db->getAll($sql);
    $smarty->assign('extend_info_list', $extend_info_list);

    /* 验证码相关设置 */
    if ((intval($_CFG['captcha']) & CAPTCHA_REGISTER) && gd_version() > 0)
    {
        $smarty->assign('enabled_captcha', 1);
        $smarty->assign('rand',            mt_rand());
    }

    /* 密码提示问题 */
    $smarty->assign('passwd_questions', $_LANG['passwd_questions']);

    /* 增加是否关闭注册 */
    $smarty->assign('shop_reg_closed', $_CFG['shop_reg_closed']);
//    $smarty->assign('back_act', $back_act);
      $smarty->display('user_passport.dwt');
}

看一下display到那个模板。找到user_passport.dwt模板,在这个模板里边添加一个input框,这个就不用多说了吧。我这的input 名称叫 company

 <tr>
          <td align="right">公司名称</td>
          <td><input name="company" type="text" size="25" id="<span style="color:#ff0000;">company</span>"   class="inputBg"/></td>
        </tr>

这样就完成了第一步。然后看看他提交到那个php文件进行处理的。

   <tr>
          <td> </td>
          <td align="left">
          <input name="act" type="hidden" value="act_register" >
          <input type="hidden" name="back_act" value="{$back_act}" />
          <input name="Submit" type="submit" value="" class="us_Submit_reg">
          </td>
        </tr>

由此可以看出是通过act=act_register完成的,所以要在user.php里找到这个动作。

elseif ($action == 'act_register')
{
    /* 增加是否关闭注册 */
    if ($_CFG['shop_reg_closed'])
    {
        $smarty->assign('action',     'register');
        $smarty->assign('shop_reg_closed', $_CFG['shop_reg_closed']);
        $smarty->display('user_passport.dwt');
    }
    else
    {
        include_once(ROOT_PATH . 'includes/lib_passport.php');

        $username = isset($_POST['username']) ? trim($_POST['username']) : '';
        $password = isset($_POST['password']) ? trim($_POST['password']) : '';
        $email    = isset($_POST['email']) ? trim($_POST['email']) : '';
        $other['msn'] = isset($_POST['extend_field1']) ? $_POST['extend_field1'] : '';
        $other['qq'] = isset($_POST['extend_field2']) ? $_POST['extend_field2'] : '';
        $other['office_phone'] = isset($_POST['extend_field3']) ? $_POST['extend_field3'] : '';
        $other['home_phone'] = isset($_POST['extend_field4']) ? $_POST['extend_field4'] : '';
        $other['mobile_phone'] = isset($_POST['extend_field5']) ? $_POST['extend_field5'] : '';
	$other['company'] = isset($_POST['company']) ? $_POST['company'] : '';		
        $sel_question = empty($_POST['sel_question']) ? '' : $_POST['sel_question'];
        $passwd_answer = isset($_POST['passwd_answer']) ? trim($_POST['passwd_answer']) : '';
        $back_act = isset($_POST['back_act']) ? trim($_POST['back_act']) : '';

找到后在这里添加 $other[‘company’] = isset($_POST[‘company’]) ? $_POST[‘company’] : ”;这一项
然后在往下找。。找到下边这段代码。

if (register</span>($username, $password, $email, $other) !== false)
        {
            /*把新注册用户的扩展信息插入数据库*/
            $sql = 'SELECT id FROM ' . $ecs->table('reg_fields') . ' WHERE type = 0 AND display = 1 ORDER BY dis_order, id';   //读出所有自定义扩展字段的id
            $fields_arr = $db->getAll($sql);

            $extend_field_str = '';    //生成扩展字段的内容字符串

这个文件是在这个include文件夹里的,这里边有一个lib_passport.php打开
大概在159行
//定义other合法的变量数组
$other_key_array = array(‘msn’, ‘qq’, ‘office_phone’, ‘home_phone’, ‘mobile_phone’,’company’);
加上company,当然还得再数据库中增加一个字段叫company,然后进入后台清楚缓存,前台刷新,注册。就可以写到数据库了。

详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别

2016年4月24日

实例:

1,http://localhost/aaa/ (打开aaa中的index.php)
结果:
$_SERVER[‘QUERY_STRING’] = “”;
$_SERVER[‘REQUEST_URI’] = “/aaa/”;
$_SERVER[‘SCRIPT_NAME’] = “/aaa/index.php”;
$_SERVER[‘PHP_SELF’] = “/aaa/index.php”;

2,http://localhost/aaa/?p=222 (附带查询)
结果:
$_SERVER[‘QUERY_STRING’] = “p=222”;
$_SERVER[‘REQUEST_URI’] = “/aaa/?p=222”;
$_SERVER[‘SCRIPT_NAME’] = “/aaa/index.php”;
$_SERVER[‘PHP_SELF’] = “/aaa/index.php”;

3,http://localhost/aaa/index.php?p=222&q=333
结果:
$_SERVER[‘QUERY_STRING’] = “p=222&q=333”;
$_SERVER[‘REQUEST_URI’] = “/aaa/index.php?p=222&q=333”;
$_SERVER[‘SCRIPT_NAME’] = “/aaa/index.php”;
$_SERVER[‘PHP_SELF’] = “/aaa/index.php”;

由实例可知:
$_SERVER[“QUERY_STRING”] 获取查询 语句,实例中可知,获取的是?后面的值
$_SERVER[“REQUEST_URI”] 获取 http://localhost 后面的值,包括/
$_SERVER[“SCRIPT_NAME”] 获取当前脚本的路径,如:index.php
$_SERVER[“PHP_SELF”] 当前正在执行脚本的文件名

ECSHOP会员头像,上传头像评论显示头像

2016年4月24日

ECSHOP实现会员头像功能,评论显示会员头像功能。ECSHOP几年没更新了,功能上实在不尽人意,几乎绝大部分的商城网站都有了会员头像功能,但是ECSHOP却没有。得益于ECSHOP的开源,自然有大神二次开发实现了这个功能,一流资源网免费分享出来。

参考链接:http://www.16css.com/ecshop/1142.html
相关文件:02f993d50c98fa976bb577a8d2b889b0