Magento升級到1.5后结账页面找不到”Place Order”按钮問題

Magento兰亭模板2011最新版下载地址,有木有!
 也有网友反映Magento1.5使用兰亭模板出现”Place Order”
按钮消失的问题。另外这问题在Magento版本升级中也会遇到。贴下处理过程

1) 打开该主题下的布局文件checkout.xml

2)搜索"One page checkout order review block",兰亭模板是在381行。在<checkout_onepage_review translate="label">这里加上

<block type="core/template" name="checkout.onepage.review.button" as="button" template="checkout/onepage/review/button.phtml"/>

这个块。

最后类似,

<!--
One page checkout order review block
-->
 
    <checkout_onepage_review translate="label">
        <label>One Page Checkout Overview</label>
        <!-- Mage_Checkout -->
        <remove name="right"/>
        <remove name="left"/>
 
        <block type="checkout/onepage_review_info" name="root" output="toHtml" template="checkout/onepage/review/info.phtml">
            <action method="addItemRender"><type>default</type><block>checkout/cart_item_renderer</block><template>checkout/onepage/review/item.phtml</template></action>
            <action method="addItemRender"><type>grouped</type><block>checkout/cart_item_renderer_grouped</block><template>checkout/onepage/review/item.phtml</template></action>
            <action method="addItemRender"><type>configurable</type><block>checkout/cart_item_renderer_configurable</block><template>checkout/onepage/review/item.phtml</template></action>
            <block type="checkout/cart_totals" name="checkout.onepage.review.info.totals" as="totals" template="checkout/onepage/review/totals.phtml"/>
            <block type="core/text_list" name="checkout.onepage.review.info.items.before" as="items_before" translate="label">
                <label>Items Before</label>
            </block>
            <block type="core/template" name="checkout.onepage.review.button" as="button" template="checkout/onepage/review/button.phtml"/>
        </block>
    </checkout_onepage_review>

保存后清空缓存,”Place Order”按钮消失的问题就解决了。

Magento修改邮件模板内容

Magento
默认邮件模板
都是带着官方的标志和一些官方的基本信息。为了建立品牌形象我们需要把邮件模板中的所有官方信息换成自己的信息。修改步骤如下:


1、找到Magento的邮件模板文件(这里以 en_US为例),如下列文件:
magento\app\locale\en_US\template\email\account_new.html:
magento\app\locale\en_US\template\email\admin_password_new.html:
magento\app\locale\en_US\template\email\newsletter_subscr_confirm.html:
magento\app\locale\en_US\template\email\order_creditmemo.html:
magento\app\locale\en_US\template\email\order_creditmemo.html:
magento\app\locale\en_US\template\email\order_invoice.html:
magento\app\locale\en_US\template\email\order_invoice.html:
magento\app\locale\en_US\template\email\order_new.html:
magento\app\locale\en_US\template\email\order_new.html:
magento\app\locale\en_US\template\email\order_shipment.html:
magento\app\locale\en_US\template\email\order_shipment.html:
magento\app\locale\en_US\template\email\order_update.html:
magento\app\locale\en_US\template\email\password_new.html:
magento\app\locale\en_US\template\email\wishlist_share.html:
(部分路径在app\locale\en_US\template\email\sales\
)
这 里的en_US是语言文件,这里修改的是英文界面下的邮件模板

2、修改信息(这里以订单确认信为例)

换logo的方法:把\order_update.html: 里原有的logo地址改为 -> {{store url=""}}skin/frontend/default/default/images/logo.gif

 

添加订单时间,变量是:{{var order.created_at}}

 

修改网站名称Main Website Store:这个世界在后台System - Manage Stores那边,更改Store Name就可以。

 

其他的林林总总也是修改或带变量,在修改Magento邮件模板
的时候千万不要写死内容。。不然后期维护麻烦

thinkphp 使用技巧总结 - 快速入门

在比较了下Zend Framework、CakePHP等框架后,我认为ThinkPHP的开发效率最高,代码最为简洁,最适合中小型项目开发。


