magento促销方案之 - 购物车内点击赠送礼品

 

今天做了关于magento的另外一种促销方案
:在购物车根据客户购买商品数量赠送等数价格为0的小礼品。

希望目标
:在购物车页面左下角块中显示后台设置的赠品专区里的设定数量的商品,当用户点击某款赠品时,即添加到购物车。(根据用户购买商品数可选等量的赠品)

实现

1,在后台建立一个专门存放价格为0的赠品的目录A。另外,将目录的General Information的Is Active属性设为NO,这样在前台商品目录就不会显示这个赠品目录,但在购物车那边客户读取这个目录的产品。

2,然后向目录A添加几个测试商品a1,a2,a3...,注意在Product Information
把Inventory里的Qty设为大于0、价格设为0、
Stock Availability选项选为In Stock、Websites里的站也要勾上,这样赠品添加完毕。

3,代码修改

a文件: /app/design/frontend/default/beautyard/template/checkout/cart.phtml

头部加上:<script>var x = 0,y=0;</script>

b文件: /app/design/frontend/default/beautyard/template/checkout/cart/crosssell.phtml

也是在头部加上():
<?php
$cartNumbers    = Mage::helper('checkout/cart')->getCart()->getSummaryQty();
$maxGift    = 3;    //控制要显示的赠品数
$categoryIds    = 726;    //网站赠品目录的id
$_productCollection = Mage::getResourceModel('reports/product_collection')
        ->addAttributeToSelect('*')    ->addAttributeToFilter('category_ids',array('finset'=>$categoryIds));
$category     = Mage::getModel('catalog/category');
$category->load($categoryIds);
$collection     = $category->getProductCollection();
foreach ($collection as $product) {
    $result[]     = $product->getId();
}
?>
<div id="cartGift" name="cartGift" class="box-others-also-like">
<ul>
<?php
if(count($result)>$maxGift){
    $ourneed = array_rand($result,$maxGift);
    foreach($ourneed as $cc){
    $thisproduct= Mage::getModel('catalog/product')->load($result[$cc]);
?>
    <li>
    <a href="/checkout/cart/add?product=<?php echo $result[$cc]; ?>&qty=1" title="<?php echo $thisproduct->getName(); ?>" ><?php echo $thisproduct->getName(); ?></a>
    </li>
<?php
    }
} ?>
</ul>
</div>
<div id="cartGiftTips" name="cartGiftTips">choose over</div>
<script>(x<=y)?($('cartGift').hide()&&$('cartGiftTips').show()):($('cartGift').show()&&$('cartGiftTips').hide())</script>

c文件:/app/design/frontend/default/beautyard/template/checkout/cart/item/default.phtml

160行左右加上:
<?php if($_item->getCalculationPrice()>0):?>
    <script>x+=<?php echo $this->getQty();?>;</script>
<?php else: ?>
    <script>y+=<?php echo $this->getQty();?>;</script>
<?php endif; ?>
接着更改之后的td:
    <td class="a-center">
        <input name="cart[<?php echo $_item->getId() ?>][qty]" value="<?php echo $this->getQty() ?>" size="4" title="<?php echo $this->__('Qty') ?>" class="input-text qty" maxlength="12"<?php if($_item->getCalculationPrice()==0):?>readonly<?php endif; ?>
/>
    </td>

OK!到此关于magento购物车赠品促功能完毕!

用shell脚本进行MySQL数据库定时备份

来自:http://tieniuzai.com/

对任何一个已经上线的电子商务站点来说,数据备份都是必须的。无论版本更新还是服务器迁移,备份数据的重要性不言而喻。人工备份数据的方式不单耗费 大量时间和精力,还灰常不专业的说。于是,有了下面这段脚本的出现。参考了网上的很多教程,外加自己的测试,以下脚本测试可用。

#!/bin/bash
#Shell Command For Backup MySQL Database Everyday Automatically By Crontab
#Author : Carlos Wong
#Date : 2010-08-24

