Your IP : 216.73.216.86


Current Path : /var/www/homesaver/www/bitrix/modules/ipol.sdek/classes/lib/Admin/Grid/
Upload File :
Current File : /var/www/homesaver/www/bitrix/modules/ipol.sdek/classes/lib/Admin/Grid/AbstractGrid.php

<?php
namespace Ipolh\SDEK\Admin\Grid;

use Ipolh\SDEK\Bitrix\Tools;

use Bitrix\Main\Grid;
use Bitrix\Main\UI\PageNavigation;

/**
 * Class AbstractGrid
 * @package Ipolh\SDEK\Admin\Grid
 */
abstract class AbstractGrid
{
    /**
     * @var array
     */
    protected $defaultButtons = [];

    /**
     * @var array
     */
    protected $buttons;

    /**
     * @var array
     */
    protected $defaultColumns = [];

    /**
     * @var array;
     */
    protected $columns;

    /**
     * @var array
     */
    protected $defaultRowActions = [];

    /**
     * @var array
     */
    protected $filterColumns;

    /**
     * @var array
     */
    protected $defaultFilterValues = [];

    /**
     * @var array
     */
    protected $filterValues;

    /**
     * @var array
     */
    protected $defaultSorting = [];

    /**
     * @var PageNavigation
     */
    protected $pagination;

    /**
     * @var integer
     */
    protected $defaultPageSize = 20;

    /**
     * @var boolean
     */
    protected $allowAllRecords = false;

    /**
     * Get grid ID
     *
     * @see component bitrix:main.ui.grid
     * @see component bitrix:main.ui.filter
     * @return string
     */
    public function getId()
    {
        return 'tbl_'. md5(static::class);
    }

    /**
     * Get filter ID
     *
     * @see component bitrix:main.ui.filter
     * @return string
     */
    public function getFilterId()
    {
        return $this->getId().'_filter';
    }

    /**
     * Get default buttons list
     *
     * @see component bitrix:ui.button.panel
     * @return array
     */
    public function getDefaultButtons()
    {
        return $this->defaultButtons;
    }

    /**
     * Get buttons list
     *
     * @see component bitrix:ui.button.panel
     * @return array
     */
    public function getButtons()
    {
        if (is_null($this->buttons)) {
            $this->buttons = [];

            foreach ($this->getDefaultButtons() as $index => $button) {
                $this->buttons[$index] = array_merge($button, ['CAPTION' => Tools::getMessage($button['CAPTION'])]);
            }
        }

        return $this->buttons;
    }

    /**
     * Set buttons list
     *
     * @param array $buttons
     * @return self
     */
    public function setButtons($buttons)
    {
        $this->buttons = $buttons;
        return $this;
    }

    /**
     * Add button
     *
     * @return self
     */
    public function addButton(array $button)
    {
        $this->getButtons();

        $this->buttons[] = $button;

        return $this;
    }

    /**
     * Get grid action panel controls
     *
     * @see component bitrix:main.ui.grid
     * @return array
     */
    public function getControls()
    {
        return [];
    }

    /**
     * Get default grid columns
     *
     * @return array
     */
    public function getDefaultColumns()
    {
        return $this->defaultColumns;
    }

    /**
     * Get grid columns
     *
     * @return array
     */
    public function getColumns()
    {
        if (is_null($this->columns)) {
            foreach ($this->getDefaultColumns() as $index => $column) {
                $this->columns[$index] = array_merge($column, ['name' => Tools::getMessage($column['name'])]);
            }
        }

        return $this->columns;
    }

    /**
     * Get filter columns
     *
     * @return array
     */
    public function getFilterColumns()
    {
        if (is_null($this->filterColumns)) {
            $this->filterColumns = [];

            $items = $this->getColumns();

            foreach ($items as $item) {
                if (!isset($item['filterable']) || $item['filterable'] === false) {
                    continue;
                }

                $this->filterColumns[] = array_merge(
                    $item,
                    is_array($item['editable'])   ? $item['editable']   : [],
                    is_array($item['filterable']) ? $item['filterable'] : []
                );
            }
        }

        return $this->filterColumns;
    }

    /**
     * Get default filter values
     *
     * @return array
     */
    public function getDefaultFilterValues()
    {
        return $this->defaultFilterValues;
    }

    /**
     * Set default filter values
     *
     * @param array $filterValues
     * @return self
     */
    public function setDefaultFilterValues(array $filterValues = [])
    {
        $this->defaultFilterValues = $filterValues;

        return $this;
    }

