(5) 決済-配送先(配送時間指定)
ルーティング | ec_client_ship_select |
引数 | 無し |
例 | {{path(“ec_client_ship_select”)}} |
※ec_client_ship_selectは、リンク元からpostで移動する必要があります。
その際、name=”consumer_address_id”を渡す必要があります。
name=”consumer_address_id”のvalueに、お届先IDをセットしてpostします。
name=”consumer_address_id”のvalueが、”multi”だった時のみ「(3) 決済-配送先(複数)」に遷移します。
配送時間は配送ごとに設定します。
前述しましたが、配送は、住所と配送方法によって分けられます。
例えばAという、冷凍便で配送すべき商品を2個、Bという、普通便で配送すべき商品を2個購入し、
東京と大阪にそれぞれAを1つ、Bを1つずつ送りたい場合、AとBは同梱できませんので、合計で4回配送しなければなりません。
よって、配送は配送先と配送方法の2次元で分岐されます。
Ⅰ 非会員購入
非会員の顧客は複数配送先の機能を利用できません。
なので、決済-配送先(非会員購入)で入力した住所にのみ配送することになります。
決済-配送先(非会員購入)で入力した値は、app.session.get(“consumer_shipment_data”)で取得できます。
app.session.get(“consumer_shipment_data”) | ||
username |
メールアドレス |
|
last_name |
姓 |
|
first_name |
名 |
|
last_name_kana |
セイ |
|
first_name_kana |
メイ |
|
zipcode1 |
郵便番号1 |
|
zipcode2 |
郵便番号2 |
|
country |
国名 |
|
district |
都道府県 |
|
locality |
市区町村 |
|
street |
その他住所 |
|
tel1 |
電話番号1 |
|
tel2 |
電話番号2 |
|
tel3 |
電話番号3 |
Ⅱ 非会員購入以外の配送先
配送は住所と配送方法によって分かれますので、array(consumerAddressId => array(deliveryId => products[]));というような配列になっています。
app.session.get(“ship”) | ||||||
キー:consumerAddressId | キーは顧客の配送先ID | |||||
値:tmpship[] | 配送先に紐づく配送方法の構造体 | |||||
キー:deliveryId | キーは配送ID | |||||
値:tmpship2[] | 配送方法に紐づく商品情報の構造体 | |||||
products[] | ||||||
products[i] | 商品情報のi番目の配列 | |||||
product_array[0] | 商品SKUID | |||||
product_array[1] | カートに入れた数 | |||||
lastName | 姓 | |||||
firstName | 名 | |||||
lastNameKana | セイ | |||||
firstNameKana | メイ | |||||
country | 国 | |||||
district | 都道府県 | |||||
locality | 市区町村 | |||||
street | その他住所 | |||||
getAddress | country〜streetの住所 | |||||
tel | 電話番号 | |||||
zipcode | 郵便番号 |
Ⅲ 配送日時のリスト
顧客が指定できる、配送日と配送時間のリストです。
配送日は休業日管理と最短指定配達日を計算したリスト、配送時間は配送方法ごとに設定した時間帯のリストを出力します。
配送ごとに指定できるよう、配送先と配送方法の組合せを指定してリストを呼び出します。
まず、配送日は、
1 |
delivery_day_array[] |
を使用します。
これは連想配列であり、キーは、
配送先ID_配送方法ID
となります。
具体的には、
1 |
{% set address = app.session.get("ship") %} |
を前提とすると、
1 |
delivery_day_array[address.id~"_"~delivery.id] |
となります。
配送時間は配送方法ごとに設定されているので、配送方法の情報を取得する必要があります。
1 |
{% set delivery = get_entity_manager().find("EcCoreBundle:Delivery", deliveryId) %} |
でdeliveryの内容を取得します。
それぞれ、具体的な使い方として、以下のようなリストを想定しています。
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 |
{% set ship = app.session.get("ship") %} {% set address = "" %} {% for consumerAddressId, tmpship in ship %} {% if (consumerAddressId > 0) %} {% set address = get_entity_manager().find("EcCoreBundle:ConsumerAddress", consumerAddressId)%} {% else %} {% set address = app.session.get("consumer_shipment_data") %} {% endif %} {% set delivery = get_entity_manager().find("EcCoreBundle:Delivery", deliveryId) %} {% set deliveryDay = "" %} {% for deliveryId,tmpship2 in tmpship %} {% if tmpship2["delivery_day"] is defined %} {% set deliveryDay = tmpship2["delivery_day"] %} {% endif %} {% set deliveryTime = "" %} {% if tmpship2["delivery_time"] is defined %} {% set deliveryTime = tmpship2["delivery_time"] %} {% endif %} {% set products = tmpship2[0] %} {{ address.lastName~" "~address.firstName }} 〒{{ address.getZipcode }}<br>{{ address.getConsumerAddress }} {{ address.getTel }} <select name="delivery_day[{{ address.id }}_{{ delivery.id }}]"> <option value="">指定なし</option> {% if address.country.id == '1' %} {% for day in delivery_day_array[address.id~"_"~delivery.id ] %} <option value="{{ day }}" {% if (deliveryDay == day) %}selected{% endif %}>{{ day }}</option> {% endfor %} {% endif %} </select> <select name="delivery_time[{{ address.id }}_{{ delivery.id }}]"> <option value="">指定なし</option> {% if address.country.id == '1' %} {% for delivery_time in delivery.times %} <option value="{{ delivery_time.id }}" {% if (deliveryTime == delivery_time.id) %}selected{% endif %}>{{ delivery_time.time }}</option> {% endfor %} {% endif %} </select> {% endfor %} {% endfor %} |
送信先は以下のようになります。
配送日
キー名 | 説明 | 必須 |
delivery_abroad[お届先ID_配送ID] | 配送日の日付 |
配送時間
キー名 | 説明 | 必須 |
delivery_time[お届先ID_配送ID] | 配送時間 |
Ⅳ オプション商品
商品詳細ページ等で既にオプション商品をカートに入れている場合、cart_api.getAdditionCount()でその数量を取得できます。
具体的には、
1 |
{{ cart_api.getAdditionCount(productsku, addition) }} |
のように、カートに入れている商品のSKUとオプション商品の情報を、引数で渡して取得します。
該当する情報が取得できればその数量を、取得できなければ0が返って来ます。
キーはお届先ID、配送ID、商品ID、オプション商品IDを以下のように組み合わせます。
キー名 | 説明 | 必須 |
delivery_addition[お届先ID_配送ID_商品ID_オプション商品ID] | 数量 | 1以上の数値でない場合は無視 |
具体的には、以下のように記述します。
1 2 3 4 5 6 7 |
{% for product_array in products %} {% set productsku = get_entity_manager().find("EcCoreBundle:ProductSku", product_array[0]) %} {% set product = productsku.product %} {% for addition in product.additions %} {{ addition.title }} {{ addition.price }} <input type="text" value="{{ cart_api.getAdditionCount(productsku, addition) }}" size="4" maxlength="4" name="delivery_addition[{{ consumerAddressId~"_"~delivery.id~"_"~productsku .id~"_"~addition.id }}]"> |