今天的旅程将继续基于上一章节 Magento 发送自定义邮件
在上一章节中, 我们看到了如何在自定义的模块中创建新的邮件模板,并发送邮件, 在这一章节中, 我们会看到 Magento 在邮件模板中提供的大部分语句(directives)和变量赋值方法(variable assignment method)
建立邮件模板
在这里,我会重复一些在上一张章节中所讲述的步骤, 创建一个新的邮件模板
首先创建我们的 system.xml, 并写入如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
<
config
>
<
sections
>
<
customer
>
<
groups
>
<
account_share
>
<
fields
>
<
custom_template
translate
=
"label"
>
<
label
>
Custom
Email
<
/
label
>
<
frontend_type
>
select
<
/
frontend_type
>
<
source_model
>
adminhtml
/
system_config_source_email_template
<
/
source_model
>
<
sort_order
>
3
<
/
sort_order
>
<
show_in_default
>
1
<
/
show_in_default
>
<
show_in_website
>
1
<
/
show_in_website
>
<
show_in_store
>
1
<
/
show_in_store
>
<
/
custom_template
>
<
custom_identity
translate
=
"label"
>
<
label
>
Email
Sender
<
/
label
>
<
frontend_type
>
select
<
/
frontend_type
>
<
source_model
>
adminhtml
/
system_config_source_email_identity
<
/
source_model
>
<
sort_order
>
4
<
/
sort_order
>
<
show_in_default
>
1
<
/
show_in_default
>
<
show_in_website
>
1
<
/
show_in_website
>
<
show_in_store
>
1
<
/
show_in_store
>
<
/
custom_identity
>
<
/
fields
>
<
/
account_share
>
<
/
groups
>
<
/
customer
>
<
/
sections
>
<
/
config
>
|
添加完成之后, 你会在 System -> Configuration -> Customer Configuration -> Account Sharing Options 中看到两个新增的下拉框
接下来就是我们的 config.xml, 写入如下代码:
并创建邮件模板文件 app\locale\en_US\template\email\test.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<
global
>
<
template
>
<
email
>
<
customer_account_share_custom_template
translate
=
"label"
module
=
"email"
>
<
label
>
Custom
Test
Email
<
/
label
>
<
file
>
test
.
html
<
/
file
>
<
type
>
html
<
/
type
>
<
/
customer_account_share_custom_template
>
<
/
email
>
<
/
template
>
<
/
global
>
<
default
>
<
customer
>
<
account_share
>
<
custom_identity
>
general
<
/
custom_identity
>
<
custom_template
>
customer_account_share_custom_template
<
/
custom_template
>
<
/
account_share
>
<
/
customer
>
<
/
default
>
|
在 PHP 文件中发送邮件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
const
XML_PATH_TEST_EMAIL
=
'customer/account_share/custom_template'
;
const
XML_PATH_TEST_EMAIL_IDENTITY
=
'customer/account_share/custom_identity'
;
public
function
sendTestEmail
(
$to
,
$name
)
{
$translate
=
Mage::
getSingleton
(
'core/translate'
)
;
/* @var $translate Mage_Core_Model_Translate */
$translate
->
setTranslateInline
(
false
)
;
$storeId
=
Mage::
app
(
)
->
getStore
(
)
->
getId
(
)
;
Mage::
getModel
(
'core/email_template'
)
->
setDesignConfig
(
array
(
'area'
=
>
'frontend'
,
'store'
=
>
$storeId
)
)
->
sendTransactional
(
Mage::
getStoreConfig
(
self
::
XML_PATH_TEST_EMAIL
,
$storeId
)
,
Mage::
getStoreConfig
(
self
::
XML_PATH_TEST_EMAIL_IDENTITY
,
$storeId
)
,
$to
,
$name
,
array
(
'variable1'
=
>
'Shawn'
,
'object'
=
>
$this
,
'html'
=
>
'Shawn<b>test</b>'
)
)
;
$translate
->
setTranslateInline
(
true
)
;
}
|
Magento 提供了很多语句(directive)可以把动态信息(dynamic information)传到邮件模板中, 现在我们来逐条解析
所有和语句相关的代码都写在 Mage_Core_Model_Email_Template_Filter 类里
var 语句
这是用来使用接收到的变量值, 语法如下:
1
2
3
4
5
|
类型一
{
{
var
variable1
}
}
用来接收到在
sendTransactional
(
)
方法中的
array
(‘
variable1′
=
>’
Shawn’
)
这样就可以将
Shawn
输出到邮件模板中
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
类型二
{
{
var
object
.
object_text
}
}
通过传过来的
object
对象来调用
getObjectText
(
)
方法,
object
对象已经被如下数组传递到模板中
array
(
'variable1'
=
>
'Shawn'
,
'object'
=
>
$this
)
在调用
sendTransactional
(
)
方法的类中,
创建一个新的方法
getObjectText
(
)
该方法所返回的值会显示在邮件中
,
如下
:
public
function
getObjectText
(
)
{
return
'This is my text'
;
}
关于上述代码的一个扩展,
假设我们有许多变量需要传到邮件模板中,
例如通过
$_POST
传递,
语法如下
:
array
(
'object'
=
>
new
Varien_Object
(
$_POST
)
)
在我们的邮件模板中可以以如下方式接收
{
{
var
object
.
post_var1
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
|
类型三
{
{
var
object
.
getName
(
true
,
'test'
)
}
}
通过这个我们可以访问到
getName
(
)
方法,
当然
object
对象已经通过
Array
(
)
接收到
同样的,
在同一个类中创建方法
getName
(
)
,
其值将会显示在邮件中
public
function
getName
(
$show
,
$name
)
{
if
(
$show
)
{
return
'My Name is '
.
$name
;
}
return
'My Name is Shawn'
;
}
|
depends 语句
depends 基本上就是半个 if 语句,没有 else, 语法如下:
1
2
3
|
{
{
depend
object
.
shouldShow
(
)
}
}
Is
Showing
{
{
/
depend
}
}
|
shouldShow() 是在同一个类文件中的方法。 在 depend 后面, 可以调用方法或变量, 就像上面的类型三
例: {{depend object.can_display}} , {{depend display}}
if 语句
If 语句就是 depends 的升级, 带有原来自身的 else, 语法如下:
1
2
3
4
5
|
{
{
if
object
.
shouldShow2
(
)
}
}
Is
Inside
If
{
{
else
}
}
Is
Inside
Else
{
{
/
if
}
}
|
block 语句
它用来在邮件模板里直接引入整个 block, 语法如下:
1
|
{
{
block
type
=
'email/mail'
object
=
$object
}
}
|
在这里我们调用了 block 中的类 ’email/mail’, 并且传给 block 一个变量 $object
1
2
3
4
5
6
7
|
class
Excellence_Email_Block_Mail
extends
Mage_Core_Block_Template
{
protected
function
_construct
(
)
{
$this
->
setTemplate
(
'email/mail.phtml'
)
;
}
}
|
在 email/mail.phtml 中的内容是:
1
2
|
echo
'Content Of Template mail.phtml<br>'
;
echo
'Name Passed from EMail'
.
get_class
(
$this
->
getObject
(
)
)
;
|
这样我们就可以在邮件模板中调用整个 block, 并且向这个 block 进行传值
layout 语句
layout 语句用来在邮件模板里加载整个 layout 结构。 在 block 里, 我们只可以直接加载单个 block, 但如果你想加载多个 block 和 child blocks 时, 你需要使用 layout 语句
1
|
{
{
layout
handle
=
"email_test_layout"
object
=
$object
area
=
'frontend'
}
}
|
在我们的 layout 文件里加入如下代码:
1
2
3
4
5
|
<
email_test_layout
>
<
block
type
=
'core/template'
name
=
'parent'
template
=
'email/testblock.phtml'
>
<
block
type
=
'core/template'
template
=
'email/testblock2.phtml'
name
=
'child'
>
<
/
block
>
<
/
block
>
<
/
email_test_layout
>
|
然后在我们的 email/testblock.phtml 文件里写入:
1
2
3
|
echo
'Test BLock 1'
;
echo
$this
->
getChildHtml
(
'child'
)
;
echo
$this
->
getObject
(
)
->
getName
(
)
;
|
email/testblock2.phtml 文件里写入:
1
|
echo
'Test Block 2'
;
|
这样你就可以看出, 我们通过 layout 语句加载了复杂的 blocks
skin 语句
skin 语句用来获取在 skin 文件下的图片或文件路径
1
|
{
{
skin
url
=
'images/logo_email.gif'
}
}
|
输出内容: http://127.0.0.1/magento/skin/frontend/default/default/images/logo_email.gif
media 语句
media 语句用来获取在 media 文件下的文件路径
1
|
{
{
media
url
=’
Untitled
.
png’
}
}
|
输出内容: http://127.0.0.1/magento/media/Untitled.png
store 语句
store 语句用来获取一个 store 内 controller 的路径
1
|
{
{
store
url
=
'email'
_query
=
'k=1'
test
=
213
}
}
|
输出内容: http://127.0.0.1/magento/index.php/email/index/index/test/213/?k=1
htmlescape 语句
顾名思义, 用来规避 html 代码
1
|
{
{
htmlescape
var
=
$html
}
}
|
config 语句
用来获取 System -> Configuration 中的信息
1
|
{
{
config
path
=
'trans_email/ident_support/email'
}
}
|
custom variable 语句
用来获取任何自定义变量(如果你有创建的话), 你也可以在 System -> Custom Variables 里创建自己的变量, 这是在 magento 1.4 之后才新增的功能
1
|
{
{
customvar
code
=
"test123"
}
}
|
这个将返回 code 为 “test123” 的 html 或 纯文本(plain text)格式的内容, 纯文本还是 html 取决于你的邮件类型
protocol 语句
1
|
{
{
protocol
}
}
|
这个将根据当然站点的 URL 来显示 http 或者 https
设置邮件主题
你可以在邮件模板的头部写入如下:
1
|
<
!
--
@
subject
欢迎
,
{
{
var
customer
.
name
}
}
!
@
--
>
|
设置邮件的 css 样式
你可以写在 subject 下面:
1
2
3
|
<
!
--
@
styles
body
,
td
{
color
:
#2f2f2f;}
@
--
>
|
下载: Magento Advanced Transactional Email Templates 代码 (10.9KB)
我写了大部分的语句, 如果有高手知道更多的,欢迎留言补充, 我会随后添加进 blog