প্রোগ্রামক্রমে শিপমেন্ট তৈরি করা হচ্ছে


32

আমি প্রোগ্রামক্রমে চালান তৈরির বিভিন্ন উপায়ে এসেছি। তারা হয়

     //Type 1
     $converter=Mage::getModel('sales/convert_order');
     $shipment=$converter->toShipment($order);
     // snip

     //Type 2
     $shipment = Mage::getModel('sales/service_order', $order)
                                ->prepareShipment($this->_getItemQtys($order));
     // snip

     //Type 3
     $shipment = Mage::getModel('sales/service_order', $order)->prepareShipment($itemQty);
     $shipment = new Mage_Sales_Model_Order_Shipment_Api();
     $shipmentId = $shipment->create($orderId);
     // snip

এই পদ্ধতির মধ্যে পার্থক্য কী। তিনটি পদ্ধতির মধ্যে শিপমেন্ট তৈরি এবং ট্র্যাকিং নম্বর যুক্ত করার উপযুক্ত পদ্ধতি।


কোনও স্বীকৃত এবং অনুদানের পুরষ্কারের জন্য আমার উত্তরের আরও কি আরও বিশদ দরকার? আপনার ইচ্ছা থাকলে আমি সমালোচনা বা স্পষ্টির জন্য উন্মুক্ত।
ফিলিভিংল

উত্তর:


47

আমি একটা শট দেব। আসুন একবারে তাদের এক করে নিই:

পদ্ধতি 1

$converter=Mage::getModel('sales/convert_order');
$shipment=$converter->toShipment($order);

$converterউপরের অংশটি ক্লাস থেকে লোড করা হয় Mage_Sales_Model_Convert_Order, যা copyFieldsetচালানের অবজেক্টে অর্ডার বিশদ অনুলিপি করতে একটি মূল সহায়ক ব্যবহার করে । $ অর্ডার টাইপ অ্যারে বা হতে হবে Varien_Object

এই পদ্ধতিটি আসলে 3 পদ্ধতিটির মূল অংশে রয়েছে কারণ এটি Mage::getModel('sales/convert_order')এর কনস্ট্রাক্টর কলটিতে ব্যবহার করে।

এই পদ্ধতির মূল পার্থক্যকারী - এটি একটি অ্যারে বা একটি অবজেক্ট নিতে পারে $orderএবং একটি মৌলিক $shipmentবস্তু তৈরি করতে পারে । এটি একটি নিম্ন-স্তরের পদ্ধতি যা আপনি পদ্ধতি 2, পদ্ধতি 3 তে রেখেছেন এমন পদ্ধতি দ্বারা একচেটিয়াভাবে ব্যবহৃত হয়।

পদ্ধতি 2

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

চালান তৈরির ক্ষেত্রে এটি ম্যাজেন্টোর কররের সবচেয়ে জনপ্রিয় উপায় বলে মনে হচ্ছে কারণ এটি চালান এবং চালান উভয় নিয়ামকই ব্যবহৃত হয়। বস্তুর উপর সুরক্ষিত সম্পত্তি হিসাবে সেট করে এটির $orderইনস্ট্যান্ট করার জন্য কনস্ট্রাক্টর আর্গুমেন্ট হিসাবে ব্যবহৃত হয় Mage_Sales_Model_Service_Order

তারপরে আপনি কল করে prepareShipmentএকটি পরিমাণ ছাড়িয়ে যাচ্ছেন । যেহেতু এই পদ্ধতিটি পদ্ধতি 1 থেকে রূপান্তরকারী শ্রেণিটি ব্যবহার করে, আপনার আরও বিবরণ নির্দিষ্ট করতে হবে না যেমন অর্ডার আইটেমগুলিprepareShipment আর্গুমেন্টে আইটেম চালানের পরিমাণের বিশদ বিবরণ , যার সাথে এখানে ডাকা হয় $this->_getItemQtys। এটি আপনার নিজের প্রসঙ্গে ব্যবহার করতে, আপনাকে কেবল নীচের বিন্যাস সহ একটি অ্যারে আইটেমের পরিমাণটি পাস করতে হবে:

