gpt4 book ai didi

php - magento 模型检索错误而不是对象 - 以编程方式创建订单

转载 作者:可可西里 更新时间:2023-11-01 12:36:12 25 4
gpt4 key购买 nike

我正在尝试以编程方式创建订单。我创建了一个具有以下结构的模型:

<?php
class Pricebinc_App_Model_OrderCreate extends Mage_Core_Model_Abstract
{
const CUSTOMER_RANDOM = null;
protected $_shippingMethod = 'freeshipping_freeshipping';
protected $_paymentMethod = 'cashondelivery';
protected $_subTotal = 0;
protected $_order;
protected $_storeId;

public function setShippingMethod($methodName)
{
$this->_shippingMethod = $methodName;
}

public function setPaymentMethod($methodName)
{
$this->_paymentMethod = $methodName;
}

public function setCustomer($customer)
{
if ($customer instanceof Mage_Customer_Model_Customer) {
$this->_customer = $customer;
}
if (is_numeric($customer)) {
$this->_customer = Mage::getModel('customer/customer')->load($customer);
} else if ($customer === self::CUSTOMER_RANDOM) {
$customers = Mage::getResourceModel('customer/customer_collection');

$customers
->getSelect()
->limit(1)
->order('RAND()');

$id = $customers->getFirstItem()->getId();

$this->_customer = Mage::getModel('customer/customer')->load($id);
}
}

public function createOrder($products)
{
if (!($this->_customer instanceof Mage_Customer_Model_Customer)) {
$this->setCustomer(self::CUSTOMER_RANDOM);
}

$transaction = Mage::getModel('core/resource_transaction');
$this->_storeId = Mage::app()->getStore()->setId(Mage_Core_Model_App::ADMIN_STORE_ID);
$reservedOrderId = Mage::getSingleton('eav/config')
->getEntityType('order')
->fetchNewIncrementId($this->_storeId);

$currencyCode = Mage::app()->getBaseCurrencyCode();
$this->_order = Mage::getModel('sales/order')
->setIncrementId($reservedOrderId)
->setStoreId($this->_storeId)
->setQuoteId(0)
->setGlobalCurrencyCode($currencyCode)
->setBaseCurrencyCode($currencyCode)
->setStoreCurrencyCode($currencyCode)
->setOrderCurrencyCode($currencyCode);


$this->_order->setCustomerEmail($this->_customer->getEmail())
->setCustomerFirstname($this->_customer->getFirstname())
->setCustomerLastname($this->_customer->getLastname())
->setCustomerGroupId($this->_customer->getGroupId())
->setCustomerIsGuest(0)
->setCustomer($this->_customer);


$billing = $this->_customer->getDefaultBillingAddress();
$billingAddress = Mage::getModel('sales/order_address')
->setStoreId($this->_storeId)
->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_BILLING)
->setCustomerId($this->_customer->getId())
->setCustomerAddressId($this->_customer->getDefaultBilling())
->setCustomerAddress_id($billing->getEntityId())
->setPrefix($billing->getPrefix())
->setFirstname($billing->getFirstname())
->setMiddlename($billing->getMiddlename())
->setLastname($billing->getLastname())
->setSuffix($billing->getSuffix())
->setCompany($billing->getCompany())
->setStreet($billing->getStreet())
->setCity($billing->getCity())
->setCountry_id($billing->getCountryId())
->setRegion($billing->getRegion())
->setRegion_id($billing->getRegionId())
->setPostcode($billing->getPostcode())
->setTelephone($billing->getTelephone())
->setFax($billing->getFax());
$this->_order->setBillingAddress($billingAddress);

$shipping = $this->_customer->getDefaultShippingAddress();
$shippingAddress = Mage::getModel('sales/order_address')
->setStoreId($this->_storeId)
->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_SHIPPING)
->setCustomerId($this->_customer->getId())
->setCustomerAddressId($this->_customer->getDefaultShipping())
->setCustomer_address_id($shipping->getEntityId())
->setPrefix($shipping->getPrefix())
->setFirstname($shipping->getFirstname())
->setMiddlename($shipping->getMiddlename())
->setLastname($shipping->getLastname())
->setSuffix($shipping->getSuffix())
->setCompany($shipping->getCompany())
->setStreet($shipping->getStreet())
->setCity($shipping->getCity())
->setCountry_id($shipping->getCountryId())
->setRegion($shipping->getRegion())
->setRegion_id($shipping->getRegionId())
->setPostcode($shipping->getPostcode())
->setTelephone($shipping->getTelephone())
->setFax($shipping->getFax());

