0

I have created admin grit using ui component. I'm trying to implement grid actions.the grid lists out my form details. how add view action to the grid app/code/Dyode/Pricebeat/Controller/Adminhtml/Form/View.php

    <?php
 namespace Dyode\Pricebeat\Controller\Adminhtml\Form;

 class View extends \Dyode\Pricebeat\Controller\Adminhtml\Form
  {
/**
 * Backend session
 *
 * @var \Magento\Backend\Model\Session
 */
protected $backendSession;

/**
 * Page factory
 *
 * @var \Magento\Framework\View\Result\PageFactory
 */
protected $resultPageFactory;

/**
 * Result JSON factory
 *
 * @var \Magento\Framework\Controller\Result\JsonFactory
 */
protected $resultJsonFactory;

/**
 * constructor
 *
 * @param \Magento\Backend\Model\Session $backendSession
 * @param \Magento\Framework\View\Result\PageFactory $resultPageFactory
 * @param \Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory
 * @param \Dyode\Pricebeat\Model\FormFactory $formFactory
 * @param \Magento\Framework\Registry $registry
 * @param \Magento\Backend\Model\View\Result\RedirectFactory $resultRedirectFactory
 * @param \Magento\Backend\App\Action\Context $context
 */
public function __construct(
    \Magento\Backend\Model\Session $backendSession,
    \Magento\Framework\View\Result\PageFactory $resultPageFactory,
    \Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory,
    \Dyode\Pricebeat\Model\FormFactory $formFactory,
    \Magento\Framework\Registry $registry,
    \Magento\Backend\Model\View\Result\RedirectFactory $resultRedirectFactory,
    \Magento\Backend\App\Action\Context $context
)
{
    $this->backendSession    = $backendSession;
    $this->resultPageFactory = $resultPageFactory;
    $this->resultJsonFactory = $resultJsonFactory;
    parent::__construct($formFactory, $registry, $resultRedirectFactory, $context);
}

/**
 * is action allowed
 *
 * @return bool
 */
protected function _isAllowed()
{
    return $this->_authorization->isAllowed('Dyode_Pricebeat::form');
}

/**
 * @return \Magento\Backend\Model\View\Result\Page|\Magento\Backend\Model\View\Result\Redirect|\Magento\Framework\View\Result\Page
 */
public function execute()
{
    $id = $this->getRequest()->getParam('form_id');
    /** @var \Dyode\Pricebeat\Model\Form $form */
    $form = $this->initForm();
    /** @var \Magento\Backend\Model\View\Result\Page|\Magento\Framework\View\Result\Page $resultPage */
    $resultPage = $this->resultPageFactory->create();
    $resultPage->setActiveMenu('Dyode_Pricebeat::form');
    $resultPage->getConfig()->getTitle()->set(__('Pricebeat'));
    if ($id) {
        $form->load($id);
        if (!$form->getId()) {
            $this->messageManager->addError(__('This form no longer exists.'));
            $resultRedirect = $this->resultRedirectFactory->create();
            $resultRedirect->setPath(
                'dyode_pricebeat/*/view',
                [
                    'form_id' => $form->getId(),
                    '_current' => true
                ]
            );
            return $resultRedirect;
        }
    }

    $title = $form->getId() ? $form->getTitle() : __('Pricebeat');
    $resultPage->getConfig()->getTitle()->prepend($title);
    $data = $this->backendSession->getData('dyode_dyode_form_data', true);
    if (!empty($data)) {
        $form->setData($data);
    }

    return $resultPage;
}
}

enter image description here

app/code/Dyode/Pricebeat/view/adminhtml/layout/dyode_pricebeat_form_view.xml

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="admin-2columns-left" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd">
<body>
    <referenceContainer name="content">
        <block class="Dyode\Pricebeat\Block\Adminhtml\Form\Edit" name="dyode_pricebeat_form_view"/>
    </referenceContainer>
    <referenceContainer name="left">
        <block class="Dyode\Pricebeat\Block\Adminhtml\Form\Edit\Tabs" name="dyode_pricebeat_form_tabs">
            <block class="Dyode\Pricebeat\Block\Adminhtml\Form\Edit\Tab\Form" name="dyode_pricebeat_form_edit_tab_form"/>
            <action method="addTab">
                <argument name="name" xsi:type="string">form</argument>
                <argument name="block" xsi:type="string">dyode_pricebeat_form_view_tab_form</argument>
            </action>
        </block>
    </referenceContainer>
</body>
</page>

1 Answer 1

2

Please add this in your ui component File.

<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <columns name="sales_order_columns">
        <actionsColumn name="actions" class="<Vendor>\<ModuleName>\Ui\Component\Listing\Columns\<YourActions>">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="resizeEnabled" xsi:type="boolean">false</item>
                <item name="resizeDefaultWidth" xsi:type="string">120</item>
                <item name="indexField" xsi:type="string">faq_id</item>
            </item>
        </argument>
    </actionsColumn>
    </columns>
</listing>

After that make actions file at given path \\Ui\Component\Listing\Columns\. .php

<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
namespace <Vendor>\<ModuleName>\Ui\Component\Listing\Columns;

use Magento\Framework\View\Element\UiComponent\ContextInterface;
use Magento\Framework\View\Element\UiComponentFactory;
use Magento\Ui\Component\Listing\Columns\Column;
use Magento\Framework\UrlInterface;
/**
 * Description of ProductActions
 *
 * @author dharmendra
 */
class <YourActions> extends Column
{
    /**
     * @var UrlInterface
     */
    private $urlBuilder;

    /** Url Path */
    const URL_PATH_EDIT = '<your url here like>catalog/product/edit';
    const URL_PATH_VIEW = '<your url here like>catalog/product/view';

    public function __construct(
        ContextInterface $context,
        UiComponentFactory $uiComponentFactory,
        array $components = array(),
        UrlInterface $urlBuilder,
        array $data = array()) 
    {
        parent::__construct($context, $uiComponentFactory, $components, $data);
        $this->urlBuilder = $urlBuilder;
    }

    /**
     * Prepare Data Source
     *
     * @param array $dataSource
     * @return void
     */
    public function prepareDataSource(array $dataSource)
    {
        if (isset($dataSource['data']['items'])) {
            foreach ($dataSource['data']['items'] as & $item) {
                $name = $this->getData('name');
                if (isset($item['product_id'])) {
                    $item[$name]['edit'] = [
                        'href' => $this->urlBuilder->getUrl(self::URL_PATH_EDIT, ['product_id' => $item['product_id']]),
                        'label' => __('Edit')
                    ];
                    $item[$name]['delete'] = [
                        'href' => $this->urlBuilder->getUrl(self::URL_PATH_VIEW, ['product_id' => $item['product_id']]),
                        'label' => __('View')
                    ];
                }
            }
        }
        return $dataSource;
    }
}

Implement this you have to get action in your ui based grid.

Still you have any difficulty let me know.

11
  • I have already done with this. If i click view option it goes to a controler named view.php
    – Nismath vi
    Sep 19, 2018 at 7:23
  • Yes then you have to add your code over there for displaying the data. Sep 19, 2018 at 7:24
  • I'm confused about listing my data.i get the table id through the controller.
    – Nismath vi
    Sep 19, 2018 at 7:26
  • Please post your code so i will give update it Sep 19, 2018 at 7:28
  • can you check my question with updated code
    – Nismath vi
    Sep 19, 2018 at 7:30

Your Answer

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

Not the answer you're looking for? Browse other questions tagged or ask your own question.