<?php
namespace Lagdo\Polr\Admin\Ext\Datatables;
use JsonSerializable;
class Datatables implements JsonSerializable
{
/**
* The datatable data
* @var array
*/
protected $data;
/**
* The datatable draw option
* @var integer
*/
protected $draw;
/**
* The number of records in the datatable before filtering
* @var integer
*/
protected $recordsTotal;
/**
* The number of records in the datatable after filtering
* @var integer
*/
protected $recordsFiltered;
/**
* The datatable row attributes
* @var array
*/
protected $attrs;
/**
* The datatable columns
* @var array
*/
protected $columns;
/**
* The columns to add to the datatable
* @var array
*/
protected $add;
/**
* The columns to edit in the datatable
* @var array
*/
protected $edit;
/**
* The columns to hide in the datatable
* @var array
*/
protected $hide;
/**
* The datatable constructor
* @param array $data
* @param integer $total
* @param integer $draw
*/
public function __construct(array $data, $total, $draw = 0)
{
$this->data = $data;
$this->draw = $draw;
$this->recordsTotal = $total;
$this->recordsFiltered = count($data);
$this->columns = array();
$this->add = $this->edit = $this->hide = $this->attrs = array();
}
/**
* Set the datatable row attributes
* @param array $attrs
* @return \Lagdo\Polr\Admin\Ext\Datatables\Datatables
*/
public function attr(array $attrs)
{
$this->attrs = $attrs;
return $this;
}
/**
* Set the number of records in the datatable before filtering
* @param integer $total
* @return \Lagdo\Polr\Admin\Ext\Datatables\Datatables
*/
public function setTotal($total)
{
$this->recordsTotal = $total;
return $this;
}
/**
* Set the datatable columns
* @param array $columns
* @return \Lagdo\Polr\Admin\Ext\Datatables\Datatables
*/
public function setColumns(array $columns)
{
$this->columns = $columns;
return $this;
}
/**
* Add a column to the datatable
* @param string $newColumn
* @param Closure $closure
* @return \Lagdo\Polr\Admin\Ext\Datatables\Datatables
*/
public function add($newColumn, $closure)
{
$this->add[$newColumn] = $closure;
return $this;
}
/**
* Edit a column in the datatable
* @param string $column
* @param Closure $closure
* @return \Lagdo\Polr\Admin\Ext\Datatables\Datatables
*/
public function edit($column, $closure)
{
$this->edit[$column] = $closure;
return $this;
}
/**
* Escape columns in the datatable
* @param array $columns
* @return \Lagdo\Polr\Admin\Ext\Datatables\Datatables
*/
public function escape(array $columns)
{
foreach($columns as $column)
{
$this->edit($column, function($data) use($column) {
return addslashes($data->$column);
});
}
return $this;
}
/**
* Hide columns in the datatable
* @param array $columns
* @return \Lagdo\Polr\Admin\Ext\Datatables\Datatables
*/
public function hide($columns)
{
if(!is_array($columns))
{
$columns = func_get_args();
}
$columns = array_intersect($this->columns, $columns);
$this->hide = array_merge($this->hide, array_combine($columns, $columns));
return $this;
}
/**
* Convert the datatable to JSON
* @return StdClass
*/
public function jsonSerialize()
{
$tableData = [];
foreach($this->data as $row)
{
// New columns..
if(count($this->add) > 0)
{
foreach($this->add as $column => $closure)
{
$row->$column = $closure($row);
}
}
// Editing columns..
if(count($this->edit) > 0)
{
foreach($this->edit as $column => $closure)
{
if(isset($row->$column))
{
$row->$column = $closure($row);
}
}
}
// Hide unwanted columns from output
// $row = array_diff_key($row, $this->hide);
// Row attributes..
if(count($this->attrs) > 0)
{
$attrs = [];
foreach($this->attrs as $name => $column)
{
$attrs[$name] = (string)$row->$column;
}
$row->DT_RowAttr = (object)$attrs;
}
$tableData[] = $row;
}
return (object)[
'draw' => $this->draw,
'recordsTotal' => $this->recordsTotal,
'recordsFiltered' => $this->recordsFiltered,
'data' => $tableData
];
}
}
|