随時更新中。
- HTMLタグをエスケープ無しで出力(デフォルトではエスケープされる)
1 |
{{ html | raw }} |
※管理上の都合により2015年11月以前の記事は削除いたしました
忘備録として随時更新中。テンプレ内をよく探せば出てくるのだが、、、。
1 |
{{ url('homepage') }} |
1 |
{{ app.request.uri }} |
1 2 3 4 5 6 7 8 |
{{# 基本形 #}} {{ url('product_list') }} {{# カテゴリ情報を付ける場合 #}} {{ url('product_list') }}?category_id="カテゴリID" {{# EntityでCategory.idが定義されている場合 #}} {{ url('product_list') }}?category_id={{ Category.id }} |
1 2 3 4 5 6 7 8 |
{{# 基本形 #}} {{ app.config.image_save_urlpath }} {{# ファイル名を指定する場合 #}} {{ app.config.image_save_urlpath }}/"画像ファイル名" {{# EntityでProduct.ProductImageが定義されている場合 #}} {{ app.config.image_save_urlpath }}/{{ Product.ProductImage."添え字"|no_image_product }} |
1 2 3 4 5 |
{{# 基本形 #}} {{ url('product_detail', {'id': "商品ID") }} {{# EntityでProduct.idが定義されている場合 #}} {{ url('product_detail', {'id': Product.id}) }} |
1 2 |
{{ "Product.ProductImage"が商品画像のファイル名が入った配列 }} {{ url('homepage') }}upload/save_image/{{ Product.ProductImage.0|no_image_product }} |
参考サイト)
EC-CUBE 3.0.16
MySQL 5.6.19
PHP 5.6.36
例として、あるカテゴリに「関連A」(assoc_A)という補足情報を追加する場合。
1. テーブルへのカラム追加
dtb_categoryテーブルへ”assoc_A”という名前のカラムをtinyintタイプで追加。また、NULLを許可にする。
2. エンティティファイルに、セッターゲッター追加
/src/Eccube/Entity/Category.php
以下のように追記。
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 |
/** * @var integer */ private $assoc_A; /** * @return string */ public function getAssocA() { return $this->assoc_A; } /** * @param string $assoc_A * @return \Eccube\Entity\Category */ public function setAssocA($assocA) { $this->assoc_A = $assocA; return $this; } /************************************ ※メソッド名とその引数にアンダーバーを使うと エラーになるので、宣言した変数名にアンダーバー を含む場合は上記のように、アンダーバーを消して その次の文字を大文字(キャメルケース)にする。 ************************************/ |
3. データベース定義ファイルへカラム追加
/src/Eccube/Resource/doctrine/Eccube.Entity.Category.dcm.yml
fields一覧にassoc_Aの項目を追加。データベースとエンティティクラスを接続するのがdcm.yml(Doctrineマッピングファイル)。これにより、Categoryエンティティのassoc_Aとdtb_categoryのassoc_Aカラムが接続される。
1 2 3 |
assoc_A: type: boolean nullable: true |
※データ型がint,smallint,tinyintでも、Formでcheckboxタイプを使う予定のため( 論理型(値が1か0のタイプ)と認識されるので)ブーリアンタイプにしておく。
ECCUBE3で使用できるtype一覧は過去記事参照。
4. フォーム定義ファイルへの項目追加
/src/Eccube/Form/Type/Admin/CategoryType.php
下記のように、管理画面の商品登録フォームへ定義を追加。
1 2 3 4 5 |
$builder->add('assoc_A', 'checkbox', array( 'label' => 'A', 'required' => false, //valueはデフォルトで"1"らしい )); |
5. 管理画面(カテゴリ登録画面)へフォーム表示
/app/template/admin/Product/category.twig
フォームを表示したい場所に下記のように記述。
1 2 3 |
{{ form_row(form.assoc_A) }} {{## もしくは ##}} {{ form_widget(form.assoc_A) }}{{ form_errors(form.assoc_A) }} |
6. 商品詳細ページへの表示
/app/template/default/Product/detail.twig
関連付けした情報を使って詳細ページでごにょごにょするには、多少の工夫が必要。これについては別途書く予定。
とりあえず以上。
参考URL)
EC-CUBE 3.0.16
MySQL 5.6.19
PHP 5.6.36
例として、商品名かな(name_kana)という項目を追加する場合。
1. テーブルへのカラム追加
dtb_productテーブルへ”name_kana”という名前のカラムをtextタイプ(またはvarchar)で追加。また、NULLを許可にする。
2. エンティティファイルに、セッターゲッター追加
/src/Eccube/Entity/Product.php
以下のように追記。
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 |
/** * @var string */ private $name_kana; /** * @return string */ public function getNameKana() { return $this->name_kana; } /** * @param string $name_kana * @return \Eccube\Entity\Product */ public function setNameKana($nameKana) { $this->name_kana = $nameKana; return $this; } /************************************ ※メソッド名とその引数にアンダーバーを使うと エラーになるので、宣言した変数名にアンダーバー を含む場合は上記のように、アンダーバーを消して その次の文字を大文字(キャメルケース)にする。 ************************************/ |
3. データベース定義ファイルへカラム追加
/src/Eccube/Resource/doctrine/Eccube.Entity.Product.dcm.yml
fields一覧にname_kanaの項目を追加。データベースとエンティティクラスを接続するのがdcm.yml(Doctrineマッピングファイル)。これにより、Productエンティティのname_kanaとdtb_productのname_kanaカラムが接続される。
1 2 3 |
name_kana: type: text nullable: true |
ちなみに、EC-CUBE3が採用しているSymfonyの標準ORM、Doctorineで設定できるフィールドタイプは以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
const TARRAY = 'array'; const SIMPLE_ARRAY = 'simple_array'; const JSON_ARRAY = 'json_array'; const BIGINT = 'bigint'; const BOOLEAN = 'boolean'; const DATETIME = 'datetime'; const DATETIMETZ = 'datetimetz'; const DATE = 'date'; const TIME = 'time'; const DECIMAL = 'decimal'; const INTEGER = 'integer'; const OBJECT = 'object'; const SMALLINT = 'smallint'; const STRING = 'string'; const TEXT = 'text'; const BINARY = 'binary'; const BLOB = 'blob'; const FLOAT = 'float'; const GUID = 'guid'; |
4. フォーム定義ファイルへの項目追加
/src/Eccube/Form/Type/Admin/ProductType.php
下記のように、管理画面の商品登録フォームへ定義を追加。
1 2 3 4 |
$builder->add('name_kana', 'text', array( 'label' => '商品名かな', 'required' => true, )); |
上記の書き方で入力必須とならない場合(未入力で保存した際にエラーとならない)場合は、下記のようにする。
1 2 3 4 5 6 7 |
$builder->add('name_kana', 'text', array( 'label' => '商品名かな', 'required' => true, 'constraints' => array( new Assert\NotBlank(), ), )); |
なお、フォームの入力形式として整数型としたい場合は、第2引数に”integer”, 浮動小数点型としたい場合は、第2引数に”number”を指定するなどして対応。
このほかにも選択型(choice型)も指定できる。詳細は公式ドキュメントを参照。
5. 管理画面(商品情報登録画面)へフォーム表示
/app/template/admin/Product/product.twig
フォームを表示したい場所に下記のように記述。
1 |
{{ form_row(form.name_kana) }} |
form_rowは、form_label、form_widget、form_errorsを同時に出力する関数。テキストの入力幅を小さくしたい場合などは、form_label、form_widget、form_errorsに分割するなどしてCSSで対応。
1 2 3 4 5 6 7 8 9 |
<!-- 入力幅を小さく --> <div id="" class="form-group"> {{ form_label(form.name_kana) }} <!-- col-sm-* col-lg-* の「*」値で調整すると簡単 --> <div class="col-sm-2 col-lg-2"> {{ form_widget(form.name_kana) }} {{ form_errors(form.name_kana) }} </div> </div> |
6. 商品詳細ページへの表示
/app/template/default/Product/detail.twig
フロント側で出力。好きな場所に下記のように記載。未登録であれば何も出力されない。
1 |
{{ Product.name_kana }} |
以上。
参考URL)
文字列省略(Twig1.6以降)
1 2 |
{{# 32文字目まで表示して残りは...にする #}} {{ name | length > 32 ? name | slice(0, 32) ~ '…' : name }} |
HTML参照文字エスケープ
1 2 3 |
{{ html | e }} {{# または、#}} {{ html | e("html") }} |
リプレース
1 2 3 |
{{ "I like %this% and %that%." | replace({'%this%': foo, '%that%': "bar"}) }} {{ "I like this and --that--." | replace({'this': foo, '--that--': "bar"}) }} |
改行文字をbrに
1 |
{{ text | nl2br }} |
ループ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
{## 基本形 ##} {% for Product in Products %} ID: {{ Product.id }} Name: {{ Product.name }} {% endfor %} {## キーだけ表示 ##} {% for Product in Products | keys %} key: {{ Product }} {% endfor %} {## キー,値をそれぞれ取得 ##} {% for ProductKey, ProductValue in Products %} key: {{ ProductKey }} value: {{ ProductValue }} {% endfor %} {## sliceと組み合わせたり ##} {% for key, value in ['太郎', '次郎', '三郎', '四郎', '五郎']|slice(2, 4) %} {{ key }}:{{ value }} {% endfor %} {# 0:三郎 1:四郎 2:五郎 #} |
ループの中で使える便利なやつ
1 2 3 4 5 6 7 |
{## loop.lastは、最後の要素の時true ##} {% for Product in Products %} ID: {{ Product.id }} Name: {{ Product.name }} {## 最後の要素じゃなかったらコンマ出力 ##} {{ loop.last ? '' : ',' }} {% endfor %} |
正規表現マッチング
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{# 基本形 #} {% if Product matches '{^abc$}' %} match! {% else %} not match! {% endif %} {# メタ文字(.や?など)エスケープ時はバックスラッシュ3つ #} {% if Product matches '{\\\?id=1234}' %} match! {% else %} not match! {% endif %} |
その他は随時更新。
参考URL)