Sử dụng các giá trị âm cho số lượng sản phẩm trong Magento 2

wsoftpro
7/8/2019 4:24Phản hồi: 0
Sử dụng các giá trị âm cho số lượng sản phẩm trong Magento 2
Sử dụng các giá trị âm cho số lượng sản phẩm trong Magento 2

Wsoftpro


Aug 7 · 5 min read

Khi chúng tôi xử lý số lượng sản phẩm trong Magento 2 và nó nhỏ hơn 0, chúng tôi phải đối mặt với thử thách. Đôi khi chúng ta cần đặt hàng các sản phẩm trong các cửa hàng trực tuyến khi chúng không có sẵn tại thời điểm này. Những sản phẩm này tồn kho trong Magento 2 nhưng Thương gia đặt hàng chúng từ các nhà sản xuất và chủ hàng sau khi chúng tôi đặt hàng. Trong thương mại điện tử, chúng tôi gọi đây là đặt hàng ngược hoặc thả tàu. Trong trường hợp này, số lượng sản phẩm trong kho của cửa hàng trực tuyến có thể ít hơn 0. Tuy nhiên, các sản phẩm có sẵn để đặt hàng.

Magento 2 bao gồm chức năng này. Chúng tôi có thể bật hỗ trợ cho các giá trị trường Qty nhỏ hơn 0 trong Cấu hình quản lý kho. Nhưng có một bắt nhỏ. Nếu số lượng sản phẩm trong Magento 2 nhỏ hơn 0, quản trị viên cửa hàng trực tuyến không thể chỉnh sửa và lưu lại sản phẩm này. Lỗi sau sẽ xuất hiện trong trường Qty:

Please enter a valid number in this field.
Bạn có thể tìm thấy mô tả về vấn đề này và giải pháp có thể cho vấn đề đó trên GitHub. Nhưng bạn nên biết rằng nó không hoạt động trên các phiên bản Magento mới nhất (được kiểm tra trên Magento 2.1.7). Chúng tôi sẽ đề cập đến lý do cho vấn đề này và giải pháp cho vấn đề dưới đây.
Các hình thức chỉnh sửa sản phẩm được thực hiện với thành phần UI. Nó rất hữu ích trong trường hợp chúng ta cần thực hiện tùy chỉnh với các mô-đun khác nhau. Ví dụ, biểu mẫu được xác nhận trong mô-đun Danh mục. Tuy nhiên, mô-đun Cataloginventory xử lý việc quản lý số lượng.

Module Cataloginventory cho số lượng sản phẩm trong Magento 2
Có thể thực hiện tùy chỉnh với các trình sửa đổi lớp. Chúng phù hợp với Magento \ Catalog \ Ui \ DataProvider \ Product \ Form \ Modifier \ Pool loại ảo với di.xml.
Nếu chúng ta sử dụng mô-đun Cataloginventory, công cụ sửa đổi này được yêu cầu theo cách sau:

<virtualType name="Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\Pool"> <arguments> <argument name="modifiers" xsi:type="array"> <item name="advancedInventory" xsi:type="array"> <item name="class" xsi:type="string">Magento\CatalogInventory\Ui\DataProvider\Product\Form\Modifier\AdvancedInventory</item> <item name="sortOrder" xsi:type="number">20</item> </item> </argument> </arguments> </virtualType>
Lớp sửa đổi sẽ triển khai \ Magento \ Ui \ DataProvider \ Modifier \ ModifierInterface, phải tạo hai phương thức: redirectData ($ data) và redirectMeta ($ meta).
Cấu hình thành phần được triển khai theo phương thức redirectMeta ($ meta), bao gồm cả phần đầu vào (javascript). Trong giải pháp từ GitHub, nhà phát triển khuyên nên tắt xác thực kỹ thuật số bằng một công cụ sửa đổi tùy chỉnh. Chúng ta có thể thực hiện nó theo cách sau:

<virtualType name="Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\Pool"> <arguments> <argument name="modifiers" xsi:type="array"> <item name="hf_quantity" xsi:type="array"> <item name="class" xsi:type="string">Web4pro\Defaultproduct\Ui\DataProvider\Product\Modifier\Quantity</item> <item name="sortOrder" xsi:type="number">10000000</item> </item> </argument> </arguments> </virtualType>class Quantity implements \Magento\Ui\DataProvider\Modifier\ModifierInterface { protected $arrayManager; public function __construct(\Magento\Framework\Stdlib\ArrayManager $arrayManager){ $this->arrayManager =$arrayManager; } public function modifyMeta(array $meta) { if ($path = $this->arrayManager->findPath('quantity_and_stock_status_qty', $meta, null, 'children')) { $this->arrayManager->remove( $path . '/children/qty/arguments/data/config/validation/validate-digits', $meta ); } if ($path = $this->arrayManager->findPath('advanced_inventory_modal', $meta)) { $meta = $this->arrayManager->merge( $path . '/children/stock_data/children/qty/arguments/data/config', $meta, ['validation' => ['validate-digits' => false]] ); } return $meta; } public function modifyData(array $data){ return $data; } }
Trong các phiên bản Magento mới nhất (Magento 2.1.7), mã này sẽ không hoạt động. Lý do là như sau. Magento có việc thực hiện hỗ trợ cho các số nguyên và phân số. Ví dụ: các phân số hoạt động trong trường hợp sản phẩm rơi — vận chuyển theo trọng lượng.