$this->_order->setShippingAddress($shippingAddress)
->setShippingMethod($this->_shippingMethod);

$orderPayment = Mage::getModel('sales/order_payment')
->setStoreId($this->_storeId)
->setCustomerPaymentId(0)
->setMethod($this->_paymentMethod)
->setPoNumber(' – ');

$this->_order->setPayment($orderPayment);

$this->_addProducts($products);

$this->_order->setSubtotal($this->_subTotal)
->setBaseSubtotal($this->_subTotal)
->setGrandTotal($this->_subTotal)
->setBaseGrandTotal($this->_subTotal);

$transaction->addObject($this->_order);
$transaction->addCommitCallback(array($this->_order, 'place'));
$transaction->addCommitCallback(array($this->_order, 'save'));
$transaction->save();
}

protected function _addProducts($products)
{
$this->_subTotal = 0;

foreach ($products as $productRequest) {
if ($productRequest['product'] == 'rand') {

$productsCollection = Mage::getResourceModel('catalog/product_collection');

$productsCollection->addFieldToFilter('type_id', 'simple');
Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($productsCollection);

$productsCollection->getSelect()
->order('RAND()')
->limit(rand($productRequest['min'], $productRequest['max']));

foreach ($productsCollection as $product) {
$this->_addProduct(array(
'product' => $product->getId(),
'qty' => rand(1, 2)
));
}
} else {
$this->_addProduct($productRequest);
}
}
}

protected function _addProduct($requestData)
{
$request = new Varien_Object();
$request->setData($requestData);

$product = Mage::getModel('catalog/product')->load($request['product']);

$cartCandidates = $product->getTypeInstance(true)
->prepareForCartAdvanced($request, $product);

if (is_string($cartCandidates)) {
throw new Exception($cartCandidates);
}

if (!is_array($cartCandidates)) {
$cartCandidates = array($cartCandidates);
}

$parentItem = null;
$errors = array();
$items = array();
foreach ($cartCandidates as $candidate) {
$item = $this->_productToOrderItem($candidate, $candidate->getCartQty());

$items[] = $item;

/**
* As parent item we should always use the item of first added product
*/
if (!$parentItem) {
$parentItem = $item;
}
if ($parentItem && $candidate->getParentProductId()) {
$item->setParentItem($parentItem);
}
/**
* We specify qty after we know about parent (for stock)
*/
$item->setQty($item->getQty() + $candidate->getCartQty());

// collect errors instead of throwing first one
if ($item->getHasError()) {
$message = $item->getMessage();
if (!in_array($message, $errors)) { // filter duplicate messages
$errors[] = $message;
}
}
}
if (!empty($errors)) {
Mage::throwException(implode("\n", $errors));
}

foreach ($items as $item) {
$this->_order->addItem($item);
}

return $items;
}