array(
  'order_item_id'=>$qty,
  'order_item_id'=>$qty,
  'order_item_id'=>$qty
)

এই পদ্ধতির মূল পার্থক্যকারী - এটি আপনাকে একটি ipment চালানের অবজেক্ট ফিরিয়ে দেয় তবে এতে সমস্ত আইটেম এতে রূপান্তরিত হয়। এটি প্লাগ-এন্ড-প্লে।

পদ্ধতি 3

কোরটিতে এই পদ্ধতিটি ব্যবহার করার প্রমাণ আমি খুঁজে পাইনি। এটি হ্যাকের মতো দেখাচ্ছে, সত্যি বলতে। পদ্ধতিটি এখানে:

$itemQty =  $order->getItemsCollection()->count();
$shipment = Mage::getModel('sales/service_order', $order)->prepareShipment($itemQty);
$shipment = new Mage_Sales_Model_Order_Shipment_Api();
$shipmentId = $shipment->create($orderId);

পদক্ষেপ 1 উপরোক্ত পদ্ধতি 2 এর মতোই। কোনও পার্থক্য নেই। যাইহোক, আপনি একটি $shipmentবস্তু ফিরে পাবেন , যা প্রত্যক্ষ উন্মাদনার দ্বারা প্রতিস্থাপিত হয় Mage_Sales_Model_Order_Shipment_Api। এটি অ-মানক। চালান এপিআই অবজেক্ট পাওয়ার সেরা অনুশীলনের উপায়টি কল করা হবে Mage::getModel('sales/order_shipment_api')

এর পরে, এটি $orderIdআপনার কোডে সংজ্ঞায়িত হয়নি এমন একটি ভেরিয়েবল থেকে চালান তৈরি করতে সেই ওভাররাইট, নতুন চালান এপিআই অবজেক্টটি ব্যবহার করে । আবার, এটি একটি workaround মত মনে হচ্ছে।

এ খুঁজছি Mage_Sales_Model_Order_Shipment_Api::create(), এটি একটি চালান জেনারেট করার জন্য একটি এক স্টপ দোকান মত মনে হয় অধিকাংশ মৌলিক চালান তৈরি করা প্রয়োজন বিবরণ শুধুমাত্র একটি অর্ডার increment_id

এটি এমন একটি হ্যাক যা কোনও মডিউল বা এক্সটেনশন দ্বারা ব্যবহার করা উচিত নয়। এই এপিআইটি এক্সএমএল আরপিসি / এসওএপি এপিআই অনুরোধের মাধ্যমে উদ্ভাসিত বৈশিষ্ট্যগুলি দ্বারা গ্রাস করা এবং একাধিক পদক্ষেপের এপিআই অনুরোধগুলি অপসারণের উদ্দেশ্যে ইচ্ছাকৃতভাবে বেসিক।

পরিণামে পদ্ধতি 3টি নিতান্তই কৌতুকপূর্ণ হয়ে উঠেছে, এবং ম্যাগেজসলেস_মোডেল_ অর্ডারকে কল করার মাধ্যমে এটি কল করে prepareShipment, যা উপরের পরিচিত পদ্ধতি 2 এর জন্য উচ্চতর অর্ডার বিমূর্ততা:

public function prepareShipment($qtys = array())
{
    $shipment = Mage::getModel('sales/service_order', $this)->prepareShipment($qtys);
    return $shipment;
}

এখানে মূল পার্থক্যকারী - আপনার যদি চালানের দরকার হয় তবে হ্যাকগুলিতে কিছু মনে করবেন না এবং কেবল একটি ইনক্রিমেন্ট_আইডি রয়েছে - এই পদ্ধতিটি ব্যবহার করুন। এছাড়াও আপনি যদি এসওএপি এপিআইয়ের মাধ্যমে এটি পরিচালনা করতে পছন্দ করেন তবে দরকারী তথ্য।

