0

Is there any method that can fetch data from external API ? Basically i have created a grid in admin page & in that grid i want to display the data from External API.

2 Answers 2

0

Should use uiComponent and provide a DataProvider which implements \Magento\Framework\View\Element\UiComponent\DataProvider\DataProviderInterface or extends \Magento\Ui\DataProvider\AbstractDataProvider.

There are example on the documentation: https://developer.adobe.com/commerce/frontend-core/ui-components/concepts/data-source/

0
  1. Create a Custom Module If you don’t have a custom module, create one.

Vendor/Module/registration.php:

<?php
 \Magento\Framework\Component\ComponentRegistrar::register(
 \Magento\Framework\Component\ComponentRegistrar::MODULE,
 'Vendor_Module',
  __DIR__
  );

etc/module.xml:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Vendor_Module" setup_version="1.0.0"/>
</config>

view/adminhtml/ui_component/vendor_list.xml

<?xml version="1.0" encoding="UTF-8"?>
<listing 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">vendor_list.vendor_list_data_source</item>
            <item name="deps" xsi:type="string">vendor_list.vendor_list_data_source</item>
        </item>
        <item name="spinner" xsi:type="string">vendor_list_records_columns</item>
    </argument>
    <dataSource name="vendor_list_data_source">
        <argument name="dataProvider" xsi:type="configurableObject">
            <argument name="class" xsi:type="string">Vendor\Module\Model\DataProvider</argument>
            <argument name="name" xsi:type="string">vendor_list_data_source</argument>
            <argument name="primaryFieldName" xsi:type="string">id</argument>
            <argument name="requestFieldName" xsi:type="string">id</argument>
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="component" xsi:type="string">
                        Magento_Ui/js/grid/provider
                    </item>
                    <item name="update_url" xsi:type="url" path="mui/index/render" />
                    <item name="storageConfig" xsi:type="array">
                        <item name="indexField" xsi:type="string">
                            id
                        </item>
                    </item>
                </item>
            </argument>
        </argument>
        <argument name="data" xsi:type="array">
            <item name="js_config" xsi:type="array">
                <item name="component" xsi:type="string">Magento_Ui/js/grid/provider</item>
            </item>
        </argument>
    </dataSource>
    <listingToolbar name="listing_top">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="template" xsi:type="string">ui/grid/toolbar</item>
                <item name="stickyTmpl" xsi:type="string">ui/grid/sticky/toolbar</item>
            </item>
        </argument>
        <bookmark name="bookmarks">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="storageConfig" xsi:type="array">
                        <item name="namespace" xsi:type="string">vendor_list</item>
                    </item>
                </item>
            </argument>
        </bookmark>
        <component name="columns_controls">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="columnsData" xsi:type="array">
                        <item name="provider" xsi:type="string">
                            vendor_list.vendor_list.vendor_list_records_columns
                        </item>
                    </item>
                    <item name="component" xsi:type="string">Magento_Ui/js/grid/controls/columns</item>
                    <item name="displayArea" xsi:type="string">dataGridActions</item>
                </item>
            </argument>
        </component>
        <filters name="listing_filters">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="columnsProvider" xsi:type="string">
                        vendor_list.vendor_list.vendor_list_records_columns
                    </item>
                    <item name="storageConfig" xsi:type="array">
                        <item name="provider" xsi:type="string">
                            vendor_list.vendor_list.listing_top.bookmarks
                        </item>
                        <item name="namespace" xsi:type="string">current.filters</item>
                    </item>
                    <item name="childDefaults" xsi:type="array">
                        <item name="provider" xsi:type="string">
                            vendor_list.vendor_list.listing_top.listing_filters
                        </item>
                        <item name="imports" xsi:type="array">
                            <item name="visible" xsi:type="string">
                                vendor_list.vendor_list.vendor_list_records_columns.${ $.index }:visible
                            </item>
                        </item>
                    </item>
                </item>
                <item name="observers" xsi:type="array">
                    <item name="column" xsi:type="string">column</item>
                </item>
            </argument>
        </filters>
        <paging name="listing_paging">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="storageConfig" xsi:type="array">
                        <item name="provider" xsi:type="string">
                            vendor_list.vendor_list.listing_top.bookmarks
                        </item>
                        <item name="namespace" xsi:type="string">current.paging</item>
                    </item>
                    <item name="selectProvider" xsi:type="string">
                        vendor_list.vendor_list.vendor_list_records_columns.ids
                    </item>
                </item>
            </argument>
        </paging>
    </listingToolbar>
    <columns name="vendor_list_records_columns">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="storageConfig" xsi:type="array">
                    <item name="provider" xsi:type="string">
                        vendor_list.vendor_list.listing_top.bookmarks
                    </item>
                    <item name="namespace" xsi:type="string">current</item>
                </item>
                <item name="editorConfig" xsi:type="array">
                    <item name="selectProvider" xsi:type="string">
                        vendor_list.vendor_list.vendor_list_records_columns.ids
                    </item>
                    <item name="enabled" xsi:type="boolean">true</item>
                    <item name="indexField" xsi:type="string">id</item>
                    <item name="clientConfig" xsi:type="array">
                        <item name="saveUrl" xsi:type="url" path="pbvreview/productreview/inlineEdit" />
                        <item name="validateBeforeSave" xsi:type="boolean">false</item>
                    </item>
                </item>
                <item name="childDefaults" xsi:type="array">
                    <item name="fieldAction" xsi:type="array">
                        <item name="provider" xsi:type="string">
                            vendor_list.vendor_list.dm_product_review_columns_editor
                        </item>
                        <item name="target" xsi:type="string">startEdit</item>
                        <item name="params" xsi:type="array">
                            <item name="0" xsi:type="string">${ $.$data.rowIndex }</item>
                            <item name="1" xsi:type="boolean">true</item>
                        </item>
                    </item>
                    <item name="storageConfig" xsi:type="array">
                        <item name="provider" xsi:type="string">
                            vendor_list.vendor_list.listing_top.bookmarks
                        </item>
                        <item name="root" xsi:type="string">columns.${ $.index }</item>
                        <item name="namespace" xsi:type="string">current.${ $.storageConfig.root}</item>
                    </item>
                </item>
            </item>
        </argument>
        <selectionsColumn name="ids">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="resizeEnabled" xsi:type="boolean">true</item>
                    <item name="resizeDefaultWidth" xsi:type="string">1</item>
                    <item name="indexField" xsi:type="string">id</item>
                    <item name="sortOrder" xsi:type="string">10</item>
                </item>
            </argument>
        </selectionsColumn>
        <column name="id">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">Consent ID</item>
                    <item name="sortOrder" xsi:type="number">20</item>
                </item>
            </argument>
        </column>
        <column name="email">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="filter" xsi:type="string">text</item>
                    <item name="label" xsi:type="string" translate="true">Email</item>
                    <item name="sortOrder" xsi:type="number">30</item>
                </item>
            </argument>
        </column>
    </columns>
    <container name="sticky">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="component" xsi:type="string">Magento_Ui/js/grid/sticky/sticky</item>
                <item name="toolbarProvider" xsi:type="string">
                    vendor_list.vendor_list.listing_top
                </item>
                <item name="listingProvider" xsi:type="string">
                    vendor_list.vendor_list.vendor_list_records_columns
                </item>
            </item>
        </argument>
    </container>
