[ja] Translate 07.4.md into Japanese.

This commit is contained in:
Shin Kojima
2013-06-21 23:21:02 +09:00
parent 8d6db03bbd
commit 320804ca5a

View File

@@ -157,22 +157,21 @@ emailが出力される場所では上のような方法で出力をすべてhtm
{{with $x := "output"}}{{printf "%q" $x}}{{end}} {{with $x := "output"}}{{printf "%q" $x}}{{end}}
{{with $x := "output"}}{{$x | printf "%q"}}{{end}} {{with $x := "output"}}{{$x | printf "%q"}}{{end}}
### テンプレート関数 ### テンプレート関数
模板在输出对象的字段值时,采用了`fmt`包把对象转化成了字符串。但是有时候我们的需求可能不是这样的,例如有时候我们为了防止垃圾邮件发送者通过采集网页的方式来发送给我们的邮箱信息,我们希望把`@`替换成`at`例如:`astaxie at beego.me`,如果要实现这样的功能,我们就需要自定义函数来做这个功能 テンプレートがオブジェクトのフィールドの値を出力する際、`fmt`パッケージを採用してオブジェクトを文字列に変換します。しかしときどき我々はこうしたくはないときもあります。例えばスパムメールの送信者がウェブページから拾い集めてくる方法で我々のメールボックスへ情報を送信することを防止したいときがあります。`@`をatに変換したいわけです。たとえば`astaxie at beego.me`のように。このような機能を実装したい場合は、自分で定義した関数でこの機能を作成する必要があります
テンプレートがオブジェクトのフィールドの値を出力する際、`fmt`パッケージを採用してオブジェクトを文字列に変換します。しかしときどき我々はこうしたくはないときもあります。
每一个模板函数都有一个唯一值的名字然后与一个Go函数关联通过如下的方式来关联 各テンプレート関数はいずれも単一の名前をもっていて、一つのGo関数と関係しています。以下の方法によって関係をもたせます。
type FuncMap map[string]interface{} type FuncMap map[string]interface{}
如果我们想要的email函数的模板函数名是`emailDeal`它关联的Go函数名称是`EmailDealWith`,n那么我们可以通过下面的方式来注册这个函数 えば、もしemail関数のテンプレート関数の名前を`emailDeal`としたい場合は、これが関係するGo関数の名前は`EmailDealWith`となります。下の方法でこの関数を登録することができます。
t = t.Funcs(template.FuncMap{"emailDeal": EmailDealWith}) t = t.Funcs(template.FuncMap{"emailDeal": EmailDealWith})
`EmailDealWith`这个函数的参数和返回值定义如下 `EmailDealWith`という関数の引数と戻り値は以下のように定義します
func EmailDealWith(args ...interface{}) string func EmailDealWith(args ...interface{}) string
我们来看下面的实现例子 以下の実装例を見てみましょう
package main package main
@@ -233,7 +232,7 @@ emailが出力される場所では上のような方法で出力をすべてhtm
} }
面演示了如何自定义函数,其实,在模板包内部已经有内置的实现函数,下面代码截取自模板包里面 ではどのように自分で関数を定義するかお見せしました。実は、テンプレートパッケージの内部ではすでにビルトインの関数が実装されています。下のコードを切り取って自分のテンプレートパッケージの中にはりつけてください。
var builtins = FuncMap{ var builtins = FuncMap{
"and": and, "and": and,
@@ -252,7 +251,7 @@ emailが出力される場所では上のような方法で出力をすべてhtm
## Must操作 ## Must操作
模板包里面有一个函数`Must`它的作用是检测模板是否正确例如大括号是否匹配注释是否正确的关闭变量是否正确的书写。接下来我们演示一个例子用Must来判断模板是否正确 テンプレートパッケージには`Must`という関数があります。この作用はテンプレートが正しいか検査することです。例えば大括弧が揃っているか、コメントは正しく閉じられているか、変数は正しく書かれているかといったことです。ここでは例を一つお見せします。Mustを使ってテンプレートが正しいか判断します
package main package main
@@ -281,22 +280,22 @@ emailが出力される場所では上のような方法で出力をすべてhtm
The next one ought to fail. The next one ought to fail.
panic: template: check parse error with Must:1: unexpected "}" in command panic: template: check parse error with Must:1: unexpected "}" in command
## 嵌套模板 ## ネストしたテンプレート
我们平常开发Web应用的时候经常会遇到一些模板有些部分是固定不变的然后可以抽取出来作为一个独立的部分例如一个博客的头部和尾部是不变的而唯一改变的是中间的内容部分。所以我们可以定义成`header``content``footer`三个部分。Go语言中通过如下的语法来申明 Webアプリケーションを作る時はテンプレートの一部が固定され不変である場合がよくあり、抜き出して独立した部分とすることができます。例えばブログのヘッダと降ったが固定で、変更があるのは真ん中のコンテンツの部分だけだとします。そのため`header``content``footer`つの部分として定義することができます。Go言語では以下のような文法によってこれを宣言します
{{define "子模板名称"}}内容{{end}} {{define "サブテンプレートの名前"}}コンテンツ{{end}}
通过如下方式来调用 以下の方法によってコールします
{{template "子模板名称"}} {{template "サブテンプレートの名前"}}
接下来我们演示如何使用嵌套模板,我们定义三个文件,`header.tmpl``content.tmpl``footer.tmpl`文件,里面的内容如下 ここではどのようにしてネストしたテンプレートを使うかお見せします。3つのファイルを定義します。`header.tmpl``content.tmpl``footer.tmpl`ファイルです。内容は以下のとおり
//header.tmpl //header.tmpl
{{define "header"}} {{define "header"}}
<html> <html>
<head> <head>
<title>演示信息</title> <title>デモンストレーションの情報</title>
</head> </head>
<body> <body>
{{end}} {{end}}
@@ -304,10 +303,10 @@ emailが出力される場所では上のような方法で出力をすべてhtm
//content.tmpl //content.tmpl
{{define "content"}} {{define "content"}}
{{template "header"}} {{template "header"}}
<h1>演示嵌套</h1> <h1>ネストのデモ</h1>
<ul> <ul>
<li>嵌套使用define定义子模板</li> <li>ネストではdefineを使用してサブテンプレートを定義します。</li>
<li>调用使用template</li> <li>templateの使用をコール</li>
</ul> </ul>
{{template "footer"}} {{template "footer"}}
{{end}} {{end}}
@@ -318,7 +317,7 @@ emailが出力される場所では上のような方法で出力をすべてhtm
</html> </html>
{{end}} {{end}}
演示代码如下 デモコードは以下の通り
package main package main
@@ -339,14 +338,14 @@ emailが出力される場所では上のような方法で出力をすべてhtm
s1.Execute(os.Stdout, nil) s1.Execute(os.Stdout, nil)
} }
通过上面的例子我们可以看到通过`template.ParseFiles`把所有的嵌套模板全部解析到模板里面,其实每一个定义的{{define}}都是一个独立的模板他们相互独立是并行存在的关系内部其实存储的是类似map的一种关系(key是模板的名称value是模板的内容),然后我们通过`ExecuteTemplate`来执行相应的子模板内容,我们可以看到headerfooter都是相对独立的,都能输出内容,contenrt中因为嵌套了headerfooter的内容,就会同时输出三个的内容。但是当我们执行`s1.Execute`,没有任何的输出,因为在默认的情况下没有默认的子模板,所以不会输出任何的东西 上の例で`template.ParseFiles`を使ってすべてのネストしたテンプレートをテンプレートの中にパースできることがお分かりいただけたかと思います。各定義の{{define}}はすべて独立した一個のテンプレートで、互いに独立しています。並列して存在している関係です。内部ではmapのような関係(keyがテンプレートの名前で、valueがテンプレートの内容です。)が保存されています。その後`ExecuteTemplate`を使って対応するサブテンプレートの内容を実行します。headerfooterのどちらも互いに独立していることがわかります。どれもコンテンツを出力できます。contenrtの中でheaderfooterのコンテンツがネストしているので、同時に3つの内容を出力できます。しかし、`s1.Execute`を実行した時、何も出力されません。デフォルトではデフォルトのサブテンプレートが無いからです。そのため何も出力されません
>同一个集合类的模板是互相知晓的,如果同一模板被多个集合使用,则它需要在多个集合中分别解析 >単一の集合のようなテンプレートは互いを知っています。もしあるテンプレートが複数の集合によって使用された場合、複数の集合の中で別々にパースされる必要があります。
## 总结 ## サマリー
通过上面对模板的详细介绍我们了解了如何把动态数据与模板融合如何输出循环数据、如何自定义函数、如何嵌套模板等等。通过模板技术的应用我们可以完成MVC模式中V的处理接下来的章节我们将介绍如何来处理M和C テンプレートに対する上記の詳細な紹介で、どのようにして動的なデータとテンプレートを融合させるかご理解いただけたかと思いますループしたデータの出力、関数を定義、テンプレートのネスト等々。テンプレートの技術を応用することで、MVCパターンのVの処理を完成させることができます。以降の章ではどのようにMとCを処理するかご紹介します
## links ## links
* [](<preface.md>) * [](<preface.md>)
* 上一节: [则处](<07.3.md>) * 前へ: [規表現の処](<07.3.md>)
* 下一节: [文件操作](<07.5.md>) * 次へ: [ファイルの操作](<07.5.md>)