function _productToOrderItem(Mage_Catalog_Model_Product $product, $qty = 1)
{
$rowTotal = $product->getFinalPrice() * $qty;

$options = $product->getCustomOptions();

$optionsByCode = array();

foreach ($options as $option) {
$quoteOption = Mage::getModel('sales/quote_item_option')->setData($option->getData())
->setProduct($option->getProduct());

$optionsByCode[$quoteOption->getCode()] = $quoteOption;
}

$product->setCustomOptions($optionsByCode);

$options = $product->getTypeInstance(true)->getOrderOptions($product);

$orderItem = Mage::getModel('sales/order_item')
->setStoreId($this->_storeId)
->setQuoteItemId(0)
->setQuoteParentItemId(NULL)
->setProductId($product->getId())
->setProductType($product->getTypeId())
->setQtyBackordered(NULL)
->setTotalQtyOrdered($product['rqty'])
->setQtyOrdered($product['qty'])
->setName($product->getName())
->setSku($product->getSku())
->setPrice($product->getFinalPrice())
->setBasePrice($product->getFinalPrice())
->setOriginalPrice($product->getFinalPrice())
->setRowTotal($rowTotal)
->setBaseRowTotal($rowTotal)
->setWeeeTaxApplied(serialize(array()))
->setBaseWeeeTaxDisposition(0)
->setWeeeTaxDisposition(0)
->setBaseWeeeTaxRowDisposition(0)
->setWeeeTaxRowDisposition(0)
->setBaseWeeeTaxAppliedAmount(0)
->setBaseWeeeTaxAppliedRowAmount(0)
->setWeeeTaxAppliedAmount(0)
->setWeeeTaxAppliedRowAmount(0)
->setProductOptions($options);

$this->_subTotal += $rowTotal;

return $orderItem;
}
}

Then I include the following statement in the controller:

$orderGenerator = Mage::getModel('app/ordercreate');

$orderGenerator->createOrder(array(
array(
'product' => 24, //product id
'qty' => 1
)
));

但我经常收到错误 500。

包括 Zend_Debug::dump($orderGenerator);创建以下输出。

object(Pricebinc_App_Model_OrderCreate)#230 (21) {
["_shippingMethod":protected] => string(25) "freeshipping_freeshipping"
["_paymentMethod":protected] => string(14) "cashondelivery"
["_customer":protected] => NULL
["_subTotal":protected] => int(0)
["_order":protected] => NULL
["_storeId":protected] => NULL
["_eventPrefix":protected] => string(13) "core_abstract"
["_eventObject":protected] => string(6) "object"
["_resourceName":protected] => string(15) "app/ordercreate"
["_resource":protected] => NULL
["_resourceCollectionName":protected] => string(26) "app/ordercreate_collection"
["_cacheTag":protected] => bool(false)
["_dataSaveAllowed":protected] => bool(true)
["_isObjectNew":protected] => NULL
["_data":protected] => array(0) {
}
["_hasDataChanges":protected] => bool(false)
["_origData":protected] => NULL
["_idFieldName":protected] => NULL
["_isDeleted":protected] => bool(false)
["_oldFieldsMap":protected] => array(0) {
}
["_syncFieldsMap":protected] => array(0) {
}
}

我从 amasty https://blog.amasty.com/creating-magento-order-programmatically/ 那里获取了该代码

更新-------------------------------------------- ----------------------

当前错误显示客户未设置。示例是 fatal error :在 C:\Zend\Apache2\htdocs\company\app\code\community\Pricebinc\App\Model\OrderCreate.php 中的非对象上调用成员函数 getEmail() 第 56 行 -> $this->_order->setCustomerEmail($this->_customer->getEmail())

最佳答案

如果您需要在 magento 1.9 中以编程方式创建订单,最后这是代码。

