| 
<?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
 ];
 }
 }
 
 |