11 / 01 / 2017 Developers

Własny widget grid w Magento 1.x

Jeśli potrzebujesz szybko i czytelnie wyświetlić dane w panelu administratora Magento, z pomocą przychodzi widget grid! Zaprezentuję krok po kroku proces implementacji tego rozwiązania, które nie tylko idealnie nadaje się do wyświetlania danych, ale również do ich zarządzania (dodawanie/usuwanie/edycja).

  • Deklaracja modułu
  • Dodanie odnośnika (tab) w panelu admina
  • Przygotowanie akcji kontrolera
  • Przygotowanie pliku xml widoku
  • Blok widget container
  • Blok widget grid

Deklaracja modułu

app\etc\modules\Xcoding_Grid.xml

    <?xml version="1.0"?>
    <!--
      ~    @category  Xcoding_Grid
      ~    @package   Xcoding_Grid
      ~    @author    X-Coding IT Studio (http://www.x-coding.pl/)
      -->
    <config>
        <modules>
            <Xcoding_Grid>
                <active>true</active>
                <codePool>local</codePool>
            </Xcoding_Grid>
        </modules>
    </config>

Dodanie odnośnika w panelu admina

app\code\local\Xcoding\Grid\etc\adminhtml.xml

     <!--
  ~    @category  Xcoding_Grid
  ~    @package   Xcoding_Grid
  ~    @author    X-Coding IT Studio (http://www.x-coding.pl/)
  -->
    <config>
        <menu>
            <xcoding_grid module="xcoding_grid" translate="title">
                <title>Testowy grid magento</title>
                <sort_order>999</sort_order>
                <action>adminhtml/mygrid/index</action>
            </xcoding_grid>
        </menu>
        <acl>
            <resources>
                <!-- prawa dostępu -->
                <all>
                    <title>Allow Everything</title>
                </all>
                <admin>
                    <children>
                        <xcoding_grid translate="title" module="xcoding_grid">
                            <title>Widok testowego grida</title>
                            <sort_order>1</sort_order>
                        </xcoding_grid>
                    </children>
                </admin>
            </resources>
        </acl>
    </config>

app\code\local\Xcoding\Grid\etc\config.xml

    <?xml version="1.0"?>

    <!--
      ~    @category  Xcoding_Grid
      ~    @package   Xcoding_Grid
      ~    @author    X-Coding IT Studio (http://www.x-coding.pl/)
      -->

    <config>
        <modules>
            <Xcoding_Grid>
                <version>0.0.1</version>
            </Xcoding_Grid>
        </modules>
        <global>
            <blocks>
                <!-- deklaracja bloku -->
                <xcoding_grid>
                    <class>Xcoding_Grid_Block</class>
                </xcoding_grid>
            </blocks>
            <helpers>
                <!-- deklaracja helpera -->
                <xcoding_grid>
                    <class>Xcoding_Grid_Helper</class>
                </xcoding_grid>
            </helpers>
        </global>
        <admin>
            <routers>
                <!-- deklaracja controllera admina korzystającego z adminhtml -->
                <adminhtml>
                    <args>
                        <modules>
                            <xcoding_grid before="Mage_Adminhtml">Xcoding_Grid_Adminhtml</xcoding_grid>
                        </modules>
                    </args>
                </adminhtml>
            </routers>
        </admin>
        <adminhtml>
            <layout>
                <updates>
                    <!-- deklaracja widoku admina xml -->
                    <xcoding_reports>
                        <file>xcoding/grid.xml</file>
                    </xcoding_reports>
                </updates>
            </layout>
        </adminhtml>
    </config>

 

Przy takiej konfiguracji można utworzyć rolę użytkownika z dostępem tylko do tego wybranego widoku.

Przygotowanie akcji kontrolera

app\code\local\Xcoding\Grid\controllers\Adminhtml\MygridController.php

       <?php
    /**
     *    @category  Xcoding_Grid
     *    @package   Xcoding_Grid
     *    @author    X-Coding IT Studio (http://www.x-coding.pl/)
     */

    class Xcoding_Grid_Adminhtml_MygridController extends Mage_Adminhtml_Controller_Action
    {
        /**
         * index/default action
         */
        public function indexAction()
        {
            $this->loadLayout();
            $this->renderLayout();
        }

        /**
         * ajax grid action
         */
        public function gridAction()
        {
            $this->loadLayout(false);
            $this->renderLayout();
        }

        /**
         * Check current user permission on resource and privilege
         *
         * @return  boolean
         */
        public function _isAllowed()
        {
            return Mage::getSingleton('admin/session')->isAllowed('xcoding_grid');
        }
    }

Przygotowanie widoku pliku XML

app\design\adminhtml\default\default\layout\xcoding\grid.xml

     <?xml version="1.0"?>
    <!--
      ~    @category  Xcoding_Grid
      ~    @package   Xcoding_Grid
      ~    @author    X-Coding IT Studio (http://www.x-coding.pl/)
      -->
    <layout>
        <adminhtml_mygrid_index>
            <reference name="content">
                <block type="xcoding_grid/adminhtml_test" name="test.container" />
            </reference>
        </adminhtml_mygrid_index>

        <adminhtml_mygrid_grid>
            <!-- przeładowanie form key -->
            <update handle="formkey" />
            <block type="xcoding_grid/adminhtml_mygrid_grid" name="adminhtml_mygrid.grid" output="toHtml" />
        </adminhtml_mygrid_grid>
    </layout>

Blok widget container

app\code\local\Xcoding\Grid\Block\Adminhtml\Test.php

     <?php
    /**
     *    @category  Xcoding_Grid
     *    @package   Xcoding_Grid
     *    @author    X-Coding IT Studio (http://www.x-coding.pl/)
     */
    class Xcoding_Grid_Block_Adminhtml_Test extends Mage_Adminhtml_Block_Widget_Grid_Container
    {
        /** @var string */
        protected $_blockGroup = 'xcoding_grid';

        /**
         * constructor.
         */
        public function __construct()
        {
            $this->_controller = 'adminhtml_mygrid';
            $this->_headerText = $this->__('Testowy grid');
            parent::__construct();
            $this->_removeButton('add');
        }
    }

Blok widget grid

app\code\local\Xcoding\Grid\Block\Adminhtml\Mygrid\Grid.php

      <?php
    /**
     *    @category  Xcoding_Grid
     *    @package   Xcoding_Grid
     *    @author    X-Coding IT Studio (http://www.x-coding.pl/)
     */
    class Xcoding_Grid_Block_Adminhtml_Mygrid_Grid extends Mage_Adminhtml_Block_Widget_Grid
    {
        /**
         * constructor.
         */
        public function __construct()
        {
            parent::__construct();
            // ustawiamy unikalne ID grida
            $this->setId('xcoding_grid');
            // ustawiamy domyslne sortowanie podając jako parametr nazwę kolumny (z metody _prepareColumns)
            $this->setDefaultSort('ID');
            // ustawiamy domyślne sortowanie
            $this->setDefaultDir('DESC');
            $this->setSaveParametersInSession(true);
            $this->setUseAjax(true);
        }

        /**
         * prepare collection
         *
         * @return $this
         */
        protected function _prepareCollection()
        {
            // w tej metodzie tworzymy i przypisujemy kolekcję, którą chcemy obsłużyć
            /** @var Mage_Catalog_Model_Resource_Product_Collection $collection */
            $collection = Mage::getResourceModel('catalog/product_collection');
            $collection->addAttributeToSelect('name');
            $this->setCollection($collection);

            return parent::_prepareCollection();
        }

        /**
         * prepare columns grid
         *
         * @return $this
         * @throws Exception
         */
        protected function _prepareColumns()
        {
            // dodajemy kolumnę ( Mage_Adminhtml_Block_Widget_Grid_Column )
            $this->addColumn('ID', array(
                'header'    => $this->__('ID'),
                'type' => 'number',    // typ danych
                'index' => 'entity_id' // nazwa pola z kolekcji - taka wartość odczytywana jest jako main_table.entity_id
            ));

            $this->addColumn('SKU', array(
                'header'    => $this->__('SKU'),
                'type' => 'text',
                'index' => 'sku'
            ));

            $this->addColumn('Name', array(
                'header'    => $this->__('Name'),
                'type' => 'text',
                'index' => 'name'
            ));

            return parent::_prepareColumns();
        }

        /**
         * get row url
         *
         * @param $item
         * @return string
         *
         */
        public function getRowUrl($item)
        {
            return $this->getUrl('*/catalog_product/edit', array('id' => $item->getId()));
        }

        /**
         * get grid url
         *
         * @return string
         */
        public function getGridUrl()
        {
            return $this->getUrl('*/*/grid', array('_current' => true));
        }
    }

Efekt końcowy

Tym szybkim sposobem otrzymaliśmy dynamiczny widok produktów. W razie potrzeby w każdym momencie w równie łatwy sposób dodając zaledwie kilka linii kodu możemy rozbudować nasz widok o kolejne funkcjonalności i kolumny do prezentacji danych.

FacebookTwitterGoogle+LinkedIn