#配置参数
USER=root #数据库用户名" >用户
PASSWORD=××××× #数据库用户密码
DATABASE=TIENIUZAI    #数据库名称
WEBMASTER=tieniuzai@qq.com #管理员邮箱地址,用以发送备份失败消息提醒
BACKUP_DIR=/var/www/Data_Backup/topons/ #备份文件存储路径
LOGFILE=/var/www/Data_Backup/topons/data_backup.log #日记文件路径
DATE=`date ‘+%Y%m%d-%H%M’` #日期格式(作为文件名)
DUMPFILE=$DATE.sql #备份文件名
ARCHIVE=$DATE.sql.tgz #压缩文件名
OPTIONS=”-u$USER -p$PASSWORD –opt –extended-insert=false –triggers=false -R –hex-blob –flush-logs –delete-master-logs -B $DATABASE”  #mysqldump 参数 详情见帮助 mysqldump -help

#判断备份文件存储目录是否存在,否则创建该目录
if [ ! -d $BACKUP_DIR ] ;
then
mkdir -p “$BACKUP_DIR”
fi

#开始备份之前,将备份信息头写入日记文件
echo ” ” >> $LOGFILE
echo ” ” >> $LOGFILE
echo “———————————————–” >> $LOGFILE
echo “BACKUP DATE:” $(date +”%y-%m-%d %H:%M:%S”) >> $LOGFILE
echo “———————————————– ” >> $LOGFILE

#切换至备份目录
cd $BACKUP_DIR
#使用mysqldump 命令备份制定数据库,并以格式化的时间戳命名备份文件
mysqldump $OPTIONS > $DUMPFILE
#判断数据库备份是否成功
if [[ $? == 0 ]]; then
#创建备份文件的压缩
tar czvf $ARCHIVE $DUMPFILE >> $LOGFILE 2>&1
#输入备份成功的消息到日记文件
echo “[$ARCHIVE] Backup Successful!” >> $LOGFILE
#删除原始备份文件,只需保 留数据库备份文件的压缩包即可
rm -f $DUMPFILE
else
echo “Database Backup Fail!” >> $LOGFILE

#备份失败后向网站管理者发送邮件提醒,需要mailutils或者类似终端下发送邮件工具的支持
#mail -s “Database:$DATABASE Daily Backup Fail” $WEBMASTER
fi
#输出备份过程结束的提醒消息
echo “Backup Process Done”

使用:

  1. 将以上代码保存到: /usr/sbin/DataBackup     (文件名随意,只要不跟系统原有的命令同名即可;代码可以放到任何地方,放在sbin目录下只是为了方便执行,sbin目录下的文件/目录可在终端直接调 用,类似于windows下PATH变量指定的目录)
  2. 脚本添加可执行权限:  sudo chmod +x  /usr/sbin/DataBackup
  3. 执行脚本: sudo  DataBackup
  4. 如果需要定时执行备份命令的,只需将下面这段代码放到crontab 文件(sudo vim /etc/crontab)中去就可以了:

01 3 * * * root /usr/sbin/DataBackup    #它代表着将于每天3点执行DataBackup脚本

