2.インデックステンプレート
ルーティング | 個別に指定 |
引数 | 無し |
例 |
インデックステンプレートとは、トップページに代表される、最上位概念のテンプレートです。
他のテンプレートを読みこんだり、独自にデータを引っ張ってきて表示するなど、オリジナルの画面を作りたい場合に使用します。
商品やページといった、管理画面上の登録データとの依存関係は無いため、デフォルトで引き渡されるデータはありません。
そのため、特定のタグのリファレンスは無く、商品やページの情報を表示させたい場合はentity_managerを使用してデータを呼び出すことになります。
例えば以下は、インデックステンプレート内で商品一覧を出力する例です。
例として、カテゴリid=7をオススメ商品として5件出力する場合は、以下のように記述します。
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 31 32 33 34 35 36 37 38 39 40 41 |
<!-- querybuilderを作成。商品のテーブル:Product'にカテゴリのテーブル:categoriesをleftJoin --> {% set qb = get_entity_manager().getRepository('EcCoreBundle:Product').createQueryBuilder('p').leftJoin('p.categories', 'c') %} <!-- 公開日時が到来していない商品を除外するため、現在日時を作成 --> {% set now = "now"|date("Y-m-d H:i:s") %} <!-- recommend_productsに取得したデータを格納する qb.where('c.id = :id') → カテゴリidに対し、setParameter('id', 7)でパラメータを付与 andWhere('p.deleted_at is NULL') → 削除されていない商品 (LaunchCartはソフトデリートであり、削除の判断はdeleted_atがnullか否かで判断) andWhere(qb.expr().orx(qb.expr().eq('p.release_status', '0'),qb.expr().andx(qb.expr().eq('p.release_status', '2'),qb.expr().lte('p.released_at', '?1')))) → 商品ステータスが、公開(p.release_statusが0)または公開日指定で現在時刻を超えている orderBy('p.released_at', 'desc') → 公開日が新しい順 setMaxResults(5) → 最大で5件取得 --> {% set recommend_products = qb.where('c.id = :id').andWhere('p.deleted_at is NULL').andWhere(qb.expr().orx(qb.expr().eq('p.release_status', '0'),qb. expr().andx(qb.expr().eq('p.release_status', '2'),qb.expr().lte('p.released_at', '?1')))).orderBy('p.released_at', 'desc').setMaxResults(5).setParameter('id', 7). setParameter('1', now).getQuery().getResult() %} <!-- 該当の商品が1件以上存在していれば --> {% if (recommend_products|length > 0) %} <!-- 変数productに紐づくSKUを取得 --> {% for product in recommend_products%} {% set productskus = get_entity_manager().getRepository('EcCoreBundle:ProductSku').createQueryBuilder('ps').innerJoin('ps.product', 'p').where(' p.id = :id').setParameter('id', product.id).getQuery().getResult() %} <!-- 1つ以上のSKUで在庫が存在するか確認 --> {% set productAvailable = false %} {% for productsku in productskus %} <!-- productsku.getStockUnlimited → 在庫無制限 productsku.getStock → 在庫数 --> {% if (productsku.getStockUnlimited or (productsku.getStock > 0))%} {% set productAvailable = true %} {% endif %} {% endfor %} <!-- 1つ以上のSKUで在庫があったか --> {% if (productAvailable) %} <!-- product.name → 商品名 path("ec_product_detail", {"id":product.id}) → 商品ページへのリンク --> <a href="{{ path("ec_product_detail", {"id":product.id}) }}">{{ product.name }}</a> {% endif %} {% endfor %} {% endif %} |