2

管理者側からマジェントのデフォルト出荷を使用しています。そのため、正常に機能し、顧客に完全にメールを送信しています。

Magento で完了したすべての注文の出荷の詳細を電子メールで送信できる 1 つのスクリプトを作成したいと考えています。これは、CSV 経由の特定の注文にのみ適用されます。

処理中の注文の order_id を使用している場合、スクリプトは正常に機能しますが、完了した注文では機能しません。メールで注文商品の詳細を送信しないでください。解決策を提案してください..

どうもありがとう。

私はそうするために以下のスクリプトを使用しています:

function completeShipment($orderIncrementId,$shipmentTrackingNumber,$shipmentCarrierCode){
    $shipmentCarrierTitle = $shipmentCarrierCode;
    $customerEmailComments = '';
    $order = Mage::getModel('sales/order')->loadByIncrementId($orderIncrementId);
    if (!$order->getId()) {
        Mage::throwException("Order does not exist, for the Shipment process to complete");
    }
    try {
        $shipment = Mage::getModel('sales/service_order', $order)->prepareShipment(_getItemQtys($order));

        $arrTracking = array(
                             'carrier_code' => isset($shipmentCarrierCode) ? $shipmentCarrierCode : $order->getShippingCarrier()->getCarrierCode(),
                             'title' => isset($shipmentCarrierTitle) ? $shipmentCarrierTitle : $order->getShippingCarrier()->getConfigData('title'),
                             'number' => $shipmentTrackingNumber,
                             );
        $track = Mage::getModel('sales/order_shipment_track')->addData($arrTracking);
        $shipment->addTrack($track);
        $shipment->register();
        _saveShipment($shipment, $order, $customerEmailComments);
    }catch (Exception $e) {
        throw $e;
    }
    return $save;
}
function _getItemQtys(Mage_Sales_Model_Order $order){
    $qty = array();
    foreach ($order->getAllItems() as $_eachItem) {
        if ($_eachItem->getParentItemId()) {
            $qty[$_eachItem->getParentItemId()] = $_eachItem->getQtyOrdered();
        } else {
            $qty[$_eachItem->getId()] = $_eachItem->getQtyOrdered();
        }
    }
    return $qty;
}

function _saveShipment(Mage_Sales_Model_Order_Shipment $shipment, Mage_Sales_Model_Order $order, $customerEmailComments = ''){
    $shipment->getOrder()->setIsInProcess(true);

    $transactionSave = Mage::getModel('core/resource_transaction')
            ->addObject($shipment)->addObject($order)->save();
    //$emailSentStatus = $shipment->getData('email_sent');

    $ship_data = $shipment->getOrder()->getData();
    $customerEmail = $ship_data['customer_email'];
    $emailSentStatus = $ship_data['email_sent'];

    if (!is_null($customerEmail)) {
        $shipment->sendEmail(true, $customerEmailComments);
        $shipment->setEmailSent(true);
    }
    return $this;
}







Thanks a lot dagfr...! the below code works for me to get done my task:


 function completeShipment($orderIncrementId,$shipmentIncreamentId){
    $order = Mage::getModel('sales/order')->loadByIncrementId($orderIncrementId);
    $ship_data = $order->getData();
    $customerEmail = $ship_data['customer_email'];

    $shipment = Mage::getModel('sales/order_shipment')->loadByIncrementId($shipmentIncreamentId);

    $customerEmailComments = '';
    $sent = 0;
    if (!is_null($customerEmail)) {
        $sent = $shipment->sendEmail(true, $customerEmailComments);
        $shipment->setEmailSent(true);
    }
    return $sent;
}
4

2 に答える 2

2

スクリプトは、出荷を作成してからメールを送信しようとします。

完了した注文の場合、出荷はすでに作成されており、再度作成することはできないためtry、メール送信前に失敗します。

直前 :

try {
    $shipment = Mage::getModel('sales/service_order', $order)->prepareShipment(_getItemQtys($order));

注文のステータスを確認し、完了している場合は、出荷を取得してメールを送信するだけです

  $shipment->sendEmail(true, $customerEmailComments);
  $shipment->setEmailSent(true);

それ以外の場合は、スクリプトを実行できます。

于 2013-03-18T08:17:40.593 に答える