Magento 2:如何创建自定义的ui_component表单以通过ajax提交数据

问题描述:

我试图创建一个自定义的ui_component表单来通过前端的ajax提交数据。但它没有出现。Magento 2:如何创建自定义的ui_component表单以通过ajax提交数据

这是我得到的错误。

Fatal error: Method Magento\Ui\TemplateEngine\Xhtml\Result::__toString() must not throw an exception, caught Error: Call to a member function addFieldToFilter() on null in /var/www/vendor/magento/module-ui/Component/Wrapper/UiComponent.php on line 0

这是我的UI组件表格

<?xml version="1.0" encoding="UTF-8"?> 
<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd"> 
    <argument name="data" xsi:type="array"> 
     <item name="js_config" xsi:type="array"> 
      <item name="provider" xsi:type="string">rentalshipping_form.rentalshipping_form_data_source</item> 
      <item name="deps" xsi:type="string">rentalshipping_form.rentalshipping_form_data_source</item> 
     </item> 
     <item name="label" xsi:type="string" translate="true">Employee Information</item> 
     <item name="config" xsi:type="array"> 
      <item name="dataScope" xsi:type="string">data</item> 
      <item name="namespace" xsi:type="string">rentalshipping_form</item> 
     </item> 
     <item name="template" xsi:type="string">templates/form/collapsible</item> 
    </argument> 
    <dataSource name="rentalshipping_form_data_source"> 
     <argument name="dataProvider" xsi:type="configurableObject"> 
      <argument name="class" xsi:type="string">SalesIgniter\RentalShipping\Model\RentalShippingFromProvider</argument> 
      <argument name="name" xsi:type="string">rentalshipping_form_data_source</argument> 
      <argument name="primaryFieldName" xsi:type="string">id</argument> 
      <argument name="requestFieldName" xsi:type="string">id</argument> 
     </argument> 
     <argument name="data" xsi:type="array"> 
      <item name="js_config" xsi:type="array"> 
       <item name="component" xsi:type="string">Magento_Ui/js/form/provider</item> 
      </item> 
     </argument> 
    </dataSource> 
    <fieldset name="employee_details"> 
     <argument name="data" xsi:type="array"> 
      <item name="config" xsi:type="array"> 
       <item name="collapsible" xsi:type="boolean">true</item> 
       <item name="label" xsi:type="string" translate="true">Employee Details</item> 
       <item name="sortOrder" xsi:type="number">20</item> 
      </item> 
     </argument> 
     <field name="employee_id"> 
      <argument name="data" xsi:type="array"> 
       <item name="config" xsi:type="array"> 
        <item name="dataType" xsi:type="string">text</item> 
        <item name="label" xsi:type="string" translate="true">Employee Id</item> 
        <item name="formElement" xsi:type="string">input</item> 
        <item name="source" xsi:type="string">employee</item> 
        <item name="dataScope" xsi:type="string">employee_id</item> 
       </item> 
      </argument> 
     </field> 
     <field name="employee_name"> 
      <argument name="data" xsi:type="array"> 
       <item name="config" xsi:type="array"> 
        <item name="dataType" xsi:type="string">text</item> 
        <item name="label" xsi:type="string" translate="true">Employee Name</item> 
        <item name="formElement" xsi:type="string">input</item> 
        <item name="source" xsi:type="string">employee</item> 
        <item name="dataScope" xsi:type="string">employee_name</item> 
       </item> 
      </argument> 
     </field> 
     <field name="employee_salary"> 
      <argument name="data" xsi:type="array"> 
       <item name="config" xsi:type="array"> 
        <item name="dataType" xsi:type="string">text</item> 
        <item name="label" xsi:type="string" translate="true">Employee Salary</item> 
        <item name="formElement" xsi:type="string">input</item> 
        <item name="source" xsi:type="string">employee</item> 
        <item name="dataScope" xsi:type="string">employee_salary</item> 
       </item> 
      </argument> 
     </field> 
     <field name="employee_address"> 
      <argument name="data" xsi:type="array"> 
       <item name="config" xsi:type="array"> 
        <item name="dataType" xsi:type="string">text</item> 
        <item name="label" xsi:type="string" translate="true">Employee Address</item> 
        <item name="formElement" xsi:type="string">textarea</item> 
        <item name="source" xsi:type="string">employee</item> 
        <item name="dataScope" xsi:type="string">employee_address</item> 
       </item> 
      </argument> 
     </field> 
    </fieldset> 
</form> 

这是我DataProvider类:

<?php 

namespace SalesIgniter\RentalShipping\Model; 

class RentalShippingFromProvider extends \Magento\Ui\DataProvider\AbstractDataProvider 
{ 
    /** 
    * @var \Magento\Framework\Registry 
    */ 
    protected $_coreRegistry; 

    /** 
    * @var \Magento\Catalog\Model\Product|null 
    */ 
    protected $_product = null; 

    /** 
    * @var \SalesIgniter\RentalShipping\Helper\ShipmentConfig 
    */ 
    protected $_shipmentConfig; 

    /** 
    * @var TurnoverByShipment 
    */ 
    protected $_rshippingModel; 

    /** 
    * RentalShippingFromProvider constructor. 
    * @param \Magento\Framework\Registry $coreRegistry 
    * @param \SalesIgniter\RentalShipping\Helper\ShipmentConfig $shipmentConfig 
    * @param TurnoverByShipment $rshippingModel 
    * @param string $name 
    * @param string $primaryFieldName 
    * @param string $requestFieldName 
    * @param array $meta 
    * @param array $data 
    */ 
    public function __construct(
     \Magento\Framework\Registry $coreRegistry, 
     \SalesIgniter\RentalShipping\Helper\ShipmentConfig $shipmentConfig, 
     TurnoverByShipment $rshippingModel, 
     $name, 
     $primaryFieldName, 
     $requestFieldName, 
     array $meta = [], 
     array $data = [] 
    ) { 
     $this->_coreRegistry = $coreRegistry; 
     $this->_shipmentConfig = $shipmentConfig; 
     $this->_rshippingModel = $rshippingModel; 
     parent::__construct($name, $primaryFieldName, $requestFieldName, $meta, $data); 
    } 

    /** 
    * Get data 
    * 
    * @return array 
    */ 
    public function getData() 
    { 
     return []; 
    } 
} 
+0

这是否解决了? :) – ThisGuyHasTwoThumbs

+0

我解决不了,所以我走另一条路:) – thanhdv2811

+0

啊不用担心:)祝你有美好的一天! :d – ThisGuyHasTwoThumbs

我遇到了这个问题。从我所看到的您的数据提供者类中缺少$ this-> collection字段。例如,你可以在构造函数中

SalesIgniter\RentalShipping\Model\ResourceModel\TurnoverByShipment\CollectionFactory $collectionFactory 

添加CollectionFactory并初始化$这个 - >收集

$this->collection = $collectionFactory->create(); 

因此改变你的DataProvider类之后会是这样的:

<?php 
namespace SalesIgniter\RentalShipping\Model; 
class RentalShippingFromProvider extends \Magento\Ui\DataProvider\AbstractDataProvider { 
/** 
* @var \Magento\Framework\Registry 
*/ 
protected $_coreRegistry; 

/** 
* @var \Magento\Catalog\Model\Product|null 
*/ 
protected $_product = null; 

/** 
* @var \SalesIgniter\RentalShipping\Helper\ShipmentConfig 
*/ 
protected $_shipmentConfig; 

/** 
* @var TurnoverByShipment 
*/ 
protected $_rshippingModel; 

protected $collection; 

/** 
* RentalShippingFromProvider constructor. 
* @param \Magento\Framework\Registry $coreRegistry 
* @param \SalesIgniter\RentalShipping\Helper\ShipmentConfig $shipmentConfig 
* @param TurnoverByShipment $rshippingModel 
* @param string $name 
* @param string $primaryFieldName 
* @param string $requestFieldName 
* @param array $meta 
* @param array $data 
*/ 
public function __construct(
    \Magento\Framework\Registry $coreRegistry, 
    \SalesIgniter\RentalShipping\Helper\ShipmentConfig $shipmentConfig, 
    TurnoverByShipment $rshippingModel, 
    \SalesIgniter\RentalShipping\Model\ResourceModel\TurnoverByShipment\CollectionFactory $collectionFactory 
    $name, 
    $primaryFieldName, 
    $requestFieldName, 
    array $meta = [], 
    array $data = [] 
) { 
    $this->_coreRegistry = $coreRegistry; 
    $this->_shipmentConfig = $shipmentConfig; 
    $this->_rshippingModel = $rshippingModel; 
    $this->collection = $collectionFactory->create(); 
    parent::__construct($name, $primaryFieldName, $requestFieldName, $meta, $data); 
} 

/** 
* Get data 
* 
* @return array 
*/ 
public function getData() 
{ 
    return []; 
} 

}