আমি আশা করি এটি সাহায্য করবে.


1
ম্যাগস্টোর ইনভেন্টরি ম্যানেজমেন্ট ব্যবহার করা যে কোনও ব্যক্তির পক্ষে শীর্ষস্থানীয়: পদ্ধতি 3 তাদের হুকগুলি ট্রিগার করে না যাতে আপনি ম্যাজেন্টো কোর শিপমেন্ট এবং গুদাম চালানের শিপমেন্টের মধ্যে শিপমেন্টের বৈষম্য বজায় রাখবেন। এছাড়াও ভাল উত্তর ওপি :)
রিকি ওডিন ম্যাথিউজ

7

এখানে মূল বিষয়টি হ'ল পদ্ধতি 1 এবং 2 কাজ করে না ...

আমি @ ফিলিভিঙ্কলের সাথে একমত, যদিও পদ্ধতি 3 হ্যাকি। এপিআই ফাংশনগুলি সত্যই কোনও নন-এপিআই প্রসঙ্গে কল করা উচিত নয়। আপনি কখনই জানেন না যে ভবিষ্যতের প্রকাশগুলি এই ধরণের কোড ভঙ্গ করতে পারে।

সুতরাং যে কি ছেড়ে? ঠিক আছে, 1 এবং 2 পদ্ধতিগুলি একেবারে ভাঙা হয়নি। এটা ঠিক যে তারা কেবল কাজের কিছু অংশ করে। তাদের দেখতে কেমন হওয়া উচিত তা এখানে:

দ্রষ্টব্য: বংশবৃদ্ধির জন্য, নিম্নলিখিত কোড স্নিপেটগুলি চালানের জন্য সমস্ত যোগ্য আইটেম যুক্ত করবে। আপনি যদি কেবল কোনও আদেশের কিছু অংশ প্রেরণ করতে চান তবে আপনাকে কোডের কিছু অংশ সংশোধন করতে হবে - আশা করি আমি আপনাকে এগিয়ে যাওয়ার জন্য যথেষ্ট পরিমাণে দিয়েছি।

পদ্ধতি 1

আপনি কোড তাকান তাহলে app/code/core/Mage/Sales/Model/Order/Shipment/Api.php(যেমন পদ্ধতি 3 ব্যবহৃত) আপনি যে ছাড়াও দেখতে পাবেন $convertor->toShipment($order)এটি কল $item = $convertor->itemToShipmentItem($orderItem), $item->setQty($qty)এবং $shipment->addItem($item)যে যোগ্য আদেশ আইটেম জন্য। হ্যাঁ, ম্যাজেন্টো আসলেই অলস, আপনাকে এটি প্রত্যেকের মধ্যেই কোয়েक्स করতে হবে। একক। ধাপ। তারপরে আপনাকে ডাটাবেসে চালানটি সংরক্ষণ করতে আরও কয়েকটি হুপের মধ্য দিয়ে যেতে হবে।

সুতরাং পদ্ধতি 1 এর মতো দেখতে হবে:

$convertor = Mage::getModel('sales/convert_order');
$shipment = $convertor->toShipment($order);
foreach ($order->getAllItems() as $orderItem) {
    if ($orderItem->getQtyToShip() && !$orderItem->getIsVirtual()) {
        $item = $convertor->itemToShipmentItem($orderItem);
        $item->setQty($orderItem->getQtyToShip());
        $shipment->addItem($item);
    }
}
$shipment->register();
$order->setIsInProcess(true);
Mage::getModel('core/resource_transaction')
         ->addObject($shipment)
         ->addObject($order))
         ->save();

পদ্ধতি 2

