      1:   2:   3:   4:   5:   6:   7:   8:   9:  10:  11:  12:  13:  14:  15:  16:  17:  18:  19:  20:  21:  22:  23:  24:  25:  26:  27:  28:  29:  30:  31:  32:  33:  34:  35:  36:  37:  38:  39:  40:  41:  42:  43:  44:  45:  46:  47:  48:  49:  50:  51:  52:  53:  54:  55:  56:  57:  58:  59:  60:  61:  62:  63:  64:  65:  66:  67:  68:  69:  70:  71:  72:  73:  74:  75:  76:  77:  78:  79:  80:  81:  82:  83:  84:  85:  86:  87:  88:  89:  90:  91:  92:  93:  94:  95:  96:  97:  98:  99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109:

    <?php

    namespace WPGMZA;

    class DataTable extends AjaxTable
    {
        public function __construct($table_name, $ajax_parameters=null, $datatable_options=null)
        {
            AjaxTable::__construct($table_name, '/datatables/', $ajax_parameters);

            $this->element->setAttribute('data-wpgmza-datatable', 'true');

            if($datatable_options)
                $this->setDataTableOptions($datatable_options);

            $this->initTableDOM();
        }

        protected function getColumns()
        {
            throw new \Exception('Abstract function called');
        }

        protected function getOrderBy($input_params, $column_keys)
        {
            $orderBy = $column_keys[ (int)$input_params['order'][0]['column'] ];

            if(!empty($orderBy))
                return $orderBy;

            return "{$this->table_name}.id";
        }

        protected function getOrderDirection($input_params)
        {
            $orderDirection = $input_params['order'][0]['dir'] != 'asc' ? 'desc' : 'asc';

            if(!empty($orderDirection))
                return $orderDirection;

            return 'ASC';
        }

        public function getDataTableOptions()
        {
            return $this->getAttributeParams('data-wpgmza-datatable-options');
        }

        public function setDataTableOptions($options)
        {
            $this->setAttributeParams('data-wpgmza-datatable-options', $options);
        }

        public function data($input_params)
        {
            $result = AjaxTable::data($input_params);

            $result->draw = $input_params['draw'];

            return $result;
        }

        protected function initTableDOM()
        {
            $columns = $this->getColumns();

            $this->element->import('
                <table class="display">
                    <thead>
                    </thead>
                    <tfoot>
                    </tfoot>
                </table>
            ');

            $thead = $this->element->querySelector('thead');
            $tfoot = $this->element->querySelector('tfoot');

            foreach($columns as $name => $caption)
            {
                $th = $this->document->createElement('th');
                $th->setAttribute('data-wpgmza-column-name', $name);
                $th->appendText($caption);

                $thead->appendChild($th);
                $tfoot->appendChild($th->cloneNode(true));
            }
        }

        public function getRecords($input_params)
        {
            $result = AjaxTable::getRecords($input_params);

            $indexed_rows = array();
            $indexed_meta = array();

            foreach($result->data as $key => $obj)
            {
                $indexed_rows[$key] = array_values(
                    get_object_vars($obj)
                );
            }

            $result->data = $indexed_rows;

            return $result;
        }
    }