Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

Data Table

Data table class for generate table with header, footer, data list, bulk actions, pagination.

Latest Stable Version License Total Downloads



I recommend you to install this library via Composer and use Composer autoload for easily include the files. If you are not using Composer, you have to manually include these files by yourself.
Please make sure that the path to files are correct.

require_once '/path/to/Rundiz/DataTable/DataTable.php';
require_once '/path/to/Rundiz/DataTable/Database.php';
if (!class_exists('\\Rundiz\\Pagination\\Pagination')) {
    require_once '/path/to/Pagination.php';

Import mysql_db_test_dummy_data.sql to MySQL or MariaDB (for test only).


You have to provide db configuration to the class to read, update, delete the data.

$db['dsn'] = 'mysql:dbname=YOUR_DB_NAME;host=localhost;port=3306;charset=UTF8';
$db['username'] = 'admin';
$db['password'] = 'pass';
$db['options'] = [
$db['tablename'] = 'people_dummy_data';


You have to override the Rundiz\DataTable\DataTable by extends to sub class. Open the parent class or the [API document] ( to see more about methods and properties that are able to override.
Assume that the sub class file name is PeopleDummyDataTable.php.

class PeopleDummyDataTable extends \Rundiz\DataTable\DataTable

     * @var string My table name.
    public $myTable;

     * {@inheritDoc}
    protected function columnDefault($row, $column_unique_name)
        switch ($column_unique_name) {
                if (isset($row->{$column_unique_name})) {
                    return $row->{$column_unique_name};
    }// columnDefault

     * Special column method for "name".
     * @param object $row Data from PDO in each row from fetchAll() method.
     * @return string Return column content. Use return, not echo.
    protected function columnName($row)
        return $row->first_name . ' ' . $row->last_name;
    }// columnName

     * {@inheritDoc}
    protected function getColumns()
        return [
            'name' => 'Full name',
            'email' => 'Email',
            'gender' => 'Gender',
            'ip_address' => 'IP Address',
    }// getColumns

     * {@inheritDoc}
    public function prepareData()
        if (!class_exists('\\Rundiz\\Pagination\\Pagination') || !is_object($this->Pagination)) {
            throw new \Exception('The class \\Rundiz\\Pagination\\Pagination is not exists, please install rundiz/pagination class.');

        $current_page = $this->getCurrentPage();

        $sql = 'SELECT COUNT(*) FROM `' . $this->myTable . '`';
        $stmt = $this->Database->PDO->prepare($sql);
        $total_items = $stmt->fetchColumn();

        // order (column) and sort (asc, desc)
        $order = 'id';
        if (isset($_GET[$this->orderQueryName])) {
            if (in_array($_GET[$this->orderQueryName], ['id', 'first_name', 'last_name', 'email', 'gender', 'ip_address'])) {
                $order = $_GET[$this->orderQueryName];
        $sort = 'ASC';
        if (isset($_GET[$this->sortQueryName])) {
            if (in_array(strtoupper($_GET[$this->sortQueryName]), ['ASC', 'DESC'])) {
                $sort = strtoupper($_GET[$this->sortQueryName]);

        $sql = str_replace('COUNT(*)', '*', $sql);
        $sql .= ' ORDER BY `' . $order . '` ' . $sort;
        $sql .= ' LIMIT ' . (($current_page - 1) * $this->itemsPerPage) . ', ' . $this->itemsPerPage;
        $stmt = $this->Database->PDO->prepare($sql);
        $items = $stmt->fetchAll();
        unset($order, $sort, $sql, $stmt);

        $this->Pagination->base_url = (isset($_SERVER['HTTPS']) ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] . '?' . $this->paginationQueryName . '=%PAGENUMBER%';

        // set total items found and data items for listing to the properties.
        $this->totalItems = $total_items;
        $this->dataItems = $items;
        unset($current_page, $items, $total_items);
    }// prepareData


Initialize the class

In the php file that will be display the data table, write this simple code.

include 'PeopleDummyDataTable.php';

$PDDTable = new PeopleDummyDataTable(['pdoconfig' => $db]);
$PDDTable->myTable = $db['tablename'];

The $db variable is in the configuration section. Set your database values there correctly and run.

Styles and scripts

The css and javascript is already in the tests/via-http folder. You can copy those files to use easily or customize to the way you want.

For more example, please look in tests folder.