results = $results; $this->appendColumns = $columnDef['append']; $this->editColumns = $columnDef['edit']; $this->excessColumns = $columnDef['excess']; $this->onlyColumns = $columnDef['only']; $this->escapeColumns = $columnDef['escape']; $this->includeIndex = $columnDef['index']; $this->rawColumns = $columnDef['raw']; $this->templates = $templates; $this->start = $start; } /** * Process data to output on browser. * * @param bool $object * @return array */ public function process($object = false) { $this->output = []; $this->indexColumn = config('datatables.index_column', 'DT_Row_Index'); foreach ($this->results as $row) { $data = Helper::convertToArray($row); $value = $this->addColumns($data, $row); $value = $this->editColumns($value, $row); $value = $this->setupRowVariables($value, $row); $value = $this->selectOnlyNeededColumns($value); $value = $this->removeExcessColumns($value); $value = $this->addIndexColumn($value); $value = $this->escapeRow($value); $this->output[] = $object ? $value : $this->flatten($value); } return $this->output; } /** * Process add columns. * * @param mixed $data * @param mixed $row * @return array */ protected function addColumns($data, $row) { foreach ($this->appendColumns as $key => $value) { $value['content'] = Helper::compileContent($value['content'], $data, $row, $this->shouldEscapeColumn($key)); $data = Helper::includeInArray($value, $data); } return $data; } /** * Process add index column. * * @param mixed $data * @return array */ protected function addIndexColumn($data) { if ($this->includeIndex) { $data[$this->indexColumn] = ++$this->start; } return $data; } /** * Process edit columns. * * @param mixed $data * @param mixed $row * @return array */ protected function editColumns($data, $row) { foreach ($this->editColumns as $key => $value) { $value['content'] = Helper::compileContent($value['content'], $data, $row, $this->shouldEscapeColumn($key)); Arr::set($data, $value['name'], $value['content']); } return $data; } /** * Setup additional DT row variables. * * @param mixed $data * @param mixed $row * @return array */ protected function setupRowVariables($data, $row) { $processor = new RowProcessor($data, $row); return $processor ->rowValue('DT_RowId', $this->templates['DT_RowId']) ->rowValue('DT_RowClass', $this->templates['DT_RowClass']) ->rowData('DT_RowData', $this->templates['DT_RowData']) ->rowData('DT_RowAttr', $this->templates['DT_RowAttr']) ->getData(); } /** * Get only needed columns. * * @param array $data * @return array */ protected function selectOnlyNeededColumns(array $data) { if (is_null($this->onlyColumns)) { return $data; } else { return array_intersect_key($data, array_flip(array_merge($this->onlyColumns, $this->exceptions))); } } /** * Remove declared hidden columns. * * @param array $data * @return array */ protected function removeExcessColumns(array $data) { foreach ($this->excessColumns as $value) { unset($data[$value]); } return $data; } /** * Flatten array with exceptions. * * @param array $array * @return array */ public function flatten(array $array) { $return = []; foreach ($array as $key => $value) { if (in_array($key, $this->exceptions)) { $return[$key] = $value; } else { $return[] = $value; } } return $return; } /** * Escape all values of row. * * @param array $row * @return array */ protected function escapeRow(array $row) { $arrayDot = array_filter(array_dot($row)); foreach ($arrayDot as $key => $value) { if ($this->shouldEscapeColumn($key)) { $arrayDot[$key] = e($value); } } foreach ($arrayDot as $key => $value) { array_set($row, $key, $value); } return $row; } /** * Whether to escape column or no. * * @param string $key * @return bool */ protected function shouldEscapeColumn($key) { foreach ($this->appendColumns as $column) { if ($column['name'] == $key && is_string($column['content'])) { return false; } } foreach ($this->editColumns as $column) { if ($column['name'] == $key && is_string($column['content'])) { return false; } } if ($this->escapeColumns === '*') { return ! in_array($key, $this->rawColumns); // escape if is not a raw column } elseif (is_array($this->escapeColumns)) { return in_array($key, array_diff($this->escapeColumns, $this->rawColumns)); } else { return true; } } }