<?php
class NameApp_App_Model_OrderCreate extends Mage_Core_Model_Abstract
{
const CUSTOMER_RANDOM = null;
protected $_shippingMethod = 'freeshipping_freeshipping';
protected $_paymentMethod = 'cashondelivery';
protected $_subTotal = 0;
protected $_order;
protected $_storeId = '0';

public function _construct()
{
parent::_construct();
$this->_init('app/ordercreate');
}

public function setShippingMethod($methodName)
{
$this->_shippingMethod = $methodName;
}
public function setPaymentMethod($methodName)
{
$this->_paymentMethod = $methodName;
}

public function createOrder($products)
{
$transaction = Mage::getModel('core/resource_transaction');
$this->_storeId = Mage::app()->getStore()->setId(Mage_Core_Model_App::ADMIN_STORE_ID);
$this->_customer = Mage::getSingleton('customer/session')->getCustomer();
$reservedOrderId = Mage::getSingleton('eav/config')
->getEntityType('order')
->fetchNewIncrementId($this->_storeId);

$currencyCode = Mage::app()->getBaseCurrencyCode();
$this->_order = Mage::getModel('sales/order')
->setIncrementId($reservedOrderId)
->setStoreId($this->_storeId)
->setQuoteId(0)
->setGlobalCurrencyCode($currencyCode)
->setBaseCurrencyCode($currencyCode)
->setStoreCurrencyCode($currencyCode)
->setOrderCurrencyCode($currencyCode);


$this->_order->setCustomerEmail($this->_customer->getEmail())
->setCustomerFirstname($this->_customer->getFirstname())
->setCustomerLastname($this->_customer->getLastname())
->setCustomerGroupId($this->_customer->getGroupId())
->setCustomerIsGuest(0)
->setCustomer($this->_customer);


$billing = $this->_customer->getDefaultBillingAddress();
$billingAddress = Mage::getModel('sales/order_address')
->setStoreId($this->_storeId)
->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_BILLING)
->setCustomerId($this->_customer->getId())
->setCustomerAddressId($this->_customer->getDefaultBilling())
->setCustomerAddress_id($billing->getEntityId())
->setPrefix($billing->getPrefix())
->setFirstname($billing->getFirstname())
->setMiddlename($billing->getMiddlename())
->setLastname($billing->getLastname())
->setSuffix($billing->getSuffix())
->setCompany($billing->getCompany())
->setStreet($billing->getStreet())
->setCity($billing->getCity())
->setCountry_id($billing->getCountryId())
->setRegion($billing->getRegion())
->setRegion_id($billing->getRegionId())
->setPostcode($billing->getPostcode())
->setTelephone($billing->getTelephone())
->setFax($billing->getFax());
$this->_order->setBillingAddress($billingAddress);

$shipping = $this->_customer->getDefaultShippingAddress();
$shippingAddress = Mage::getModel('sales/order_address')
->setStoreId($this->_storeId)
->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_SHIPPING)
->setCustomerId($this->_customer->getId())
->setCustomerAddressId($this->_customer->getDefaultShipping())
->setCustomer_address_id($shipping->getEntityId())
->setPrefix($shipping->getPrefix())
->setFirstname($shipping->getFirstname())
->setMiddlename($shipping->getMiddlename())
->setLastname($shipping->getLastname())
->setSuffix($shipping->getSuffix())
->setCompany($shipping->getCompany())
->setStreet($shipping->getStreet())
->setCity($shipping->getCity())
->setCountry_id($shipping->getCountryId())
->setRegion($shipping->getRegion())
->setRegion_id($shipping->getRegionId())
->setPostcode($shipping->getPostcode())
->setTelephone($shipping->getTelephone())
->setFax($shipping->getFax());

$this->_order->setShippingAddress($shippingAddress)
->setShippingMethod($this->_shippingMethod);

$orderPayment = Mage::getModel('sales/order_payment')
->setStoreId($this->_storeId)
->setCustomerPaymentId(0)
->setMethod($this->_paymentMethod)
->setPoNumber(' – ');

$this->_order->setPayment($orderPayment);

$this->_addProducts($products);

$this->_order->setSubtotal($this->_subTotal)
->setBaseSubtotal($this->_subTotal)
->setGrandTotal($this->_subTotal)
->setBaseGrandTotal($this->_subTotal);

$transaction->addObject($this->_order);
$transaction->addCommitCallback(array($this->_order, 'place'));
$transaction->addCommitCallback(array($this->_order, 'save'));
$transaction->save();
}