</listing>

Vendor\Module\Model\DataProvider.php

<?php

namespace Vendor\Module\Model;

use Magento\Framework\App\RequestInterface;
use Magento\Framework\App\Request\DataPersistorInterface;
use Magento\Framework\HTTP\Client\Curl;

class DataProvider extends \Magento\Ui\DataProvider\AbstractDataProvider
{

    protected $loadedData;
    protected $request;
    protected $dataPersistor;
    protected $curl;

    public function __construct(
        $name,
        $primaryFieldName,
        $requestFieldName,
        RequestInterface $request,
        DataPersistorInterface $dataPersistor,
        Curl $curl,
        array $meta = [],
        array $data = []
    ) {
        $this->request = $request;
        $this->dataPersistor = $dataPersistor;
        $this->curl = $curl;
        parent::__construct($name, $primaryFieldName, $requestFieldName, $meta, $data);
    }

    public function getData()
    {
        $id = $this->request->getParam('id');
        $this->dataPersistor->set('id', $id);
        if (isset($this->loadedData)) {
            return $this->loadedData;
        }

        //filter and pagination logic
        $pagesize = isset($this->request->getParam('paging')['pageSize']) ? $this->request->getParam('paging')['pageSize'] : 20;
        $pageCurrent = isset($this->request->getParam('paging')['current']) ? $this->request->getParam('paging')['current'] : 1;

        $filters = $this->request->getParam('filters', []);
        $emailFieldValue = "";
        if (isset($filters['email'])) {
            $emailFieldValue = $filters['email'];
        }

        //call your external api endpoint here rest or graphql

        $url = 'https://externalurl.com';
        // GraphQL query
        $query = <<<GRAPHQL
        query usersHistory {
            usersHistory(p: $pageCurrent, l: $pagesize, email: "$emailFieldValue") {
                status
                message
                total_size
                items {
                    id
                    email
                } 
            }
        }
        GRAPHQL;

        try {
            $payload = json_encode(['query' => $query]);
            // Set headers
            $headers = [
                'Content-Type' => 'application/json',
            ];
            // Send request
            $this->curl->setHeaders($headers);
            $this->curl->post($url, $payload);

            // Get response
            $response = $this->curl->getBody();
            $responseData = json_decode($response, true);

            if ($responseData['data']['usersHistory']['status'] == 200) {
                $this->loadedData['items'] = $responseData['data']['usersHistory']['items'] ?? [];
                $this->loadedData['totalRecords'] = $responseData['data']['usersHistory']['total_size'];
            }

        } catch (\Exception $e) {

        }
        return $this->loadedData;
    }

    public function setLimit($offset, $size)
    {
    }

    public function addOrder($field, $direction)
    {
    }

    public function addFilter(\Magento\Framework\Api\Filter $filter)
    {
    }
}

Add required files to create the UI component grid only check my files of UI grid XML file and DataProvider how I integrated API and pass to grid collection.

I hope that will work for you

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.