小注意一下下:

  1. linux 下的shell脚本定义变量的格式为:  key=value  ,注意他们两者之间的” = “前后不能出现空格,否则系统无法确认该变量。
  2. 红色标注的那行,第一个类似单引号的字符”`”其实不是单引号,它的输入键在键盘ESC键下方。
  3. 这个脚本只适合用于一些小站点的备份,因为它是对数据库进行全部备份而不是增量备份,不适合大容量的数据库备份。

Update:

2010-08-24  :  由于服务器上的MySQL配置文件里 的socket项值为 “/tmp/mysql.sock”, 而mysqldump在链接mysql server的时候会去查找位于/var/lib/mysql/目录下的mysql.sock文件。如果没有则会报错:

mysqldump: Got error: 2002: Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’

解决方法是:一是,修改mysql配置文件里的socket项的值为  ’/var/lib/mysql/mysql.sock’,不过这种方法需要重启mysql服务,很不厚道。

二是,为/tmp/mysql.sock创建一个软链接到/var/lib/mysql/mysql.sock:

ln  -s  /tmp/mysql.sock   /var/lib/mysql/mysql.sock

备忘

GROUP_CONCAT :SELECT GROUP_CONCAT( access.amid ) AS mid FROM wms.access WHERE access.agid=0

以下代码可以取某个范围内的列名,下例中是取5到10列的列名。
select * from INFORMATION_SCHEMA.COLUMNS where table_name='HX' and ordinal_position between 5 and 10

js 数字
<input name="end_price" id="end_price" type="text" size="5" onkeyup="value=value.replace(/[^\d]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" >


SELECT GROUP_CONCAT(mname) from webinfo.mod


批量替换
UPDATE article(表) SET
content = replace(content, ’解决’, ’解放’)
WHERE ID<5000;

查找字段的字符
SELECT a.products_name FROM nikefed.products_description a WHERE a.products_name like '%#%'

大写变小写
strtolower

<fieldset>
    <legend><span>fieldset</span></legend>
<form></form>
</fieldset>

图片与文字水平对齐
图片加:align="absmiddle"

图片hack:margin-bottom:-3px;

<div id="output" style="border:1px solid gray;width:95%;height:400;overflow-y:scroll"></div>


CREATE VIEW qd
AS
(SELECT a.aid, b.bid,b.bfield,c.cvalue
    FROM (a, b ) 
    LEFT JOIN c 
    ON (a.aid = c.aid AND b.bid = c.bid) 
    ORDER BY a.aid ASC, b.bid ASC
);
SELECT a.* FROM qd a
LEFT JOIN
(
SELECT a.aid,a.ma,COUNT(b.aid) AS dd FROM (SELECT aid,MAX(cvalue) AS ma FROM qd GROUP BY aid) a
LEFT JOIN (SELECT aid,MAX(cvalue) AS ma FROM qd GROUP BY aid) b
ON a.ma>=b.ma
GROUP BY a.aid,a.ma
ORDER BY COUNT(b.aid)) d
ON a.aid=d.aid
ORDER BY d.dd;


301
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://www.nkfed.com/");


Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 6144 bytes)  修改php.ini 的memory_limit的值更大点。

桌面url快捷方式  命名为**.url
[DEFAULT]
BASEURL=http://i.hudong.com/home.do
[InternetShortcut]
URL=http://i.hudong.com/home.do
IDList=
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2


js操作换行
<script type="text/javascript">
// <![CDATA[
function toBreakWord(intLen){
    var obj=document.getElementsByName("ff");
    for(var i=0;i<obj.length;i++){
        var strContent=obj[i].innerHTML; 
        var strTemp="";
        while(strContent.length>intLen){
        strTemp+=strContent.substr(0,intLen)+"&#10;"; 
        strContent=strContent.substr(intLen,strContent.length); 
        }
        strTemp+="&#10;"+strContent;
        obj[i].innerHTML=strTemp;
    }
}
if(document.getElementById  &&  !document.all)  toBreakWord(37);
// ]]>
</script>


错误调试
//使用html格式的错误输出内容,比较重要,否则在页面上就乱了
ini_set('html_errors', 1);
//打开所有的错误级别
ini_set('error_reporting', E_ALL);
//显示错误
ini_set('display_errors', 1);
//显示启动错误 推荐在各个业务的入php文件中设置,而不要在php.ini中设置。
ini_set('display_startup_errors', 1);


取分类的头几条记录
Select   *   From   表   A
Where   (Select   Count(*)   From   表   Where   type   =   A.type   And   value   <   A.value)   <   2
Order   By   type,   value



    function get_Curr_Domain() {
        $HTTP_HOST = PMA_getenv('HTTP_HOST');echo $HTTP_HOST.'<br>';
        $HTTP_HOST = strrev($HTTP_HOST);echo $HTTP_HOST.'<br>';
        $HTTP_HOST = explode('.',$HTTP_HOST,3);dump($HTTP_HOST);
        $curr_Domain = htmlspecialchars(strrev($HTTP_HOST[0].'.'.$HTTP_HOST[1]));
        return  $curr_Domain;
    }


linux打包
 tar -cvfz /var/www/html/gamestore8-6.tar.gz /var/www/html/gamestore.com

zip –q –r html.zip html

  $ cp - i exam1.c /usr/wang/shiyan1.c
  该命令将文件exam1.c拷贝到/usr/wang 这个目录下,并改名为 shiyan1.c。若不希望重新命名,可以使用下面的命令:
  $ cp exam1.c /usr/ wang/
  $ cp - r /usr/xu/ /usr/liu/ 将/usr/xu目录中的所有文件及其子目录拷贝到目录/usr/liu中

select组
<select>
    <optgroup label="<5" >
        <option>0</option>
        <option>1</option>
        <option>2</option>
        <option>3</option>
        <option>4</option>
    </optgroup>
    <optgroup label=">4" >
        <option>5</option>
        <option>6</option>
        <option>7</option>
        <option>8</option>
        <option>9</option>
    </optgroup>
</select>

chmod g+ order_doc

启动apache
service httpd start
启动FTP
service vsftpd restart
启动mysql
service mysqld restart

手型
style="cursor: pointer" mce_style="cursor: pointer"

MSN:   <a href="msnim:chat?contact=sales_support@hotmail.com">sales_support@hotmail.com</a>
EMAIL: <a href="mailto:support@tiffanyouth.co.uk">support@tiffanyouth.co.uk</a>

//编码转换:         内容    to     from
mb_convert_encoding($data,'utf-8','gbk')

$  USD   美元
£ GBP   英镑
€  EUR   欧元

监听回车
<script language="javascript">
 function keypress(e)
  {
    var currKey=0,e=e||event;
      if(e.keyCode==13)document.myform.submit();
  }
 document.onkeypress=keypress;
  </script>

  addslashes<==>stripcslashes

jquery查找和替换
t:要查找替换的字符串 
$.each(t, function(k, v) {
    /^[A-Za-z0-9]$/.exec(v) || (t=t.replace(t[k],'-'));
});

select下拉框的第二个元素为当前选中值
$('#select_id')[0].selectedIndex = 1;

radio单选组的第二个元素为当前选中值
$('input[@name=items]').get(1).checked = true;

获取select被选中项的文本
var item = $("#gp_pid option:selected").text();
var item = $("select[@name=items] option[@selected]").text();

$("#sel").attr("value",'-sel3');//设置value=-sel3的项目为当前选中项

单选组radio: $("input[@type=radio]").attr("checked",'2');//设置value=2的项目为当前选中项

$("#select_id").attr("value",'test');//设置value=test的项目为当前选中项

js获取时间
new Date().getTime()
Math.random();

//随机输出
if(!flag){
    var words=[
        {image:0,head:"msg1",body:"cnt1"},
        {image:1,head:"msg2",body:"cnt2"},
        {image:2,head:"msg3",body:"cnt3"},
        {image:"mini",head:"",body:""}];
    var rand = new Date().getTime() % 3;
    var content =
    '<div>'.words[rand].image+'.jpg'+
        '<h2>'+words[rand].head+'</h2>'+
        '<p>'+words[rand].body+'</p>'+
    '</div>';
    document.write(content);
}

//js加载块内容的方式
<div class="login_inner">
<script type="text/javascript">
    document.write('<iframe id="login_iframe" style="height:300px;width:366px;" class="loginIframe" frameborder="no" scrolling="no" src="#"></iframe>');
</script>
</div>

js设置样式
if ( is_IE ){
document.getElementById(controlID).className = controlCssClass ;
}
else if ( is_NN ){
document.getElementById(controlID).setAttribute("class", controlCssClass) ;
}

jquery 验证email
 var search_str = /^[\w\-\.]+@[\w\-\.]+(\.\w+)+$/;
 var email_val = $("#Email").val();
 if(!search_str.test(email_val)){      
 alert("please input right email !");
 $('#Email').focus();
 return false;
 }

linux 压缩打包tar命令备忘

排除目录下不需要打包的目录

tar cvfz chenxu.tar.gz dir --exclude dir/dir1 --exclude dir/dir2/dir3

 

tar在linux上是常用的打包、压缩、加压缩工具,他的参数很多,折里仅仅列举常用的压 缩与解压缩参数

参数:

-c :create 建立压缩档案的参数;

-x : 解压缩压缩档案的参数;

-z : 是否需要用gzip压缩;

-v: 压缩的过程中显示档案;

-f: 置顶文档名,在f后面立即接文件名,不能再加参数

 

举例: 一,将整个/home/www/images 目录下的文件全部打包为 /home/www/images.tar

[root@xoaocom ~]# tar -cvf /home/www/images.tar /home/www/images ← 仅打包,不压缩

[root@xoaocom ~]# tar -zcvf /home/www/images.tar.gz /home/www/images ← 打包后,以gzip压缩

 

在参数f后面的压缩文件名是自己取的,习惯上用tar来做,如果加z参数,则以tar.gz 或tgz来代表gzip压缩过的tar file文件

 

举例: 二,将 /home/www/images.tar.gz 解压到/home/www下面

[root@xoaocom ~]# cd /home/www

[root@xoaocom ~]# tar -zxvf /home/images.tar.gz

 

解压到指定的目录

[root@xoaocom ~]# tar -zxvf /home/images.tar.gz -C /specific dir

 

解包到指定的目录

tar xvf filename.tar -C /specific dir

thinkphp 自带常量

Action中使用的系统常量

THINK_PATH // ThinkPHP 系统目录
APP_PATH // 当前项目目录
APP_NAME // 当前项目名称
MODULE_NAME //当前模块名称
ACTION_NAME // 当前操作名称
TMPL_PATH // 项目模版目录
LIB_PATH // 项目类库目录
CACHE_PATH // 项目模版缓存目录
CONFIG_PATH //项目配置文件目录
LOG_PATH // 项目日志文件目录
LANG_PATH // 项目语言文件目录
TEMP_PATH //项目临时文件目录
PLUGIN_PATH // 项目插件文件目录
VENDOR_PATH // 第三方类库目录
DATA_PATH // 项目数据文件目录
IS_APACHE // 是否属于 Apache
IS_IIS //是否属于 IIS
IS_WIN //是否属于Windows 环境
IS_LINUX //是否属于 Linux 环境
IS_FREEBSD //是否属于 FreeBsd 环境
NOW_TIME // 当前时间戳
MEMORY_LIMIT_ON // 是否有内存使用限制
OUTPUT_GZIP_ON // 是否开启输出压缩
MAGIC_QUOTES_GPC // MAGIC_QUOTES_GPC
THINK_VERSION //ThinkPHP 版本号
LANG_SET // 浏览器语言
TEMPLATE_NAME //当前模版名称
TEMPLATE_PATH //当前模版路径
__ROOT__ // 网站根目录地址
__APP__ // 当前项目(入口文件)地址
__URL__ // 当前模块地址
__ACTION__ // 当前操作地址
__SELF__ // 当前 URL 地址
TMPL_FILE_NAME //当前操作的默认模版名(含路径)
WEB_PUBLIC_URL //网站公共目录
APP_PUBLIC_URL //项目公共模版目录

 

模板中使用的系统常量

_PHP_FILE_ /当前文件名
__ROOT__ // 网站根目录地址
__APP__ // 当前项目(入口文件)地址
__URL__ // 当前模块地址
__ACTION__ // 当前操作地址
__SELF__ // 当前 URL 地址
__PUBLIC__ // 网站公共目录
../Public(不区分大小写) // 项目公共模版目录