protected function _addProducts($products)
{
$this->_subTotal = 0;

foreach ($products as $productRequest) {
if ($productRequest['product'] == 'rand') {

$productsCollection = Mage::getResourceModel('catalog/product_collection');

$productsCollection->addFieldToFilter('type_id', 'simple');
Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($productsCollection);

$productsCollection->getSelect()
->order('RAND()')
->limit(rand($productRequest['min'], $productRequest['max']));

foreach ($productsCollection as $product) {
$this->_addProduct(array(
'product' => $product->getId(),
'qty' => rand(1, 2)
));
}
} else {
$this->_addProduct($productRequest);
}
}
}

protected function _addProduct($requestData)
{
$request = new Varien_Object();
$request->setData($requestData);

$product = Mage::getModel('catalog/product')->load($request['product']);

$cartCandidates = $product->getTypeInstance(true)
->prepareForCartAdvanced($request, $product);

if (is_string($cartCandidates)) {
throw new Exception($cartCandidates);
}

if (!is_array($cartCandidates)) {
$cartCandidates = array($cartCandidates);
}

$parentItem = null;
$errors = array();
$items = array();
foreach ($cartCandidates as $candidate) {
$item = $this->_productToOrderItem($candidate, $candidate->getCartQty());

$items[] = $item;

/**
* As parent item we should always use the item of first added product
*/
if (!$parentItem) {
$parentItem = $item;
}
if ($parentItem && $candidate->getParentProductId()) {
$item->setParentItem($parentItem);
}
/**
* We specify qty after we know about parent (for stock)
*/
$item->setQty($item->getQty() + $candidate->getCartQty());

// collect errors instead of throwing first one
if ($item->getHasError()) {
$message = $item->getMessage();
if (!in_array($message, $errors)) { // filter duplicate messages
$errors[] = $message;
}
}
}
if (!empty($errors)) {
Mage::throwException(implode("\n", $errors));
}

foreach ($items as $item) {
$this->_order->addItem($item);
}

return $items;
}

function _productToOrderItem(Mage_Catalog_Model_Product $product, $qty = 1)
{
$rowTotal = $product->getFinalPrice() * $qty;

$options = $product->getCustomOptions();

$optionsByCode = array();

foreach ($options as $option) {
$quoteOption = Mage::getModel('sales/quote_item_option')->setData($option->getData())
->setProduct($option->getProduct());

$optionsByCode[$quoteOption->getCode()] = $quoteOption;
}

$product->setCustomOptions($optionsByCode);

$options = $product->getTypeInstance(true)->getOrderOptions($product);

$orderItem = Mage::getModel('sales/order_item')
->setStoreId($this->_storeId)
->setQuoteItemId(0)
->setQuoteParentItemId(NULL)
->setProductId($product->getId())
->setProductType($product->getTypeId())
->setQtyBackordered(NULL)
->setTotalQtyOrdered($product['rqty'])
->setQtyOrdered($product['qty'])
->setName($product->getName())
->setSku($product->getSku())
->setPrice($product->getFinalPrice())
->setBasePrice($product->getFinalPrice())
->setOriginalPrice($product->getFinalPrice())
->setRowTotal($rowTotal)
->setBaseRowTotal($rowTotal)
->setWeeeTaxApplied(serialize(array()))
->setBaseWeeeTaxDisposition(0)
->setWeeeTaxDisposition(0)
->setBaseWeeeTaxRowDisposition(0)
->setWeeeTaxRowDisposition(0)
->setBaseWeeeTaxAppliedAmount(0)
->setBaseWeeeTaxAppliedRowAmount(0)
->setWeeeTaxAppliedAmount(0)
->setWeeeTaxAppliedRowAmount(0)
->setProductOptions($options);

$this->_subTotal += $rowTotal;

return $orderItem;
}
}

然后你可以从 Controller 调用它:

    $orderGenerator = Mage::getModel('app/ordercreate');

$orderGenerator->createOrder(array(
array(
'product' => 41, //product id
'qty' => 1
)
));

就是这样。您可以使 product => 41 动态而不是静态。这是你的选择。

关于php - magento 模型检索错误而不是对象 - 以编程方式创建订单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31434922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com