Giải pháp cho số lượng sản phẩm trong Magento 2

Quảng cáo


Thành phần Magento_CatalogInventory / js / thành phần / qty-validator-changer đã được triển khai để xác thực số lượng. Đây là mã của nó:

define([ 'Magento_Ui/js/form/element/abstract' ], function (Abstract) { 'use strict'; return Abstract.extend({ defaults: { valueUpdate: 'input' }, /** * Change validator */ handleChanges: function (value) { var isDigits = value !== 1; this.validation['validate-number'] = !isDigits; this.validation['validate-digits'] = isDigits; this.validation['less-than-equals-to'] = isDigits ? 99999999 : 99999999.9999; this.validate(); } }); });
Phương thức handleChanges kiểm tra giá trị cấu hình được truyền đến thành phần. Nếu số nguyên được sử dụng cho số lượng, chúng ta nên áp dụng trình xác nhận hợp lệ chữ số. Nếu chúng ta xử lý các phân số, chúng ta nên áp dụng số xác thực. Vì vậy, nó không đủ để tắt trình xác nhận hợp lệ các chữ số. Wsoftpro cũng nên đặt giá trị cần thiết của tham số của hàm handleChanges. Nó cho phép chúng ta tránh chọn trình xác nhận này bởi chức năng khác.
Chúng tôi mô tả tham số của hàm này trong Magento \ CatalogInventory \ Ui \ DataProvider \ Product \ Form \ Modifier \ AdvancedInventory modifier theo cách sau:

... 'imports' => [ 'handleChanges' => '${$.provider}:data.product.stock_data.is_qty_decimal', ], …. As we can see, we can get its values in both cases, whether we use integers or fractions for quantity. We set that in the configuration. So, let’s implement modifyMeta($meta) method in our modifier: public function modifyMeta(array $meta) { if ($path = $this->arrayManager->findPath('quantity_and_stock_status_qty', $meta, null, 'children')) { $this->arrayManager->remove( $path . '/children/qty/arguments/data/config/validation/validate-digits', $meta ); $this->arrayManager->merge($path . '/children/qty/arguments/data/config/imports',$meta, array('handleChanges'=>"1")); } if ($path = $this->arrayManager->findPath('advanced_inventory_modal', $meta)) { $meta = $this->arrayManager->merge( $path . '/children/stock_data/children/qty/arguments/data/config', $meta, ['validation' => ['validate-digits' => false],'imports'=>['handleChanges'=>'1']] ); } return $meta; }
Cuối cùng, chúng tôi có kết quả tiếp theo:

  • chúng tôi đã tắt trình xác nhận chữ số hợp lệ;
  • chúng tôi đặt ‘handChanges’ bằng 1.
Nó sẽ gây ra việc sử dụng trình xác nhận giao diện bên phải. Hơn nữa, nó sẽ không phá vỡ logic phụ trợ cho các sản phẩm được bán theo mặt hàng không theo trọng lượng. Chúng ta nên lặp lại điều này hai lần vì chúng ta có thể tìm thấy liên kết dưới trường Qty. Liên kết này mở cửa sổ bật lên advanced_inventory_modal.
Do đó, quản trị viên cửa hàng trực tuyến sẽ có thể lưu các sản phẩm có số lượng nhỏ hơn 0 mà không gặp vấn đề gì.
Trường hợp này là mới đối với Magento 2. Chúng tôi làm mọi thứ có thể để làm cho hành trình của bạn với Magento 2 dễ dàng hơn. Chúng tôi rất vui khi tiết kiệm thời gian của bạn. Nếu bạn có bất kỳ câu hỏi nào, hoặc bạn cần một số trợ giúp với Magento 2, liên hệ với chúng tôi . Chúng tôi sẽ chăm sóc dự án của bạn.

Quảng cáo



Các bạn có thể đọc thêm về kỹ thuật phát triển mã nguồn mở của chúng tôi tại đây.
Hãy cho chúng tôi một số tiếng vỗ tay, nếu câu chuyện này hữu ích cho bạn, và tất nhiên, đừng quên chia sẻ nó với bạn bè của bạn 😃
Chia sẻ

Xu hướng

Xu hướng

Bài mới









  • Chịu trách nhiệm nội dung: Trần Mạnh Hiệp
  • © 2024 Công ty Cổ phần MXH Tinh Tế
  • Địa chỉ: Số 70 Bà Huyện Thanh Quan, P. Võ Thị Sáu, Quận 3, TPHCM
  • Số điện thoại: 02822460095
  • MST: 0313255119
  • Giấy phép thiết lập MXH số 11/GP-BTTTT, Ký ngày: 08/01/2019