所有订单都具有与订单处理工作流程中的阶段相关联的订单状态。
状态描述了工作流程中订单的位置。默认情况下,Magento商店具有一组预定义的订单状态和订单状态设置。所有可用的订单状态都可以在管理面板下找到Stores -> Settings -> Order Status
。有时我们需要创建新的订单状态和状态。让我们弄清楚如何在Magento 2中以编程方式创建新的订单状态和状态。
订单状态存储在sales_order_status
数据库表中,而订单状态及其与状态的绑定在sales_order_status_state
表中定义。我们需要创建一个简单的设置脚本,以便添加新的订单状态和状态。
首先,我们需要创建一个新的自定义扩展,例如Atwix_OrderFlow
。在以下位置创建文件:registration.php
app/code/Atwix/OrderFlow
1 2 3 4 5 6 7 8 9 10 | <?php /* File: app/code/Atwix/OrderFlow/registration.php */ use \Magento\Framework\Component\ComponentRegistrar; ComponentRegistrar::register( ComponentRegistrar::MODULE, 'Atwix_OrderFlow', __DIR__ ); |
并使用以下代码在文件夹中创建配置文件:module.xml
app/code/Atwix/OrderFlow/etc
1 2 3 4 5 6 7 8 9 10 | <?xml version="1.0"?> <!-- File: app/code/Atwix/OrderFlow/etc/module.xml --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="Atwix_OrderFlow" setup_version="1.0.0"> <sequence> <module name="Magento_Sales"/> </sequence> </module> </config> |
安装数据类如下。例如,创建了两个类似的方法
- addNewOrderProcessingStatus
- addNewOrderStateAndStatus
第一种方法是将新订单状态添加到现有订单状态。第二个将创建新订单状态和新订单状态。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | <?php /* File: app/code/Atwix/OrderFlow/Setup/InstallData.php */ namespace Atwix\OrderFlow\Setup; use Exception; use Magento\Framework\Exception\AlreadyExistsException; use Magento\Framework\Setup\InstallDataInterface; use Magento\Framework\Setup\ModuleContextInterface; use Magento\Framework\Setup\ModuleDataSetupInterface; use Magento\Sales\Model\Order; use Magento\Sales\Model\Order\Status; use Magento\Sales\Model\Order\StatusFactory; use Magento\Sales\Model\ResourceModel\Order\Status as StatusResource; use Magento\Sales\Model\ResourceModel\Order\StatusFactory as StatusResourceFactory; /** * Class InstallData */ class InstallData implements InstallDataInterface { /** * Custom Processing Order-Status code */ const ORDER_STATUS_PROCESSING_FULFILLMENT_CODE = 'processing_custom'; /** * Custom Processing Order-Status label */ const ORDER_STATUS_PROCESSING_FULFILLMENT_LABEL = 'Processing Custom'; /** * Custom Order-State code */ const ORDER_STATE_CUSTOM_CODE = 'some_custom_state'; /** * Custom Order-Status code */ const ORDER_STATUS_CUSTOM_CODE = 'some_custom_status'; /** * Custom Order-Status label */ const ORDER_STATUS_CUSTOM_LABEL = 'Some Custom Status'; /** * Status Factory * * @var StatusFactory */ protected $statusFactory; /** * Status Resource Factory * * @var StatusResourceFactory */ protected $statusResourceFactory; /** * InstallData constructor * * @param StatusFactory $statusFactory * @param StatusResourceFactory $statusResourceFactory */ public function __construct( StatusFactory $statusFactory, StatusResourceFactory $statusResourceFactory ) { $this->statusFactory = $statusFactory; $this->statusResourceFactory = $statusResourceFactory; } /** * Installs data for a module * * @param ModuleDataSetupInterface $setup * @param ModuleContextInterface $context * * @return void * * @throws Exception */ public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context) { $this->addNewOrderProcessingStatus(); $this->addNewOrderStateAndStatus(); } /** * Create new order processing status and assign it to the existent state * * @return void * * @throws Exception */ protected function addNewOrderProcessingStatus() { /** @var StatusResource $statusResource */ $statusResource = $this->statusResourceFactory->create(); /** @var Status $status */ $status = $this->statusFactory->create(); $status->setData([ 'status' => self::ORDER_STATUS_PROCESSING_FULFILLMENT_CODE, 'label' => self::ORDER_STATUS_PROCESSING_FULFILLMENT_LABEL, ]); try { $statusResource->save($status); } catch (AlreadyExistsException $exception) { return; } $status->assignState(Order::STATE_PROCESSING, false, true); } /** * Create new custom order status and assign it to the new custom order state * * @return void * * @throws Exception */ protected function addNewOrderStateAndStatus() { /** @var StatusResource $statusResource */ $statusResource = $this->statusResourceFactory->create(); /** @var Status $status */ $status = $this->statusFactory->create(); $status->setData([ 'status' => self::ORDER_STATUS_CUSTOM_CODE, 'label' => self::ORDER_STATUS_CUSTOM_LABEL, ]); try { $statusResource->save($status); } catch (AlreadyExistsException $exception) { return; } $status->assignState(self::ORDER_STATE_CUSTOM_CODE, true, true); } } |
您可能已经注意到,每种方法都执行两个步骤。首先,它创建一个新的订单状态并保存它,因此它将出现在sales_order_status
数据库表中。然后,它通过向sales_order_status_state
数据库表添加新记录将创建的状态链接到订单状态。
订单状态没有单独的表,因此表state
列中的每个唯一值sales_order_status_state
都被视为单独的订单状态。
运行Setup Upgrade命令以激活模块并执行安装脚本:
1 | php bin / magento setup:upgrade |
现在您可以查看结果了Stores -> Settings -> Order Status
。