beforePrintCell = false; $this->beforePrint = function () { }; $this->json = $json; $this->data = json_decode($this->json, true); $this->baseUrl = $this->data['meta']['baseUrl'] ?? ''; $this->setActions(); } public function beginTable(): void { $paramsStr = $this->createParams($this->data['meta']['params']); $hook = $this->beforePrint; $this->html .= $hook(); $this->html .= ""; } public function beforePrint(\Closure $closure): void { $this->beforePrint = $closure; } public function createThead(): void { if (!isset($this->data['meta']['columns'])) { return; } $this->html .= ""; $this->html .= ""; foreach ($this->data['meta']['columns'] as $key => $column) { if ($this->is_fillable($key)) { $this->html .= ""; } } $this->html .= ""; } public function createTbody(): void { if ($this->data['data']) { $this->count = $this->data["meta"]["perPage"] * ($this->data['meta']["currentPage"] - 1); foreach ($this->data['data'] as $col) { $this->html .= ""; $this->count += 1; $this->html .= ''; foreach ($col as $key => $row) { if ($this->issetColumn($key) and $this->is_fillable($key)) { if ($this->beforePrintCell) { $hook = $this->beforePrintCell; $row = $hook($key, $row); } $this->html .= ""; } } $actions = $this->getActions($col["id"]); $this->html .= ""; } } } public function addAction(ActionColumn $actionColumn): void { $this->customActionsArray[] = $actionColumn; } private function setActions(): void { if (isset($this->data['meta']['actions'])) { foreach ($this->data['meta']['actions'] as $action) { switch ($action) { case 'view': $this->actionsArray[] = ViewActionColumn::class; break; case 'delete': $this->actionsArray[] = DeleteActionColumn::class; break; case 'edit': $this->actionsArray[] = EditActionColumn::class; break; } } } $this->actionsArray = array_merge($this->actionsArray, $this->customActionsArray); } private function issetColumn($column): bool { if (isset($this->data['meta']['columns'])) { foreach ($this->data['meta']['columns'] as $key => $currentColumn) { if ($key === $column) { return true; } } } return false; } private function is_fillable($column): bool { if (isset($this->data['meta']['fillable'])) { if (in_array($column, $this->data['meta']['fillable'])) { return true; } } else { return true; } return false; } private function getActions(int $id): string { $actions = ""; foreach ($this->actionsArray as $item) { $objItem = new $item($this->baseUrl, $id); $actions .= $objItem->fetch(); } return $actions; } public function create() { $this->beginTable(); $this->createThead(); $this->createTbody(); $this->endTable(); } public function tableAction($json): void { $tableJson = json_decode($json, true); foreach ($tableJson as $key => $value) { echo ""; echo ""; echo ""; echo ""; } } public function endTable(): void { $this->html .= "
" . "ID" . "" . $column . "Действия
' . $this->count . '" . $row . "$actions
" . $key . "" . $value . "
"; } public function render(): void { echo $this->html; } public function setBeforePrintCell(\Closure $closure): void { $this->beforePrintCell = $closure; } }