প্রথমে, আপনার কাছে একটি কল রয়েছে $this->_getItemQtys()যা অবশ্যই নির্দিষ্ট কিছু ক্লাসে কাজ করবে (যেগুলি _getItemQtys ফাংশনটি পেয়েছে বা উত্তরাধিকারসূত্রে রয়েছে)। সুতরাং এটির পরিবর্তন হওয়া দরকার, এবং পদ্ধতি 1 এর মতো আপনারও প্রক্রিয়াটি বের করতে হবে।

তাকিয়ে app/code/core/Mage/Adminhtml/controllers/Sales/Order/ShipmentController.phpএটা এই পদ্ধতির সঙ্গে একটু ভালো অবস্থা - এটি মনে হয় আইটেম চালান নিজেই বরাবর রূপান্তরিত হয়। তবে আপনি এখনও একটি ক্ষণস্থায়ী বস্তু ফিরে পাবেন, আপনাকে নিজের ডাটাবেসে নিজেই সংরক্ষণ করতে হবে, যেমন:

$itemQtys = array();
foreach ($order->getAllItems() as $orderItem) {
    if ($orderItem->getQtyToShip() && !$orderItem->getIsVirtual()) {
        $itemQtys[$orderItem->getId()] = $orderItem->getQtyToShip();
    }
}
$shipment = Mage::getModel('sales/service_order', $order)->prepareShipment($itemQtys);
$shipment->register();
$order->setIsInProcess(true);
Mage::getModel('core/resource_transaction')
         ->addObject($shipment)
         ->addObject($order)
         ->save();

আমি সেখানে সামান্য ত্রুটি-চেক যুক্ত করারও পরামর্শ দিচ্ছি, উদাহরণস্বরূপ আপনার চালানটি আপনার আগে কোনও আইটেম রয়েছে কিনা তা নিশ্চিত register()করে নিন।

কোনটি সেরা?

আমি বলব এটি মতামতের একটি বিষয়। আমি কোনও মানদণ্ড পরীক্ষা করিনি তবে আমি পুরোপুরি আত্মবিশ্বাসী যে দুটি পদ্ধতির মধ্যে গতির পার্থক্য নগণ্য হবে। কোড আকার এবং পাঠযোগ্যতার জন্য তাদের মধ্যে খুব বেশি কিছু নেই।

ক্রমে সমস্ত আইটেমকে স্পষ্টভাবে রূপান্তর না করার জন্য আমি পদ্ধতি 2 এর মতো করি, তবে এখনও পরিমাণগুলি নিষ্কাশনের জন্য আপনাকে এগুলির মধ্য দিয়ে যেতে হবে না। একটি দুর্দান্ত ছোট কোড পদাঙ্ক জন্য, পদ্ধতি 3 আমার প্রিয় হবে! তবে সফটওয়্যার ইঞ্জিনিয়ার হিসাবে আমি এটি সুপারিশ করতে পারি না। সুতরাং আমি পদ্ধতি 2 জন্য মোচড় করব।


1

বন্ধুরা উপরের কেউই আমার ইস্যুতে কাজ করেনি। নিম্নলিখিত আমার জন্য কাজ করে। এটি যদি আপনার কাউকে ওখানে থেকে সহায়তা করে তবে এটিকে এখানে রেখে দিন।

public function _createShipment($orderIncrementId = '100310634'){
    // Load Product ..
    $order = Mage::getModel('sales/order')->loadByIncrementId($orderIncrementId);

    // Create Qty array
    $shipmentItems = array();
    foreach ($order->getAllItems() as $item) {
        $shipmentItems [$item->getId()] = $item->getQtyToShip();
    }

    // Prepear shipment and save ....
    if ($order->getId() && !empty($shipmentItems) && $order->canShip()) {
        $shipment = Mage::getModel('sales/service_order', $order)->prepareShipment($shipmentItems);
        $shipment->save();
    }
}

এই পদ্ধতিটির সাথে কেন কোয়ালিটি_প্লেস বিক্রয়_ফ্ল্যাট_র্ডার_টাইম টেবিলে জনপ্রিয় নয়?
ক্রিয়েটিভ অ্যাপ্লিকেশন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.