0

私はクライアントのためにMagentoストアフロントに取り組んでいます。彼らはドロップシッパーを使用しているので、単一の郵便番号は私たちにあまり役に立ちません。クライアントが出荷する最も一般的な郵便番号に設定されているので、多くの場合、問題ありません。

ただし、場合によっては、使用する必要のある別の発信元の郵便番号があります。よりまれなケースでは、複数のオリジン郵便番号があります。メインのzipとは異なるzipがある場合、これを「originzip」という属性に格納しました(クリエイティブですね)。

どこで変更を加える必要がありますか?私たちはUPSの配送方法のみを使用しており、配送を計算する前に、カートにある元の郵便番号を取得することを目的としています(この部分があると思います)。結果として、送料の計算を繰り返して値を合計する必要がある場合があります。つまり、元の郵便番号のある商品と元の郵便番号のない別の商品を注文した場合、最初に計算してから、最初に計算する必要があります。 2番目、そしてそれらを一緒に追加します。

誰かが私たちが変更する必要のあるphpファイルまたはクラスの正しい方向を教えてくれるなら、私はそれを大いに感謝します。

4

2 に答える 2

1

まず、ショッピングカートで使用される属性のリストにカスタム属性を追加する必要があります。stackoverflowで次の回答に従ってください: magento 1.4.1.1でカスタムアップロードされた画像をカートに追加するにはどうすればよいですか?

次に、カスタムの配送方法を作成する必要があります。おそらく、自分の配送方法から拡張したものです。配送リクエストから受け取ったアイテムをウォークスルーし、別のzipの出所を確認してから、それらのレートを個別に計算する必要があります。

既存の配送方法の機能を拡張するモジュールを作成しても問題がないことを願っています。

乾杯!

更新 カートアイテムにロードされる製品に属性を追加するには、次の構成を使用します。

<config>
     <global>
          <sales>
               <quote>
                    <item>
                        <product_attributes>
                             <origin_zip />
                        </product_attributes>
                    </item>
               </quote>
          </sales>
     </global>
</config>

次に、配送方法モデルで次のようなものを使用します(例としてUSPSを使用)。

public function collectRates(Mage_Shipping_Model_Rate_Request $request)
{
    if (!$this->getConfigFlag('active')) {
        return false;
    }

    $defaultOriginZip = Mage::getStoreConfig('shipping/origin/postcode', $this->getStore());

    $requestDataByOriginZip = array();
    // Walking through quote items
    foreach ($request->getAllItems() as $quoteItem) {
        // If virtual or not shippable separately, it should be skipped
        if ($quoteItem->isVirtual() || $quoteItem->isDummy(true)) {
            continue;
        }
        // Retrieving origin zip code
        if ($quoteItem->getProduct()->getOriginZip()) {
            $zipCodeForCalculation = $quoteItem->getProduct()->getOriginZip();
        } else {
            $zipCodeForCalculation = $defaultOriginZip;
        }

        if (!isset($requestDataByOriginZip[$zipCodeForCalculation])) {
            // Default values initialization for this zip code
            $requestDataByOriginZip[$zipCodeForCalculation] = array(
                'orig_postcode' => $zipCodeForCalculation,
                'package_weight' => 0,
                'package_value' => 0,
                // etc...
            );
        }

        $requestDataByOriginZip[$zipCodeForCalculation]['package_weight'] += $quoteItem->getRowWeight();
        $requestDataByOriginZip[$zipCodeForCalculation]['package_value'] += $quoteItem->getBaseRowTotal();
        // Etc...
    }

    $results = array();
    foreach ($requestDataByOriginZip as $requestData) {
       $requestByZip = clone $request; // Cloning to prevent changing logic in other shipment methods.
       $requestByZip->addData($requestData);
       $this->setRequest($requestByZip);
       // Returns rate result for current request
       $results[] = $this->_getQuotes();
    }

    $yourMergedResult = Mage::getModel('shipping/rate_result');

    foreach ($results as $result) {
       // Logic for merging the rate prices....
    }

    return $yourMergedResult;
}
于 2011-04-14T19:45:28.907 に答える
1

クラスusa/shipping_upsはこれらのリクエストを処理するものであり、具体的にはメソッドsetRequestには必要なものがあるようです。

    if ($request->getOrigPostcode()) {
        $r->setOrigPostal($request->getOrigPostcode());
    } else {
        $r->setOrigPostal(Mage::getStoreConfig('shipping/origin/postcode', $this->getStore()));
    }  

orig_postcodeを配送リクエストに追加できる場合、UPSはその出所に基づいて見積もりを返します。

Mage_Shipping_Model_Rate_Requestこれに対する1つのアプローチは、。というメソッドをオーバーライドして追加することgetOrigPostcodeです。実際のメソッドであるため、これはデフォルトのMagentoゲッター/セッターの動作をオーバーライドします。このメソッドでリクエストの内容を照会して、使用する必要のあるzipを見つけます。

お役に立てば幸いです。

ありがとう、ジョー

于 2011-04-14T19:55:32.243 に答える