1. 模板中不能使用的标签
{$content} {$i}
2. If标签
如: <if condition="$name eq 1 ">
试验后总是有想不到的错误, 这样,还不如直接用<?php if(...){ ...?>来得快些呢.

约定:
1.所有类库文件必须使用.class.php作为文件后缀,并且类名和文件名保持一致
2.控制器的类名以Action为后 缀
3.模型的类名以Model为后缀,类名第一个字母须大写
4.数据库表名全部采用小写,

如:
数据表名: 前缀_表名
模型类名: 表名Model 注:这里的表名第一个字母要大写
创建对象: D('表名') 注:这里的表名第一个字母要大写

定义控制器类
class IndexAction extends Action{
    public function show(){
        echo '这是新的 show 操作';
    }
}
然后在浏览器里面输入
http://localhost/myApp/index.php/Index/show/


定义模型类:
class 表名Model extends Model{
[//手动定义字段[可选]
    protected $fields = array(
    'id',
    'username',
    'email',
    'age',
    '_pk'=>'id', //主键
    '_autoInc'=>true //是否自增
    )
]
}

记录的修改:
$User = D("User") // 实例化 User 对象
$User->find(1) // 查找 id 为 1 的记录
$User->name = 'ThinkPHP' // 把查找到的记录的名称字段修改为 ThinkPHP
$User->save() // 保存修改的数据
更新特定字段的值
$User->setField('name','TopThink','id=1')
同 样可以支持对字段的操作
$User->setField('score','(score+1)','id=1')


新建记录,方法1:
$User = new UserModel() //实例化 User 对象
$User->字 段名 = 字段值 //给字段赋值
$User->add() //添加记录
新建记录,方法2:
$data['字段名'] = 字段值; //给字段赋值
$User = D('User'); //实例化 User 对象
$User->add($data); //$insertId,Add 方法的返回值就是最新插入的主键值,可以直接获取。
新增多条记录:
$User = new UserModel()
$data[0]['name'] = 'ThinkPHP'
$data[0]['email'] = 'sjolzy@chen.com'
$data[1]['name'] = '流年'
$data[1]['email'] = 'chen@sjolzy.cn'
$User>addAll($data)


删除记录
$User->find(2)
$User->delete() // 删除查找到的记录
$User->delete('5,6') // 删除主键为 5、6 的数据
$User->deleteAll() // 删除查询出来的所有数据

记录查询

$User->getDbFields() //获取当前数据字段
$User->findAll(); //查找所有记录
$User->findAll('1,3,8') //查询主键为1,3,8的记录集
$User->count() // 获取记录数
$User->max('score') // 获取用户的最大积分
$User->min('score','score>0') // 获取积分大于 0 的用户的最小积分
$User->avg('字段名') // 获取所有记录的字段值的平均值
$User->sum('字段名 ') // 统计字段值
$User->getN(2,'score>80','score desc') // 返回符合条件的第 2 条记录
$User->getN(2,'score>80','score desc') //还可以获取最后第二条记录
$User->first('score>80','score desc') //如果要查询第一条记录,还可以使用
$User->last('score>80','score desc') // 获取最后一条记录
$User->top(5,'','score desc') // 获取积分最高的前 5 条记录
$User->getBy('name','liu21st') //跟据字段的字段值来查询记录

$Model = new Model() // 实例化一个 model 对象 没有对应任何数据表
$Model->query("select * from think_user where status=1")

$objrs = $Model->query("select * from think_user where status=1") //自定义查询
$Model->execute("update think_user set name='thinkPHP' where status=1") //用于更新和写入数据的 sql 操作,返回影响的记录数


$User->startTrans() // 启动事务
$User->commit() // 提交事务
$User->rollback() // 事务回滚

模板:

$this->assign('name',$value); //在 Action 类里面使用 assign 方法对模板变量赋值,无论何种变量类型都统一使用 assign 赋值

$this->display() // 输出模版文件

批量赋值
$array['name'] = 'thinkphp'
$array['email'] = 'chen@sjolzy.cn'
$array['phone'] = '12335678'
$this->assign($array)


$this->display() // 调用 User 模块的 read 操作模版
$this->display('edit') // 调用 User 模块的 edit 操作模版
$this->display('Member:read') // 调用 Member 模块的 read 操作模版
$this->display('Xp@User:edit') // 调用 Xp 主题的 User 模块的 edit 操作模版
$this->display('../Member/read.html') // 直接指定模版文件的全名

模板标签:

{ } 或 {// 注释内容 } //模板注释
{$user['name']} //输出数组变量
{$user:name} //输出对象的属性

为了方便模板定义,无论输出的模板变量是数组还是对象,都可以用下列统一方式输出:
{$user.name}
如果是多维数组或者多 层对象属性的输出,请使用下面的定义方式:
{$user['sub']['name']}
{$user:sub:name}

使用函数:
格式:{$varname|function1|function2=arg1,arg2,### }
说明:
{ 和 $ 符号之间不能有空格 ,后面参数的空格就没有问题
###表示模板变量本身的参数位置

系统变量
{$Think.server.script_name } //取得$_SERVER 变量
{$Think.session.session_id|md5 } // 获取$_SESSION 变量
{$Think.get.pageNumber } //获取$_GET 变量
{$Think.cookie.name } //获取$_COOKIE 变量
系统常量
{$Think.const.__FILE__ }
{$Think.const.MODULE_NAME }
特殊变量 ,由 ThinkPHP 系统定义的常量
{$Think.version } //版本
{$Think.now } //现在时间

快捷输出
{:function(…)} //执行方法并输出返回值
{~function} //执行方法不输出
{@var} //输出 Session 变量
{&var} //输出配置参数
{%var} //输出语言变量
{.var} //输出 GET 变量
{^var} //输出 POST 变量
{*var} //输出常量

包含外部文件
<include file="$tplName" /> // 用变量控制要导入的模版
<include file="../Public/header.html" /> // 使用一个完整的文件名包含

循环输出
iterate 还有其它的别名,包括 volist,resultset,sublist

模版赋值:
$User = D('User')
$list = $User->findAll()
$this->assign('list',$list)

模版定义:
<iterate name="list" id="vo">
{$vo.name}
</iterate>

注意 name 和 id 表示的含义
// 输出 list 的第 5~15 条记录
<iterate name="list" id="vo" offset="5" length='10'>
{$vo.name}
</iterate>

// 输出偶数记录
<iterate name="list" id="vo" mod="2" >
<eq name="mod" value="1">
{$vo.name}
</eq>
</iterate>

// 输出 key
<iterate name="list" id="vo" key="k" >
{$k}.{$vo.name}
</iterate>

//子循环输出
<volist name="list" id="vo">
<sublist name="vo['sub']" id="sub">
{$sub.name}
</sublist>
</volist>

Switch 标签
<switch name="name">
<case value="1">value1</case>
<case value="2">value2</case>
<default />default
</switch>
其 中 name 属性可以使用函数以及系统变量,例如:
<switch name="Think.get.userId|abs">
<case value="1">admin</case>
<default />default
</switch>
也 可以对 case 的 value 属性使用变量,例如:
<switch name="userId">
<case value="$adminId">admin</case>
<case value="$memberId">member</case>
<default />default
</switch>

比较标签
<eq name="name" value="value">value</eq> // name 变量的值等于 value 就输出
<neq name="name" value="value">value</neq> // name 变量的值不等于 value 就输出
<gt name="name" value="5">value</gt> // name 变量的值大于 5 就输出
<egt name="name" value="5">value</egt> // name 变量的值大于等于 5 就输出
<lt name="name" value="5">value</lt> // name 变量的值小于 5 就输出
<elt name="name" value="5">value</elt> // name 变量的值小于等于 5 就输出


//其实上面的所有标签都是 compare 标签的别名
// 其中 type 属性的值就是上面列出的判断标签名称
<compare name="name" value="5" type="eq">value</compare> // name 变量的值等于 5 就输出

If标签
<if condition="$name eq 1 "> value1
<elseif condition="$name eq 2" />value2
<else /> value3
</if>

C操作
操作(动态)配置: 主要用于Action方法里面
获取:
C('配置参数')
设置:
C('配置参数 ',新值)

A操作
快速创建Action对象:
$action = A('User');
等效于
$action = new UserAction();

D操作
快速创建模型数据对象:
$model = D('User');
等效于
$model = new UserModel();

S操作
快速操作缓存方法
获取:
S('name')
设置:
S('name','value');
删 除:
S('name',NULL);

F操作
快速文件数据保存方法
使用方法与S操作一样


L操作
快速操作语言变量
获取:
L('语言变量');
设置:
L('语言变量','值');
如: L('USER_INFO','用户信息'); //设置名称为USER_INFO的语言变量
批量赋值:
$arr['语言变量1'] = '值1';
$arr['语言变量2'] = '值2';
L($arr);


Create PROCEDURE procedure1

(IN parameter1 INTEGER)

BEGIN

DECLARE variable1 CHAR(10);

IF parameter1 = 17 THEN

SET variable1 = 'birds';

ELSE

SET variable1 = 'beasts';

END IF;

Insert INTO table1 VALUES (variable1);

END

ThinkPHP系统常量

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 // 是否有内存使用限制

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   //项目公共模版目录

预定义常量
WEB_LOG_ERROR=0     // 错误日志类型
WEB_LOG_DEBUG=1 // 调试日志类型
SQL_LOG_DEBUG=2   // SQL 日志类型
SYSTEM_LOG=0   // 系统方式记录日志
MAIL_LOG=1   // 邮件方式记录日志
TCP_LOG=2   // TCP 方式记录日志
FILE_LOG=3   // 文件方式记录日志
DATA_TYPE_OBJ=1 // 对象方式返回
DATA_TYPE_ARRAY=0 // 数组方式返回
URL_COMMON=0   // 普通模式 URL
URL_PATHINFO=1   // PATHINFO URL
URL_REWRITE=2   // REWRITE URL
HAS_ONE=1   // HAS_ONE 关联定义
BELONGS_TO=2   // BELONGS_TO 关联定义
HAS_MANY=3   // HAS_MANY 关联定义
MANY_TO_MANY=4   // MANY_TO_MANY 关联定义
EXISTS_TO_VAILIDATE = 0 // 表单存在字段则验证
MUST_TO_VALIDATE = 1 // 必须验证
VALUE_TO_VAILIDATE = 2 // 表单值不为空则验证

thinkphp 语言包加载失败的解决办法

在浏览器未设置默认语言的时候,thinkphp便检测不到语言,导致语言包加载失败直接输出。

thinkphp2.0语言检测和模板检测是在ThinkPHP\Lib\Think\Core的App.class.php的239行开始,查看代码便可知,当未检测到语言的时候,无法加载语言包。

我的解决办法是,在项目公共部分从配置表中读取站点要设置的语言和模板,代码只有三句话


cookie('think_language','en-us',3600);

cookie('think_template','default',3600);

App::init();

原理就是在thinkphp框架编译完后覆盖语言检测和模板检测再进行一次自己定义的检测。

这是目前比较好的办法了吧~~

magento控制器机制

 

 

magento的请求周期(request cycle)

magento对某个URL的请求是如何被翻译成到某个特定模块的执行呢?我们来看一下下面的这个URL:

http://example.com/magento/(index.php)/customer/account/index/

以反斜杠为分隔符,URL分成以下这几部分:

http://example.com   域名

magento                   URL前缀

(index.php)               不一定会有这个部分。当你使用apacherewrite功能时可以省略掉index.php

customer                   模块

account                     前台控制器

index                         action名,通常默认为index

要追踪一个对magento请求的执行过程并非易事,原因在于以下两点:
1、使用了router
2、使用了dispatch机制

首先是由默认的前端控制器接受请求,它会将请求参数和内部的router列表进行匹配,如果匹配成功,那么就会将请求交给另一个新的前端控制器(由请求参数和router匹配所得到的模块中的创建)。通常最后的(MVC型)控制器是一个"Front Action"对象,它里面定义了一系列的有关业务逻辑的method(方法)。这个对象最后会根据请求参数来决定调用哪 一个action method来处理请求,在处理完后将请求标识为"dispatched"。

 


认识magento的module(模块)

module是magento最重要的部分。在magento站点中的任何一个操作,无论是在前台还是后台都是通过模块来实现的。在magento中一个模块是由下列这几项的的一项或项组成:配置文件数据库" title="数据库">数据库相关的sql文件,呈现对象(rendering objects),辅助(helper class),数据模型和动作控制器(action controller)。

magento中的模块是放在什么位置,我们开发的模块应该放在什么地方?magento引入了代码池(code pool)和包(package)两个概念。细心的你可以已经发现app/code下有三个目录,这是magento提供的代码池。其中所有magento自带的模块被放到core当中,而local则用来保存我们自己开发的模块,community则用来存放我们集成到magento中的第三方插件代码,不过这个文件夹有可能在后来的版本中淘汰掉。你可能已经发现magento的模块不是直接放在代码池core目录下,而是放在core代码目录下的Mage目录中。magento将代码池下的目录称作包,目的不仅仅是将相关的模块用包分组,更重要的是通过将某个包下面的所有模块名都使用包名为前缀(如Mage包下的所有模块名前缀是Mage_)规范来达到名字空间的作用,使开发人员免去名重复的困扰。

参看下面的目录结构和相关的代码中定义的名:
- App/    
|- code/      
| |- community/
| |- core/
| | |- Mage/
| | |- Zend/
| |- local/
|- design/ 
|- etc/

下面是magento中的catalog模块目录结构:
- Mage/            包名
|- Catalog/       模块
| |- Block/         呈现对象(rendering objects)
| |- Helper/       辅助(helper class) 
| |- Model/        数据模型。负责数据操作
| |- controllers/ 动作控制器(action controller)
| |- etc/             配置文件
| |- sql/              数据库" title="数据库">数据库相关的sql文件


blocks: blocks是一组用来协调模板文件模型的对象,每个block对应一个模板文件模板文件是指以.phtml扩展名" title="扩展名">扩展名的文件,其实就是一个普通的在html中嵌入php代码文件)。每一次的magento请求实际上是处理一系列的block对象和相应的模板文件。所有的block继承Mage_Core_Block_Template(它继承Mage_Core_Block_Abstract),它的主要方法是toHtml(),它通过调用renderView()来将模板文件翻译成html代码。magento默认不使用任何的模板引擎" title="模板引擎">模板引擎,而是直接使用php。所有renderView()事实上只是简单的调用include包含模板文件而以,如果你想使用其它的模板引擎" title="模板引擎">模板引擎,你可以通过修改Mage_Core_Block_Template的renderView()方法来实现。


controllers: controller是所有业务逻辑的起点。每个controller都继承Mage_Core_Controller_Varien_Action,它实际只是zend的Zend_Controller_Action的简单修改版本,包括下面三个主要的方法


• dispatch($action)
• preDispatch()
postDispatch()

helper: 重要的是__(两个下划线)和htmlEscape方法。__用来翻译字符串" title="字符串">字符串,几乎可以在任何一个对象内调用

配置文件模块配置文件存放在该模块目录下的etc目录下。通常会有三个配置文件,其中config.xml是会直接影响到模块的动作。还有两个system.xml和convert.xml会自动生成供你在使用管理后台form表单

在magento中的一切都可视为模块。甚至magento本身也是在zend框架下开发出的一个模块模块本身可以有配置文件数据库" title="数据库">数据设置,这样开发人员就可以对magento进一步扩展