Как создать заказ программно с помощью загружаемых продуктов


Я пытаюсь сделать заказ программно с помощью загружаемых продуктов. Меня не волнует оплата, единственное, что меня волнует, это то, что продукты будут доступны без администратора, который должен что-либо делать с этими заказами.

    require_once 'app/Mage.php';

    Mage::app();



    $id=7; // get Customer Id
    $customer = Mage::getModel('customer/customer')->load($id);

    $storeId = $customer->getStoreId();

$quote = Mage::getModel('sales/quote')
    ->setStoreId($storeId);

$quote->assignCustomer($customer);


// add product(s)
$product = Mage::getModel('catalog/product')->load(186);
$buyInfo = array(
    'qty' => 1,
    'price'=>0
    // custom option id => value id
    // or
    // configurable attribute id => value id
);
$params = array();
$links = Mage::getModel('downloadable/product_type')->getLinks( $product );
$linkId = 0;
foreach ($links as $link) {
    $linkId = $link->getId();
}

//$params['product'] = $product;
$params['qty'] = 1;
$params['links'] = array($linkId);
$request = new Varien_Object();
$request->setData($params);
//$quoteObj->addProduct($productObj , $request);

/* [adamw] Bundled product options would look like this:

$buyInfo = array(
    "qty" => 1,
    "bundle_option" = array(
        "123" => array(456), //optionid => array( selectionid )
        "124" => array(235)
    )
);

*/
//$class_name = get_class($quote);

//Zend_Debug::dump($class_name);




$quote->addProduct($product, $request);

$addressData = array(
    'firstname' => 'Vagelis',
    'lastname' => 'Bakas',
    'street' => 'Sample Street 10',
    'city' => 'Somewhere',
    'postcode' => '123456',
    'telephone' => '123456',
    'country_id' => 'US',
    'region_id' => 12, // id from directory_country_region table
);

$billingAddress = $quote->getBillingAddress()->addData($addressData);
$shippingAddress = $quote->getShippingAddress()->addData($addressData);

/*$shippingAddress->setCollectShippingRates(true)->collectShippingRates()
    ->setShippingMethod('flatrate_flatrate')
    ->setPaymentMethod('checkmo');*/


/* [adamw] Free shipping would look like this:
*/
$shippingAddress->setFreeShipping( true )
    ->setCollectShippingRates(true)->collectShippingRates()
    ->setShippingMethod('freeshipping_freeshipping')
    ->setPaymentMethod('checkmo');

$quote->setCouponCode('ABCD');
$quote->getPayment()->importData(array('method' => 'checkmo'));

$quote->collectTotals()->save();

$service = Mage::getModel('sales/service_quote', $quote);
$service->submitAll();
$order = $service->getOrder();



printf("Created order %s\n", $order->getIncrementId());

Это код, который, наконец, сделал это , НО: Загружаемые продукты не доступны мгновенно. Если вы выставляете счет за заказ вручную, продукты доступны.Если вы выставляете счет на заказ программным способом, продукты не доступно.

Есть идеи, почему и как это обойти? Я делаю здесь что-то не так?

Author: vbak, 2014-04-11

2 answers

После долгих исследований я выясняю, как это сделать. Моя главная проблема снова заключалась в том, что заказ был создан , НО он не был доступен после его отправки.Также, если вы снова выставите счет программно, он будет недоступен (когда я говорю "доступен", я имею в виду ссылки и сколько раз вам осталось его загрузить..).

Итак, я замечаю, что если вы пойдете в Mage/Downloadable/Model/Observer.php

Вы узнаете, что загружаемый продукт использует observers, который делает ссылки доступными, когда ты роешься в корзине.Но если вы делаете это программно, эти события не запускаются (по крайней мере, с моей точки зрения). Если вы используете функции: setLinkStatus и saveDownloadableOrderItem, вы сможете сохранить ссылки, и загружаемые продукты будут работать нормально без необходимости делать что-либо еще.

Если я совершу ошибку или если есть другое решение, пожалуйста, поправьте меня, так как я все еще нахожусь в процессе обучения.

Приветствия

 1
Author: vbak, 2014-04-15 16:24:52

Спасибо за ваше понимание этого. Чтобы исправить это, я просто выставляю счет за заказ как администратор, в результате события будут запущены.

Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
Mage::app()->loadArea(Mage_Core_Model_App_Area::AREA_ADMINHTML); 

 if($order->canInvoice()) {

$invoiceId = Mage::getModel('sales/order_invoice_api')
  ->create($order->getIncrementId(), array());

$invoice = Mage::getModel('sales/order_invoice')
  ->loadByIncrementId($invoiceId);


  $invoice->capture()->save();
 }   

Где $order - объект для заказа.

 0
Author: kemeice, 2016-03-21 00:38:14