İçeriğe geç →

Php GridView Yapımı OOP & PHP7

GridView

Verileri bir tablo içerisinde göstermek için kullanabileceğimiz bir nesnedir.

STRUCTURE

Abstract Table Layout  :  Temel tablo elementinin tüm propertyleri Örn:  tbody , tr ,td vb. gibi const ları tutacağımız Soyut Class’ımız.

Core/Layout/Table Class  : Tablonun propertylerinin belirlendiği ve tablo oluşturma işlemlerinin yer aldığı sınıfımız.

Core/Layout/GridView Class  : Gridview’ı oluştururken kullanacağımız ve oluşum sırasında propertylerini belirleyeceğimiz en temel classımız.

GridView Properties  :

  •   type : Table : GridView tipi şimdilik sadece Table Class kabul ediyor. Fakat geliştirip Collections veya Obje kabul ettirebilirsiniz
  • dataSource : Datalarımız (Array Type’dır.)
  • th : Tablo elementinin sütun başlıkları
  • hiddenFields : Verilerinizdeki gizlemek istediğiniz sütun başlıkları null geçilebilir.

GİTHUB REPO : https://github.com/emexxRepo/GridViewPHP/

 

DATA Structure


Array ( [0] => Array ( [id] => 1 [username] => majorman [password] => $2y$10$cCBxupCD7xrptlu/eFXd2eLDwwyFbR6z6iNdPGQl3f3RNi3uyk/1u [email] => test@yandex.com [fname] => murat [lname] => topuz [acl] => [deleted] => 0 ) [1] => Array ( [id] => 2 [username] => test [password] => test2 [email] => test3@yandex.com [fname] => testname [lname] => testname2 [acl] => fqwfwqfwq [deleted] => 0 ) )

Şimdi Gelelim Koda 🙂

Core\Layout\TableLayout.php
<?php
namespace Core\Layout;
abstract class TableLayout
{
    //SET TABLE ELEMENT PROPERTIES
    protected const TABLE = '';
    protected const TR = '<tr>';
    protected const TD = '<td>';
    protected const TH = '<th>';
    protected const TBODY = '<tbody>';
    protected const THEAD = '<thead>';

    protected const ENDTABLE = '</table>';
    protected const ENDTR = '</tr>';
    protected const ENDTD = '</td>';
    protected const ENDTH = '</th>';
    protected const ENDTBODY = '</tbody>';
    protected const ENDTHEAD = '</thead>';

    protected $height = 0;
    protected $width  = 0;
    protected $border = 1;

}
Core\Layout\Table.php 

<?php

namespace Core\Layout;
require_once 'TableLayout.php';

class Table extends TableLayout
{

    protected $table = '';
    protected $ths = array();
    protected $tds = array();
    protected $trs = array();
    protected $hiddenFields = array();

    /**
     * Table constructor.
     * @param int $width
     * @param int $height
     * @param int $border
     */

    public function __construct(int $width = 500, int $height = 500, int $border = 1)
    {
        $this->width = $width;
        $this->border = $border;
        $this->height = $height;
        $this->table = parent::TABLE;
    }

    /**
     * @param array $dataSource
     * @param bool $thead
     * @param array $ths
     */

    // Tabloyu oluşturduğumuz method
    public function build(array $dataSource = array(), array $hiddenFields = array(), $thead = false, $ths = array())
    {
        $this->hiddenFields = $hiddenFields;
        $this->startTable();
        if ($thead === true && !empty($ths)) {

            $this->setThead();

            foreach ($ths as $th => $value) {
                $this->setTh($value);
            }

            $this->endThead();

        }

        if (!empty($dataSource)) {

            $this->setTbody();

            foreach ($dataSource as $data => $value) {
                if (is_array($value) && !empty($value)) {
                    $this->setTr();
                    $newValue = $this->isHiddenValue($value);
                    foreach ($newValue as $key => $val) {
                        $this->setTd($val);

                    }
                    $this->endTr();
                }
            }

            $this->endTbody();
        }

        $this->endTable();

        return $this->table;
    }

