連携設定
注意事項
EC-CUBEでのAPI連携には、プラグインのインストールが必要です。
プラグインは、カスタマイズや他社が提供するプラグインをインストールしていない、EC-CUBE 4.1.2で動作確認しています。
EC-CUBE側で発生するエラーについては、弊社で原因の特定を行うことが困難なため、サポートが出来ない場合もございます。
protegerとEC-CUBE4の連携設定を行います。
protegerの管理画面から連携設定
- protegerの管理画面にログインします。
- 右上の歯車マークから「EC-CUBE4」を選択します。
- 赤枠の3項目を入力します。
- EC-CUBE4管理画面ID
- EC-CUBE4管理画面パスワード
- EC-CUBE4店鋪URL
- 「保存」をクリックします。
protegerプラグイン追加
1.0.0:https://sdk.helloproteger.com/eccube-plugin/eccube4-v1-0-0.zip
EC-CUBE4管理画面からprotegerプラグインのインストールを行います。
-
管理画面にログインし、サイドバーの「オーナーズストア」→「プラグイン」→「プラグイン一覧」に遷移します。
-
ユーザー独自プラグイン欄の「アップロードして新規追加」ボタンを押し、ProtegerプラグインのZIPファイルをアップロードします。
-
「プラグインをインストールしました。」という文言が表示され、インストールが成功したことを確認してください。
-
ユーザー独自プラグイン欄にProtegerというプラグインが追加されていることを確認し、有効化ボタンを押します。
-
ユーザー独自プラグイン欄のProtegerプラグインのステータスが「有効」になっていることを確認します。
protegerプラグイン設定
-
proteger管理画面にログインし、右上歯車マークを押し、遷移したページで「API Authorization Key」を選択、表示されているキーの右横にあるボタンをクリックし、キーをコピーし控えておきます。
-
同じページで「店鋪設定」を選択、「店鋪ID」の横にあるボタンをクリックし、店鋪IDをコピーし控えておきます。
-
protegerプラグインのインストール後、EC-CUBE4管理画面サイドバーの「設定」配下に「proteger」という項目が追加されます。「proteger」に遷移し、「新規登録」を押します。
-
「店鋪ID」のフォームに2でコピーした内容を、「アクセストークン」フォームに1でコピーした内容を貼り付けます。また、「本番環境」のトグルスイッチを「有効」にするとprotegerの本番環境に接続します。テスト環境用の設定をする場合は「無効」にしてください。そして右下の登録ボタンを押してください。
-
「保存しました」という内容が表示され、入力した店鋪IDとアクセストークン、環境設定が表示されていることを確認してください。
EC-CUBE4本体カスタマイズ
以下のように4つの本体ファイルを編集してください。
編集元のファイルは初期状態のEC-CUBE4 バージョン4.1のファイルを元にしています。
適宜手元のファイルの実装と照らし合わせて変えてください。
- ec-cube/src/Eccube/Service/CartService.php
CartService.phpのaddProduct関数にproteger保証商品がある場合の処理をif文のブロックで追加します。
332行目
public function addProduct($ProductClass, $quantity = 1)
{
if (!$ProductClass instanceof ProductClass) {
$ProductClassId = $ProductClass;
$ProductClass = $this->entityManager
->getRepository(ProductClass::class)
->find($ProductClassId);
if (is_null($ProductClass)) {
return false;
}
}
$ClassCategory1 = $ProductClass->getClassCategory1();
if ($ClassCategory1 && !$ClassCategory1->isVisible()) {
return false;
}
$ClassCategory2 = $ProductClass->getClassCategory2();
if ($ClassCategory2 && !$ClassCategory2->isVisible()) {
return false;
}
$newItem = new CartItem();
$newItem->setQuantity($quantity);
$newItem->setPrice($ProductClass->getPrice02IncTax());
$newItem->setProductClass($ProductClass);
+ if (strpos($ProductClass->getProduct()->getName(), 'proteger') !== false) {
+ $newItem->setProtegerParentProductName($ProductClass->getProtegerParentProductName());
+ $newItem->setProtegerParentProductClassId($ProductClass->getProtegerParentProductClassId());
+ $newItem->setProtegerPlanId($ProductClass->getProtegerPlanId());
+ }
$allCartItems = $this->mergeAllCartItems([$newItem]);
$this->restoreCarts($allCartItems);
return true;
}
- ec-cube/src/Eccube/Service/OrderHelper.php
OrderHelper.phpのcreateOrderItemsFromCartItems関数にproteger保証商品がある場合の処理をif文のブロックで追加します。
元々ある処理はelseブロックの後にそのまま残します。
378行目
protected function createOrderItemsFromCartItems($CartItems)
{
$ProductItemType = $this->orderItemTypeRepository->find(OrderItemType::PRODUCT);
return array_map(function ($item) use ($ProductItemType) {
/* @var $item CartItem */
/* @var $ProductClass \Eccube\Entity\ProductClass */
$ProductClass = $item->getProductClass();
/* @var $Product \Eccube\Entity\Product */
$Product = $ProductClass->getProduct();
$OrderItem = new OrderItem();
+ if (strpos($Product->getName(), 'proteger') !== false) {
+ $OrderItem
+ ->setProduct($Product)
+ ->setProductClass($ProductClass)
+ ->setProductName($Product->getName().'-'.$item->getProtegerParentProductName().'-'.$item->getProtegerParentProductClassId())
+ ->setProductCode($ProductClass->getCode())
+ ->setPrice($item->getPrice())
+ ->setQuantity($item->getQuantity())
+ ->setOrderItemType($ProductItemType)
+ ->setProtegerPlanId($item->getProtegerPlanId());
+ } else {
$OrderItem
->setProduct($Product)
->setProductClass($ProductClass)
->setProductName($Product->getName())
->setProductCode($ProductClass->getCode())
->setPrice($ProductClass->getPrice02())
->setQuantity($item->getQuantity())
->setOrderItemType($ProductItemType);
+ }
$ClassCategory1 = $ProductClass->getClassCategory1();
if (!is_null($ClassCategory1)) {
$OrderItem->setClasscategoryName1($ClassCategory1->getName());
$OrderItem->setClassName1($ClassCategory1->getClassName()->getName());
}
$ClassCategory2 = $ProductClass->getClassCategory2();
if (!is_null($ClassCategory2)) {
$OrderItem->setClasscategoryName2($ClassCategory2->getName());
$OrderItem->setClassName2($ClassCategory2->getClassName()->getName());
}
return $OrderItem;
}, $CartItems instanceof Collection ? $CartItems->toArray() : $CartItems);
}
- ec-cube/src/Eccube/Service/PurchaseFlow/Processor/PriceChangeValidator.php
PriceChangeValidator.phpのvalidate関数に以下のようにproteger保証商品の場合の処理を追加します。
32行目
public function validate(ItemInterface $item, PurchaseContext $context)
{
if (!$item->isProduct()) {
return;
}
if ($item instanceof OrderItem) {
$price = $item->getPrice();
$realPrice = $item->getProductClass()->getPrice02();
+ $productName = $item->getProductClass()->getProduct()->getName();
} else {
// CartItem::priceは税込金額.
$price = $item->getPrice();
$realPrice = $item->getProductClass()->getPrice02IncTax();
+ $productName = $item->getProductClass()->getProduct()->getName();
}
+ if (strpos($productName, 'proteger') !== false) {
+ return;
+ }
if ($price != $realPrice) {
$item->setPrice($realPrice);
$this->throwInvalidItemException('front.shopping.price_changed', $item->getProductClass());
}
}
- ec-cube/src/Eccube/Service/Cart/ProductClassComparator.php
ProductClassComparator.phpのCompare関数の先頭にproteger保証商品の場合の処理を追加します。
21行目
class ProductClassComparator implements CartItemComparator
{
public function compare(CartItem $Item1, CartItem $Item2)
{
+ if (strpos($Item1->getProductClass()->getCode(), 'proteger') !== false && strpos($Item2->getProductClass()->getCode(), 'proteger') !==false) {
+ $protegerPlanId1 = $Item1->getProtegerPlanId();
+ $protegerPlanId2 = $Item2->getProtegerPlanId();
+ $proteger_plan_id1 = $protegerPlanId1 ? (string) $protegerPlanId1 : null;
+ $proteger_plan_id2 = $protegerPlanId2 ? (string) $protegerPlanId2 : null;
+ if ($proteger_plan_id1 === $proteger_plan_id2) {
+ return true;
+ } else {
+ return false;
+ }
+ }
...
}
}
- ec-cube/src/Eccube/Service/PurchaseFlow/Processor/TaxProcessor.php
TaxProcessor.phpのprocess関数にproteger保証商品の場合の処理を追加します。
proteger保証商品は管理画面の注文商品上でも常に税込表示となります。
66行目
public function process(ItemHolderInterface $itemHolder, PurchaseContext $context)
{
if (!$itemHolder instanceof Order) {
return;
}
foreach ($itemHolder->getOrderItems() as $item) {
// 明細種別に応じて税区分, 税表示区分を設定する,
$OrderItemType = $item->getOrderItemType();
if (!$item->getTaxType()) {
$item->setTaxType($this->getTaxType($OrderItemType));
}
if (!$item->getTaxDisplayType()) {
$item->setTaxDisplayType($this->getTaxDisplayType($OrderItemType));
}
// 税区分: 非課税, 不課税
if ($item->getTaxType()->getId() != TaxType::TAXATION) {
$item->setTax(0);
$item->setTaxRate(0);
$item->setRoundingType(null);
continue;
}
// 注文フロー内で税率が変更された場合を考慮し反映する
// 受注管理画面内では既に登録された税率は自動で変更しない
if ($context->isShoppingFlow() || $item->getRoundingType() === null) {
$TaxRule = $item->getOrderItemType()->isProduct()
? $this->taxRuleRepository->getByRule($item->getProduct(), $item->getProductClass())
: $this->taxRuleRepository->getByRule();
$item->setTaxRate($TaxRule->getTaxRate())
->setTaxAdjust($TaxRule->getTaxAdjust())
->setRoundingType($TaxRule->getRoundingType());
}
+ if ($item->getProtegerPlanId()) {
+ $item->setTaxDisplayType($this->entityManager->find(TaxDisplayType::class, TaxDisplayType::INCLUDED));
+ }
// 税込表示の場合は, priceが税込金額のため割り戻す.
if ($item->getTaxDisplayType()->getId() == TaxDisplayType::INCLUDED) {
$tax = $this->taxRuleService->calcTaxIncluded(
$item->getPrice(), $item->getTaxRate(), $item->getRoundingType()->getId(),
$item->getTaxAdjust());
} else {
$tax = $this->taxRuleService->calcTax(
$item->getPrice(), $item->getTaxRate(), $item->getRoundingType()->getId(),
$item->getTaxAdjust());
}
$item->setTax($tax);
}
}
Updated about 1 year ago