【ECCube3】AmazonPayで、お届け日調整プラグインが機能しない時の対策
株式会社ブラテック製のお届け日調整プラグインと、
アイピーロジック製のAmazon Payプラグインの併用で、
Amazon Payでの注文時に、お届け日が、きちんと調整されない不具合がありましたので、
メモです。
以下のバージョンに対して修正を行いました。
ECCube : 3.0.15
お届け日調整プラグイン: 1.0.10
Amazon Pay: 1.2.1
修正方法ですが、Amazon Pay側のプラグインを修正します。
結論:
あーーーー、もう、ECCubeめんどくさいwww
アイピーロジック製のAmazon Payプラグインの併用で、
Amazon Payでの注文時に、お届け日が、きちんと調整されない不具合がありましたので、
メモです。
以下のバージョンに対して修正を行いました。
ECCube : 3.0.15
お届け日調整プラグイン: 1.0.10
Amazon Pay: 1.2.1
修正方法ですが、Amazon Pay側のプラグインを修正します。
/app/Plugin/AmazonPayments/Controller/AmazonShoppingController.php:
539行目あたり:
青の部分を、赤の部分に移動します。
要するに、ちゃんと住所を取得出来てから、
注文フォームを作成するわけです。
// $builder = $app['eccube.plugin.amazonpayments.service.amazon_shopping']->getShippingFormBuilder($Order);
// $form = $builder->getForm();
// $form->handleRequest($request);
// $data = $form->getData();
// $message = $data['message'];
// Amazonからお届け先取得
$arrAmznAddr = $app['eccube.plugin.amazonpayments.service.amazon_request']->getDeliveryAddress($amazonOrderReferenceId, $addressConsentToken);
// EC-CUBEに対応付け
$Shippings = $Order->getShippings();
foreach ($Shippings as $key => $Shipping) {
$app['eccube.plugin.amazonpayments.service.amazon_shopping']->convertAddress($Order, $Shippings[$key], $arrAmznAddr);
}
$builder = $app['eccube.plugin.amazonpayments.service.amazon_shopping']->getShippingFormBuilder($Order);
$form = $builder->getForm();
$form->handleRequest($request);
$data = $form->getData();
$message = $data['message'];
539行目あたり:
青の部分を、赤の部分に移動します。
要するに、ちゃんと住所を取得出来てから、
注文フォームを作成するわけです。
// $builder = $app['eccube.plugin.amazonpayments.service.amazon_shopping']->getShippingFormBuilder($Order);
// $form = $builder->getForm();
// $form->handleRequest($request);
// $data = $form->getData();
// $message = $data['message'];
// Amazonからお届け先取得
$arrAmznAddr = $app['eccube.plugin.amazonpayments.service.amazon_request']->getDeliveryAddress($amazonOrderReferenceId, $addressConsentToken);
// EC-CUBEに対応付け
$Shippings = $Order->getShippings();
foreach ($Shippings as $key => $Shipping) {
$app['eccube.plugin.amazonpayments.service.amazon_shopping']->convertAddress($Order, $Shippings[$key], $arrAmznAddr);
}
$builder = $app['eccube.plugin.amazonpayments.service.amazon_shopping']->getShippingFormBuilder($Order);
$form = $builder->getForm();
$form->handleRequest($request);
$data = $form->getData();
$message = $data['message'];
/app/Plugin/AmazonPayments/Service/AmazonShoppingService.php:
40行目あたり:
use宣言で、DeliveryDateプラグインを使う事を宣言します。
use Plugin\DeliveryDate\Repository\ProductClassRepository;
use Plugin\DeliveryDate\Repository\HolidayRepository;
use Plugin\DeliveryDate\Repository\DeliveryDateRepository;
40行目あたり:
use宣言で、DeliveryDateプラグインを使う事を宣言します。
use Plugin\DeliveryDate\Repository\ProductClassRepository;
use Plugin\DeliveryDate\Repository\HolidayRepository;
use Plugin\DeliveryDate\Repository\DeliveryDateRepository;
/app/Plugin/AmazonPayments/Service/AmazonShoppingService.php:
1147行目あたり:
赤文字の部分を追加します。
要するに、Amazon Paymentから取得した住所を、セッションに保持して、後で使用します。
$Pref = $this->app['eccube.repository.master.pref']->findOneBy(array('name' => $arrAmznAddr['StateOrRegion']));
if (!empty($Pref)) {
$_SESSION["order_pref"] = $Pref->getId();
$Shipping->setPref($Pref);
} else {
// 存在しない都道府県の場合
$this->app['monolog.amazonpayments']->addInfo('*** 都道府県マッチングエラー *** addr = '.print_r($arrAmznAddr, true));
$Shipping->setPref(null);
$addr01 = $arrAmznAddr['StateOrRegion'] . $addr01;
}
1147行目あたり:
赤文字の部分を追加します。
要するに、Amazon Paymentから取得した住所を、セッションに保持して、後で使用します。
$Pref = $this->app['eccube.repository.master.pref']->findOneBy(array('name' => $arrAmznAddr['StateOrRegion']));
if (!empty($Pref)) {
$_SESSION["order_pref"] = $Pref->getId();
$Shipping->setPref($Pref);
} else {
// 存在しない都道府県の場合
$this->app['monolog.amazonpayments']->addInfo('*** 都道府県マッチングエラー *** addr = '.print_r($arrAmznAddr, true));
$Shipping->setPref(null);
$addr01 = $arrAmznAddr['StateOrRegion'] . $addr01;
}
/app/Plugin/AmazonPayments/Service/AmazonShoppingService.php:
858行目あたり:
赤文字が、追加したコードです。
public function getFormDeliveryDates(Order $Order)
{
// お届け日の設定
$deliveryDatePluginFlg = 1;
$minDate = 0;
$deliveryDateFlag = false;
if($deliveryDatePluginFlg){
$deliveryDateFlag = true;
}
// 配送時に最大となる商品日数を取得
foreach ($Order->getOrderDetails() as $detail) {
if($deliveryDatePluginFlg){
$deliveryDate = $this->app['eccube.deliverydate.repository.product_class']->findOneBy(array('product_class_id' => $detail->getProductClass()->getId()));
if (!is_null($deliveryDate)) {
$days = $deliveryDate->getDays();
if(!is_null($days)){
if ($minDate < $days) {
$minDate = $days;
}
}else{
$deliveryDateFlag = false;
break;
}
}else{
$deliveryDateFlag = false;
break;
}
}else{
// ここはデフォルトの処理
$deliveryDate = $detail->getProductClass()->getDeliveryDate();
if (!is_null($deliveryDate)) {
if ($minDate < $deliveryDate->getValue()) {
$minDate = $deliveryDate->getValue();
}
// 配送日数が設定されている
$deliveryDateFlag = true;
}
}
}
// 配達最大日数期間を設定
$deliveryDates = array();
if($deliveryDateFlag && $deliveryDatePluginFlg){
$Method = $this->app['eccube.deliverydate.repository.config']->findOneBy(array('name' => 'method'));
$AcceptTime = $this->app['eccube.deliverydate.repository.config']->findOneBy(array('name' => 'accept_time'));
if($AcceptTime){
$time = (int)$AcceptTime->getValue();
if($minDate == 0 && $time > 0){
$isHoliday = false;
if($Method){
if($Method->getValue() != 1){
$date = new \DateTime();
if($this->app['eccube.deliverydate.repository.holiday']->checkHoliday($date)){
$isHoliday = true;
}
}
}
if(!$isHoliday){
$now = getdate();
if($now['hours'] >= $time){
$minDate = 1;
}
}
}
}
// 発送までの日数を計算
if($Method){
if($Method->getValue() != 1){
$shippingDate = $minDate;
$i=0;
while($shippingDate >= 0){
$date = new \DateTime($i . 'day');
if($this->app['eccube.deliverydate.repository.holiday']->checkHoliday($date)){
$minDate++;
}else{
$shippingDate--;
}
$i++;
}
}
}
// 都道府県ごとの配送日数を加算
if($_SESSION["order_pref"]){
$plgDeliveryDate = $this->app['eccube.deliverydate.repository.delivery_date']->findOneBy(array(
'Delivery' => empty($Delivery) ? 1 : $Delivery,
'Pref' => $_SESSION["order_pref"],
));
unset($_SESSION["order_pref"]);
}else{
// このあたりの処理、冗長なので、後で修正するかも。
if(!empty($Order->getPref())){
$plgDeliveryDate = $this->app['eccube.deliverydate.repository.delivery_date']->findOneBy(array(
'Delivery' => empty($Delivery) ? 1 : $Delivery,
'Pref' => (int)@$Order->getPref()->getId(),
));
}else{
$plgDeliveryDate = $this->app['eccube.deliverydate.repository.delivery_date']->findOneBy(array(
'Delivery' => empty($Delivery) ? 1 : $Delivery,
'Pref' => 13,
));
}
}
if($plgDeliveryDate){
$dates = $plgDeliveryDate->getDates();
if(!is_null($dates))$minDate += $dates;
}
// 配達最大日数期間を設定
$deliveryDates = array();
$period = new \DatePeriod (
new \DateTime($minDate . ' day'),
new \DateInterval('P1D'),
new \DateTime($minDate + $this->app['config']['deliv_date_end_max'] . ' day')
);
foreach ($period as $day) {
$deliveryDates[$day->format('Y/m/d')] = $day->format('Y/m/d');
}
}
else{
// ここはデフォルトの処理
// 配送日数が設定されている
if ($deliveryDateFlag) {
$period = new \DatePeriod (
new \DateTime($minDate . ' day'),
new \DateInterval('P1D'),
new \DateTime($minDate + $this->app['config']['deliv_date_end_max'] . ' day')
);
foreach ($period as $day) {
$deliveryDates[$day->format('Y/m/d')] = $day->format('Y/m/d');
}
}
}
return $deliveryDates;
}
858行目あたり:
赤文字が、追加したコードです。
public function getFormDeliveryDates(Order $Order)
{
// お届け日の設定
$deliveryDatePluginFlg = 1;
$minDate = 0;
$deliveryDateFlag = false;
if($deliveryDatePluginFlg){
$deliveryDateFlag = true;
}
// 配送時に最大となる商品日数を取得
foreach ($Order->getOrderDetails() as $detail) {
if($deliveryDatePluginFlg){
$deliveryDate = $this->app['eccube.deliverydate.repository.product_class']->findOneBy(array('product_class_id' => $detail->getProductClass()->getId()));
if (!is_null($deliveryDate)) {
$days = $deliveryDate->getDays();
if(!is_null($days)){
if ($minDate < $days) {
$minDate = $days;
}
}else{
$deliveryDateFlag = false;
break;
}
}else{
$deliveryDateFlag = false;
break;
}
}else{
// ここはデフォルトの処理
$deliveryDate = $detail->getProductClass()->getDeliveryDate();
if (!is_null($deliveryDate)) {
if ($minDate < $deliveryDate->getValue()) {
$minDate = $deliveryDate->getValue();
}
// 配送日数が設定されている
$deliveryDateFlag = true;
}
}
}
// 配達最大日数期間を設定
$deliveryDates = array();
if($deliveryDateFlag && $deliveryDatePluginFlg){
$Method = $this->app['eccube.deliverydate.repository.config']->findOneBy(array('name' => 'method'));
$AcceptTime = $this->app['eccube.deliverydate.repository.config']->findOneBy(array('name' => 'accept_time'));
if($AcceptTime){
$time = (int)$AcceptTime->getValue();
if($minDate == 0 && $time > 0){
$isHoliday = false;
if($Method){
if($Method->getValue() != 1){
$date = new \DateTime();
if($this->app['eccube.deliverydate.repository.holiday']->checkHoliday($date)){
$isHoliday = true;
}
}
}
if(!$isHoliday){
$now = getdate();
if($now['hours'] >= $time){
$minDate = 1;
}
}
}
}
// 発送までの日数を計算
if($Method){
if($Method->getValue() != 1){
$shippingDate = $minDate;
$i=0;
while($shippingDate >= 0){
$date = new \DateTime($i . 'day');
if($this->app['eccube.deliverydate.repository.holiday']->checkHoliday($date)){
$minDate++;
}else{
$shippingDate--;
}
$i++;
}
}
}
// 都道府県ごとの配送日数を加算
if($_SESSION["order_pref"]){
$plgDeliveryDate = $this->app['eccube.deliverydate.repository.delivery_date']->findOneBy(array(
'Delivery' => empty($Delivery) ? 1 : $Delivery,
'Pref' => $_SESSION["order_pref"],
));
unset($_SESSION["order_pref"]);
}else{
// このあたりの処理、冗長なので、後で修正するかも。
if(!empty($Order->getPref())){
$plgDeliveryDate = $this->app['eccube.deliverydate.repository.delivery_date']->findOneBy(array(
'Delivery' => empty($Delivery) ? 1 : $Delivery,
'Pref' => (int)@$Order->getPref()->getId(),
));
}else{
$plgDeliveryDate = $this->app['eccube.deliverydate.repository.delivery_date']->findOneBy(array(
'Delivery' => empty($Delivery) ? 1 : $Delivery,
'Pref' => 13,
));
}
}
if($plgDeliveryDate){
$dates = $plgDeliveryDate->getDates();
if(!is_null($dates))$minDate += $dates;
}
// 配達最大日数期間を設定
$deliveryDates = array();
$period = new \DatePeriod (
new \DateTime($minDate . ' day'),
new \DateInterval('P1D'),
new \DateTime($minDate + $this->app['config']['deliv_date_end_max'] . ' day')
);
foreach ($period as $day) {
$deliveryDates[$day->format('Y/m/d')] = $day->format('Y/m/d');
}
}
else{
// ここはデフォルトの処理
// 配送日数が設定されている
if ($deliveryDateFlag) {
$period = new \DatePeriod (
new \DateTime($minDate . ' day'),
new \DateInterval('P1D'),
new \DateTime($minDate + $this->app['config']['deliv_date_end_max'] . ' day')
);
foreach ($period as $day) {
$deliveryDates[$day->format('Y/m/d')] = $day->format('Y/m/d');
}
}
}
return $deliveryDates;
}
結論:
あーーーー、もう、ECCubeめんどくさいwww
この記事の最終更新日:2018/06/19
最初に記事を書いた日:2018/06/19
この記事をシェアする
関連記事
- ・【ECCube3】「メルマガを受け取る」のチェックボックスを作る方法
- ・【ECCube3】お届け日の最大日数を設定する
- ・【ECCube3】クロネコとGMOペイメントで、受注編集画面のGMO決済ボタンがエラーになる件
- ・【ECCube3】管理画面のログをちゃんとソートする方法
- ・【EC-Cube3】Amazonペイメントとクロネコペイメントの組み合わせで受注編集画面のエラーが出る件
- ・【ECCube3】EC-Cubeでキーワード検索を高速化する方法
- ・【EC-Cube3】商品詳細ページに在庫数を表示したり、計算できるようにする
- ・【EC-Cube3】トップページに新着情報を自動表示する
- ・【EC-CUBE3】商品詳細ページだけH1タグの値を変える方法
- ・【EC-CUBE3】商品登録CSVの項目をプラグイン無しで変更する