    private function setThead(): void
    {
        $this->table .= parent::THEAD;
    }

    private function endThead(): void
    {
        $this->table .= parent::ENDTHEAD;
    }

    private function setTh(string $name): void
    {
        $this->ths[] = $name;
        $this->table .= parent::TH . $name . parent::ENDTD;
    }

    private function setTbody(): void
    {
        $this->table .= parent::TBODY;
    }

    private function endTbody(): void
    {
        $this->table .= parent::ENDTBODY;
    }

    private function setTr(): void
    {
        $this->table .= parent::TR;
    }

    private function endTr(): void
    {
        $this->table .= parent::ENDTR;
    }

    private function setTd(string $name): void
    {
        $this->tds[] = $name;
        $this->table .= parent::TD . $name . parent::ENDTD;
    }

    private function startTable(): void
    {
        $this->table .= '<table width = "' . $this->width . '" height = "' . $this->height . '" border="' . $this->border . '">';
    }

    private function endTable(): void
    {
        $this->table .= parent::ENDTABLE;
    }

    private function isHiddenValue(array $array): array
    {
        if (!empty($this->hiddenFields)) {

            foreach ($this->hiddenFields as $key => $val) {
                if (array_key_exists($val, $array)) {
                    unset($array[$val]);
                }
            }
        }

        return $array;
    }
}

Core\Layout\Grid.php

<?php

namespace Core\Layout;
require 'Table.php';

use ArgumentCountError;
use InvalidArgumentException;
use Core\Layout\TableLayout;

final class Grid
{
    private static $table;
    private static $properties = array();
    private static $hiddenFields = array();
    private function __construct()
    {

    }

    public static function view(array $properties = array())
    {

        static::setProperty($properties);
        static::checkType($properties);
        static::setType($properties['type']);
        return static::$table->build(static::$properties['dataSource'],static::$properties['hiddenFields'],true, static::$properties['th']);
    }

    private static function setType(Table $table): void
    {
        static::$table = $table;
    }

    private static function setProperty(array $properties): void
    {
        static::$properties = $properties;
    }

    private static function checkType(array $properties): void
    {
        if (count(static::$properties) === 0) {
            throw new ArgumentCountError("Please Set Property");
            die();
        }

        if (!isset(static::$properties['type']) && !static::$properties['type'] instanceof TableLayout) {
            throw new InvalidArgumentException("type must be instace of TableLayout");
            die();
        }

        // dataSource property array değilse ve hiç tanımlanmamışsa
        if (!isset(static::$properties['dataSource']) && !is_array($properties['dataSource'])) {
            throw new InvalidArgumentException("Invalid Data Type");
            die();
        }

        // dataSource property array değilse ve hiç tanımlanmamışsa
        if (!isset(static::$properties['th']) && !is_array($properties['th'])) {
            throw new InvalidArgumentException("Please Set th property => []");
            die();
        }

        if (empty(static::$properties['hiddenFields'])){
            static::$properties['hiddenFields'] = array();
        }

    }

}

Ve GridView’ımızı oluşturacağımız index.php

<?php
namespace Test;

require_once 'Core' . DIRECTORY_SEPARATOR . 'Layout' . DIRECTORY_SEPARATOR . 'Grid.php';
use Core\Layout\Grid;
use Core\Layout\Table;

try{
    $dbConnect = new \PDO("mysql:host=localhost;dbname=majormvc","root","123456");

}catch (\PDOException $e){
    echo $e->getMessage();
}

$dataSource = $dbConnect->query('SELECT * FROM users')->fetchAll(\PDO::FETCH_ASSOC);
print_r($dataSource);
echo Grid::view(
    [
        'type'          => new Table(600,300,1),
        'dataSource'    => $dataSource,
        'th'            => ['ID','Username','Password','Email','Fname','Lname'],
        'hiddenFields'   => ['deleted','acl'],
    ]
);

NOT : Bu Gridview’ın oluşturulmasında Yii 2.0 FrameWork GridView ve C# GridView’dan esinlenilmiştir.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Kategori: php

Yorumlar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir