目次
- Magentoの新しいメールモジュールを作成します(パート1)。Magentoに新しい配信方法を追加します。
- Magentoの「New Mail」モジュールを作成し(パート2) 、Magentoにウェアハウスデータベースを保存してNew Mailと同期するように指示します。
私はすでに複数の人から、ウクライナで最も人気のある貨物運送業者、ノバヤ・ポクタのモジュールを書くように頼まれています。 これは1時間ではないため、手は届きませんでした。 しかし、最近、アイデアが求められているなら、コミュニティにとって有益なこと、つまり:
1. Magentoのオープンソースコードを含む無料モジュール「New mail」。
2.プロセスの詳細な説明を含むいくつかのパートの記事。
この記事はMagentoの初心者を対象としていますが、経験豊富な開発者にとっても興味深いものです。 すべてのソースはGitHubで見つけることができます: github.com/alexkuk/Ak_NovaPoshta 、それらは開発中に補足されます。
それでは、問題のステートメントから始めましょう。 モジュールは次の機能を実行する必要があります。
1. Magentoに新しい配送方法を追加します。
2.方法設定では、パッケージの総重量ごとに異なる配送費用を設定できるようにする必要があります(Table Rates配送方法のように)。
3.倉庫ベースを新規メールと保存および同期します。
4.注文を出す配送方法のステップで選択するのに便利な形式で新規メールデポを表示します。デフォルトでは、ユーザーの都市のデポのみを表示します。
5.ユーザーパネルでパッケージを追跡する機能を追加します。
最近、New Mail APIを使用してTTNを作成および印刷することもできますが、ユーザーの許可を得て、この機能は後で使用します。 さらに、条項2に関して、APIは送料を計算する機能も提供します。 私は、よりシンプルで安定したオプションを好む一方で、注文の合計重量に応じて、店舗の所有者が独自に配送コストを決定できるようにします。 これは、売り手が各製品の重量を常に正確に決定できるわけではなく、APIを介して設定された送料が売り手の利益に役立たない可能性があるためです。 後で使用するために、APIを介してコスト計算を終了します。
新しい配送方法を追加する
そのため、新しいモジュールを作成し、新しい配信方法を追加します。 Magento CE 1.7.0.2を使用します。 モジュールはAk_NovaPoshtaと呼ばれます。 Magentoのモジュールの構造については既に多くの記事が書かれているため、この点は省略します。
Magentoが2つのエンティティで動作することは注目に値します。配送方法について説明すると、これらは配送業者(配送業者)と配送方法(配送業者が提供する配送方法)です。 この場合、運送業者はNew Mailであり、New Mailデポをメソッドとして使用します。
キャリアを追加するには、3つのことを行う必要があります。
1.キャリアの設定フィールドをsystem.xmlモジュールに追加します;
2.モジュールconfig.xmlで、デフォルト設定値とキャリアモデルクラスへのリンクを追加します。
<config> … <default> <carriers> <novaposhta> <!-- -, --> <active>0</active> <!-- , , shipping address --> <sallowspecific>1</sallowspecific> <!-- --> <specificcountry>UA</specificcountry> <!-- --> <model>novaposhta/carrier_novaPoshta</model> <!-- --> <title> </title> <!-- --> <specificerrmsg> . , , -.</specificerrmsg> </novaposhta> </carriers> </default> … </config>
3.キャリアにクラスモデルを追加します。
キャリアモデルクラスは、Mage_Shipping_Model_Carrier_Abstractを継承し、Mage_Shipping_Model_Carrier_Interfaceを実装します。 構成値を取得するためのgetConfigData($フィールド)メソッドなど、いくつかの便利なメソッドがMage_Shipping_Model_Carrier_Abstractで既に定義されています。 このクラスでは、使用可能な配信メソッドを返すメインメソッドcollectRates(Mage_Shipping_Model_Rate_Request $ request)を定義します。
public function collectRates(Mage_Shipping_Model_Rate_Request $request) { if (!$this->getConfigFlag('active')) { return false; } /** @var $result Mage_Shipping_Model_Rate_Result */ $result = Mage::getModel('shipping/rate_result'); $shippingPrice = 1.00; // dummy price $warehouseId = 1; // dummy warehouse ID $warehouseName = ' №1'; // dummy warehouse name /** @var $method Mage_Shipping_Model_Rate_Result_Method */ $method = Mage::getModel('shipping/rate_result_method'); $method->setCarrier($this->_code) ->setCarrierTitle($this->getConfigData('name')) ->setMethod('warehouse_' . $warehouseId) ->setMethodTitle($warehouseName) ->setPrice($shippingPrice) ->setCost($shippingPrice); $result->append($method); return $result; }
倉庫の同期を実装するまで、例として1つの配送方法-倉庫番号1を使用します。 collectRates()メソッド内で、Mage_Shipping_Model_Rate_Resultのインスタンスを作成し、Mage_Shipping_Model_Rate_Result :: append()メソッドを使用して、Mage_Shipping_Model_Rate_Result_Methodインスタンスを追加します。
最後に、親メソッドisTrackingAvailableを書き換えます。
public function isTrackingAvailable() { return true; }
この段階では、配送方法は既に使用できますが、ご覧のとおり、配送コストは常に1.00になります。
送料の設定を追加
次のステップでは、合計注文重量と送料をリンクするための構成オプションを追加します。 その結果、私はこのフォームを取得したい:
これを行うには、モジュールのsystem.xmlにweight_priceフィールドを追加します。
… <weight_price translate="label"> <label>Shipping price</label> <frontend_model>novaposhta/config_field_weightPrice</frontend_model> <backend_model>adminhtml/system_config_backend_serialized_array</backend_model> <sort_order>110</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> </weight_price> …
バックエンドモデルは、データベースに保存する前にフィールドの値を変換するモデルです。 この場合、既製のモデルMage_Adminhtml_Model_System_Config_Backend_Serialized_Arrayを使用します。 フロントエンドモデルはまったくモデルではなく、フィールドを表すブロックです。 Ak_NovaPoshta_Block_Config_Field_WeightPriceブロックを追加します。
class Ak_NovaPoshta_Block_Config_Field_WeightPrice extends Mage_Adminhtml_Block_System_Config_Form_Field_Array_Abstract { public function __construct() { $this->addColumn('weight', array( 'label' => Mage::helper('novaposhta')->__('Weight upper limit'), 'style' => 'width:120px', )); $this->addColumn('price', array( 'label' => Mage::helper('novaposhta')->__('Price'), 'style' => 'width:120px', )); $this->_addAfter = false; $this->_addButtonLabel = Mage::helper('novaposhta')->__('Add rate'); parent::__construct(); } }
ご覧のとおり、抽象的なMage_Adminhtml_Block_System_Config_Form_Field_Array_Abstractがすべての作業を行いますが、列とボタンを設定することは残ります。
構成フィールドの準備ができました。次に、その使用、つまり、注文の配送費用を見つけることに移りましょう。 これを行うには、以下のメソッドをキャリアクラスに追加します。
/** * @return array */ protected function _getWeightPriceMap() { $weightPriceMap = $this->getConfigData('weight_price'); if (empty($weightPriceMap)) { return array(); } return unserialize($weightPriceMap); } /** * @param $packageWeight * * @return float */ protected function _getDeliveryPriceByWeight($packageWeight) { $weightPriceMap = $this->_getWeightPriceMap(); $resultingPrice = 0.00; if (empty($weightPriceMap)) { return $resultingPrice; } $minimumWeight = 1000000000; foreach ($weightPriceMap as $weightPrice) { if ($packageWeight <= $weightPrice['weight'] && $weightPrice['weight'] <= $minimumWeight) { $minimumWeight = $weightPrice['weight']; $resultingPrice = $weightPrice['price']; } } return $resultingPrice; }
そしてcollectRatesメソッドで置き換えます
$shippingPrice = 1.00
よりリアルに
$shippingPrice = $this->_getDeliveryPriceByWeight($request->getPackageWeight());
完了
次のパートでは、ウェアハウスベースとNew Mail APIとの同期について説明します。 ご清聴ありがとうございました!