    /**
     * Get and prepare filter values from grid filter
     *
     * @return array
     */
    public function getFilterValues()
    {
        if (is_null($this->filterValues)) {
            $this->filterValues = [];

            $filter         = $this->getFilterColumns();
            $option         = new \Bitrix\Main\UI\Filter\Options($this->getFilterId());
            $data           = $option->getFilter([]);
            $quickSearchKey = "";

            foreach ($filter as $column) {
                $format = false;

                if (isset($column["quickSearch"]))
                    $quickSearchKey = $column["quickSearch"].$column["id"];

                /*if ($column['type'] == 'date')
                {
                    $format = 'YYYY-MM-DD';
                }
                elseif ($column['type'] == 'datetime')
                {
                    $format = 'YYYY-MM-DD HH:MI:SS';

                    if ($column['id'] == 'DATE_CREATE')
                    {
                        $format = 'DD.MM.YYYY HH:MI:SS';
                    }
                }
                */

                $columnName = substr($column['id'], 0, '9') == 'PROPERTY_' ? preg_replace('{(_VALUE|_ENUM_ID)$}', '', $column['id']) : $column['id'];
                $columnName = (in_array($column['filterable'], ['%', '?'], true)) ? $column['filterable'].$columnName : $columnName;

                if (isset($data[$column['id'] .'_from'])) {
                    $this->filterValues['>='. $columnName] = $format ? ConvertDateTime($data[$column['id'] .'_from'], $format) : $data[$column['id'] .'_from'];

                    /*if ($column['type'] == 'date')
                        $this->filterValues['>='. $columnName] .= ' 00:00:00';*/
                }
                if (isset($data[$column['id'] .'_to'])) {
                    $this->filterValues['<='. $columnName] = $format ? ConvertDateTime($data[$column['id'] .'_to'], $format) : $data[$column['id'] .'_to'];

                    /*if ($column['type'] == 'date')
                        $this->filterValues['<='. $columnName] .= ' 23:59:59';*/
                }
                if (isset($data[$column['id']])) {
                    $this->filterValues[$columnName] = $format ? ConvertDateTime($data[$column['id']], $format) : $data[$column['id']];
                }
            }

            if (isset($data['FIND']) && trim($data['FIND']) && $quickSearchKey)
                $this->filterValues[$quickSearchKey] = $data['FIND'];

            $this->filterValues = array_merge($this->filterValues, $this->getDefaultFilterValues());
        }

        return $this->filterValues;
    }

    /**
     * Get default sorting
     *
     * @return array
     */
    public function getDefaultSorting()
    {
        return $this->defaultSorting;
    }

    /**
     * Get sorting
     *
     * @return array
     */
    public function getSorting()
    {
        $options = new Grid\Options($this->getId());

        $data = $options->GetSorting([
            'sort' => $this->getDefaultSorting(),
            'vars' => ['by' => 'by', 'order' => 'order'],
        ]);

        return $data['sort'];
    }

    /**
     * Get pagination manager
     *
     * @see component bitrix:main.ui.grid
     * @return PageNavigation
     */
    public function getPagination()
    {
        if (is_null($this->pagination)) {
            $options = new Grid\Options($this->getId());
            $params  = $options->GetNavParams(['nPageSize' => $this->defaultPageSize]);

            $this->pagination = new PageNavigation($this->getId());
            $this->pagination->allowAllRecords($this->allowAllRecords)->setPageSize($params['nPageSize'])->initFromUri();
        }

        return $this->pagination;
    }

    /**
     * Get formatted rows for grid
     *
     * @see component bitrix:main.ui.grid
     * @return array
     */
    public function getRows()
    {
        $ret   = [];
        $items = $this->getRawData();

        foreach ($items as $key => $item) {
            $ret[$key] = $this->getRow($item);
        }

        return $ret;
    }

    /**
     * Get single data item in grid row format
     *
     * @param array $item
     * @return array
     */
    protected function getRow($item)
    {
        return [
            'data'            => $item,
            'columns'         => [],
            'actions'         => $this->getRowActions($item),
            'editable'        => true,
            'editableColumns' => [],
            'attrs'           => [],
            'columnClasses'   => [],
            'custom'          => [],
        ];
    }

    /**
     * Get default row actions available for single row
     *
     * @see getControls method for action panel actions
     * @see component bitrix:main.ui.grid
     * @return array
     */
    protected function getDefaultRowActions()
    {
        return $this->defaultRowActions;
    }

    /**
     * Get row actions available for single row
     *
     * @param array $item
     * @return array
     */
    protected function getRowActions($item)
    {
        $ret = [];

        $actions = $this->getDefaultRowActions();

        foreach ($actions as $index => $action) {
            $ret[$index] = array_merge($action, [
                'TEXT'    => Tools::getMessage($action['TEXT']),
                'LINK'    => str_replace('#ID#', $item['ID'], $action['LINK']),
                'ONCLICK' => str_replace('#ID#', $item['ID'], $action['ONCLICK']),
            ]);
        }

        return $ret;
    }

    /**
     * Get raw data used for creating grid rows
     *
     * @return array
     */
    abstract protected function getRawData();
}