はじめに
テンプレート全体で使えるタグです。
LaunchCart では、twig をテンプレートエンジンとして採用しています。
twig は使いやすく汎用的で、基本さえ覚えれば様々な表現ができる優れたテンプレートエンジンです。
基礎は本書では省略しますが、インターネット上にたくさん情報が公開されています。
以下はオフィシャルのドキュメントです。
http://twig.sensiolabs.org/doc/templates.html
Ⅰ 関数
関数はたくさんありますが、その中でもよく使うものの例を紹介します。
ア asset
ドキュメントルートまでのパスを補完します。
たとえば「/favicon.ico」は
1 |
<link rel="icon" href="{{ asset("favicon.ico") }}"> |
と記述します
HTML としては、
1 |
<link rel="icon" href="http://hoge.com/favicon.ico "> |
と吐き出されます
イ path
システム関連のページまでのパスを保管します。
例えばトップページですと、
1 |
{{ path("homepage")}} |
と記述します。
「homepage」の部分は各ページに与えられているルーティングであり、それぞれの名称は各テンプレートの最初に記載しています。
ウ get_entity_manager
get_entity_manager はデータベースから登録情報を持ってくる時に使います。
あらゆることが実現できる反面使い方が多少難しいため、詳しい使い方は各章で例を元に説明しています
エ form_widget
フォーム関連のページ、例えば会員登録フォームで、姓名の姓を入力するテキストボックスを表示する場合、
1 |
{{ form_widget(form.last_name) }} |
と記述します。このように記述すると、テキストボックスの表示、値の保持などを自動的にプログラム側に委ねることができます。
オ form_errors
form_widget と対になる関数で、エラーメッセージを出力するためのものです。
上述の姓の例ですと、
1 |
{{ form_errors(form.last_name) }} |
と記述するとエラーが有った場合はエラーメッセージが表示されます。
例えば
「姓」を入力してください
と出力されます
カ form_label
フォーム関連のページ、例えば会員登録フォームで、姓名の姓という項目名を表示する場合、
1 |
{{ form_label(form.last_name) }} |
と記述します。
キ パンくずリスト
パンくずリスト出力等で使用する、カテゴリの階層を取得する方法を説明します。
まず、商品やページのカテゴリアーカイブベージで保持しているカテゴリの情報は、常に1つとなります。
この時の階層を取得するには、getAncestorsを使用します。
デフォルトでテンプレートに渡されているcategoryを使い、以下のように全カテゴリとそのリンクを、パンくずリストとして出力します
1 2 3 4 5 6 7 |
<a href="{{ path(">HOME</a> {% if (category.getAncestors|length > 0) %} {% for ancestor in category.getAncestors %} > <a id="" href="{{ path(">{{ ancestor.node.name }}</a> {% endfor %} {% endif %} > {{ category.getNode.getName }} |
次に、商品や、ページの詳細ページの断層を取得する方法を説明します。
基本的な考え方は前述のカテゴリアーカイブページと同じですが、詳細ページでは複数のカテゴリ情報が渡されていることと、 それぞれのカテゴリの断層構造がデフォルトでは渡されていないということを考慮する必要があります。
以下は商品詳細ページでの例です。
まず、デフォルトで渡されるproductのcategoriesをループさせて、その商品に紐づく全てのカテゴリを取得します。
取得したそれぞれのカテゴリの断層構造を取得するため、product_api.wrapProductCategory()を実行します。
その後は前述と同じです。今回は1つのカテゴリごとに行を分けるため、ulでの記述方法を例としています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
{% for category in product.categories %} {% set wraped_category = product_api.wrapProductCategory(category) %} {% if (wraped_category.getAncestors|length > 0) %} <ul> <li> <a href="{{ path("homepage")}}">HOME</a> </li> {% for ancestor in wraped_category.getAncestors %} <li> <a href="{{ path("ec_product_category", {"id":ancestor.node.id})}}">{{ancestor.node.name }}</a> </li> {% endfor %} <li>{{ category.name }}</li> </ul> {% else %} <ul> <li> <a href="{{ path("homepage")}}">HOME</a> </li> <li>{{ category.name }}</li> </ul> {% endif %} {% endfor %} |
ク 商品検索
form | ||
keyword | キーワード | |
categories | カテゴリ | |
price_from | 価格~ | |
price_to | ~価格 | |
form.getChild(“拡張フィールド名”) | 拡張フィールド |
例えばキーワード用のテキストボックスを表示するには、
1 |
{{ form_widget(form.keyword) }} |
このように記述します。
フロントページのHTMLとしては以下のように出力されます。
1 |
<input id="ec_client_product_search_type_keyword" class="text" maxlength="255" name="ec_client_product_search_type[keyword]" type="text" /> |
独自にHTMLタグを記述したい場合はidとnameを合わせた上で、valueに値をセットすれば動作します。
また、それぞれの項目の入力内容にエラーが有った場合はform_errorsを使います。
例として、タイトル用のエラー文言を表示するには、
1 |
{{ form_errors(form.keyword) }} |
このように記述します。
送信先はpost又はgetでec_product_searchに渡します。
例として以下のように記述します。
ケ 言語切替
システムで対応している言語一覧および顧客毎に選択されている言語名を取得出来ます。
1 |
{% set languages = languages() %} |
お客様の選択した言語は
1 |
{% set language = language() %} |
で取得可能です。
コ 通貨レート
多通貨に対応したLaunchCartでは、通貨の選択と通貨レートの取得が可能です。
1 |
{% set cur_unit_ratio = cur_unit_ratio() %} |
通貨を切り替えると、この通貨レートも通貨に対応したものへ自動的に切り替わります。
商品の価格と演算することで通貨ごとの価格を求めることが可能です。
1 |
{{ (productsku.getPrice * cur_unit_ratio) | number_format }} |
また、通貨の前後に表示する通貨記号は以下のように取得可能です。
1 |
{% set unit_back = unit_back() %} |
1 |
{% set unit_back = unit_back() %} |
システム設定で前・後に表示する文字列は変更可能です。
※ 通貨レートはヘッダーあるいはページ内で一度だけ呼び出してください (商品毎に記入すると非常に表示が遅くなります)
Ⅱ タグ
テンプレートを作りやすくするために用意された、LaunchCart独自のタグです。
ア <ec:TemplateInclude “テンプレート名”>
モジュールテンプレートを読み込むためのタグです。
例えばヘッダというモジュールテンプレートを作成し、トップページなどで読み込む場合、
1 |
<ec:TemplateInclude "ヘッダ"> |
と記述します。
するとモジュールテンプレートの内容がそのまま反映されます。
イ <ec:LinkIndexTemplate “ルーティング”>
インデックステンプレートは自由に作成することができ、作成時にルーティングという任意の文字を指定する必要があります。
例えば特定商取引法のページをlawとうルーティングをつけて作成した場合、サイト上のURLは、
http://hoge.com/law
となります。
このページへリンクを貼る場合は、
1 |
<ec:LinkIndexTemplate "law"> |
と記述します。
1 |
ウ <ec:if is_authorized()> |
ログインしているか、していないかの判断をする関数です。
例えばグローバルナビゲーションで、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<ec:if is_authorized()> <li> <a href="{{ path("ec_client_consumer")}}">マイページ</a> </li> <li> <a href="{{ path("application_frontend_auth_logout") }}">ログアウト</a> </li> <ec:else> <li> <a href="{{ path("application_frontend_auth_regist") }}">会員登録</a> </li> <li> <a href="{{ path("application_frontend_auth_login") }}">ログイン</a> </li> </ec:if> |
のように記述すると、ログインしていればマイページとログアウトへのリンク、ログインしていなければ、会員登録とログインへのリンクを出力しています。
エ {% autoescape false %}{% endautoescape %}
例えばHTMLを出力するときなど、エスケープをする、しないの指定を明示的にする際に使用します。この場合、
1 |
{% autoescape false %}{{ product.description }}{% endautoescape %} |
などと記述します。
オ <ec:CartCount>
カートの中身の個数を出力します。
Ⅲ フィルタ
twigで用意されているもので、よく使うものを紹介します。
ア length
配列や文字の長さを取得します。
例えば配送先の一覧を出力する画面で、配送先の数がいくつあるかを取得する場合、
1 |
{{ addresses|length }} |
と記述します。
イ number_format
金額にカンマを入れたりなど、数値のフォーマットを指定したい場合に使用します。
例えば商品詳細ページで、
1 |
{{ cat_product_skus[0].getPrice|number_format }}円 |
とすると1,000円とカンマがつきます。
Ⅳ セッション
ログインしている顧客の登録情報、カートの中身はセッションに格納されています。
これらの取得方法を説明します。
ア cart_api
カートの中身が格納されたセッションです。
cart_apiという名前で使いやすいように加工されています。
cart_api[] | |||||||
cart_api[i] | カートapiのi番目の配列 | ||||||
count | 商品数量 | ||||||
additionCount | オプション商品数量 | ||||||
total | 合計金額 | ||||||
objects[] | カート内オブジェクト一覧 | ||||||
objects[i] | カート内オブジェクトのi番目の配 列 | ||||||
getProductSkuId | 商品SKUID | ||||||
getCount | 数量 | ||||||
getAdditions[] | オプション商品一覧 | ||||||
getAdditions[i] | オプション商品のi番目の配列 | ||||||
getAdditionId | オプション商品ID | ||||||
getRegularInt | 配送頻度(定期商品のみ) |
以下は、カートの中にある商品一覧を出力している例です。
1 2 |
{% set cart = cart_api.objects %} {% if cart|length == 0 %} |
現在カートに入っている商品はございません。
1 2 3 4 5 6 7 8 9 10 11 12 |
{% else %} {% for cart_object in cart %} {% set productsku = get_entity_manager().find("EcCoreBundle:ProductSku", cart_object.getProductSkuId)%} <a id="" href="{{ path("> {{productsku.getProduct.getName}} {% if productsku.getSkuDetail1 %} {{productsku.getSkuDetail1.getTitle}} {% endif %} {% if productsku.getSkuDetail2 %} {{productsku.getSkuDetail2.getTitle}} {% endif %} </a> {% endfor %} {% endif %} |
他の顧客によって在庫が無くなっている可能性などを回避するため、
カートの中身を取得する時は、随時get_entity_manager()を使って最新の情報を取りにいってください。
イ app.security.token.user
ログイン中の顧客の登録情報が格納されているセッションです。
app.security.token.user | ||||
id | 顧客id | |||
getAttribute() | getAttribute(“拡張フィールド名”)で拡張フィールドの項目を表示 | |||
username | メールアドレス | |||
lastNname | 姓 | |||
firstName | 名 | |||
lastNameKana | セイ | |||
firstNameKana | メイ | |||
zipcode | 郵便番号 | |||
country | 国 | |||
district | 都道府県 | |||
locality | 市区町村 | |||
street | その他住所 | |||
tel | 電話番号 | |||
address | お届先の構造体 | |||
address[i] | お届先のi番目の配列 | |||
id | お届先id | |||
lastName | 姓 | |||
firstName | 名 | |||
lastNameKana | セイ | |||
firstNameKana | メイ | |||
country | 国 | |||
district | 都道府県 | |||
locality | 市区町村 | |||
street | その他住所 | |||
getAddress | country~streetの住所 | |||
tel | 電話番号 | |||
zipcode | 郵便番号 | |||
createdAt | 登録日 | |||
updatedAt | 更新日 | |||
point | 保有ポイント | |||
rank | 会員ランクの構造体 | |||
name | 会員ランク名 | |||
discountPercent | 割引率 | |||
pointRate | ポイント率 |