clientModel = new ClientModel(); } public function index() { $config = $this->getTableConfig(); return $this->renderTwig('@Clients/index', [ 'title' => 'Клиенты', 'tableHtml' => $this->renderTable($config), ]); } /** * Конфигурация таблицы клиентов */ protected function getTableConfig(): array { $organizationId = session()->get('active_org_id'); return [ 'id' => 'clients-table', 'url' => '/clients/table', 'model' => $this->clientModel, 'columns' => [ 'name' => ['label' => 'Имя / Название', 'width' => '40%'], 'email' => ['label' => 'Email', 'width' => '25%'], 'phone' => ['label' => 'Телефон', 'width' => '20%'], ], 'searchable' => ['name', 'email', 'phone'], 'sortable' => ['name', 'email', 'phone', 'created_at'], 'defaultSort' => 'name', 'order' => 'asc', 'actions' => ['label' => 'Действия', 'width' => '15%'], 'actionsConfig' => [ [ 'label' => '', 'url' => '/clients/edit/{id}', 'icon' => 'fa-solid fa-pen', 'class' => 'btn-outline-primary', 'title' => 'Редактировать' ], [ 'label' => '', 'url' => '/clients/delete/{id}', 'icon' => 'fa-solid fa-trash', 'class' => 'btn-outline-danger', 'title' => 'Удалить' ] ], 'emptyMessage' => 'Клиентов пока нет', 'emptyIcon' => 'fa-solid fa-users', 'emptyActionUrl' => base_url('/clients/new'), 'emptyActionLabel'=> 'Добавить клиента', 'emptyActionIcon' => 'fa-solid fa-plus', 'scope' => function ($builder) use ($organizationId) { $builder->where('organization_id', $organizationId); }, ]; } public function table() { $isPartial = $this->request->getGet('format') === 'partial' || $this->isAjax(); if ($isPartial) { // AJAX — только tbody + tfoot return $this->renderTable(null, true); } // Прямой запрос — полная страница $config = $this->getTableConfig(); $tableHtml = $this->renderTable($config, false); return $this->renderTwig('@Clients/index', [ 'title' => $config['pageTitle'] ?? 'Клиенты', 'tableHtml' => $tableHtml, ]); } public function new() { $data = [ 'title' => 'Добавить клиента', 'client' => null, ]; return $this->renderTwig('@Clients/form', $data); } public function create() { $organizationId = session()->get('active_org_id'); $rules = [ 'name' => 'required|min_length[2]|max_length[255]', 'email' => 'permit_empty|valid_email', 'phone' => 'permit_empty|max_length[50]', ]; if (!$this->validate($rules)) { return redirect()->back()->withInput()->with('errors', $this->validator->getErrors()); } $this->clientModel->insert([ 'organization_id' => $organizationId, 'name' => $this->request->getPost('name'), 'email' => $this->request->getPost('email') ?? null, 'phone' => $this->request->getPost('phone') ?? null, 'notes' => $this->request->getPost('notes') ?? null, ]); if ($this->clientModel->errors()) { return redirect()->back()->withInput()->with('error', 'Ошибка при создании клиента'); } session()->setFlashdata('success', 'Клиент успешно добавлен'); return redirect()->to('/clients'); } public function edit($id) { $organizationId = session()->get('active_org_id'); $client = $this->clientModel ->where('id', $id) ->where('organization_id', $organizationId) ->first(); if (!$client) { throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound('Клиент не найден'); } $data = [ 'title' => 'Редактировать клиента', 'client' => $client, ]; return $this->renderTwig('@Clients/form', $data); } public function update($id) { $organizationId = session()->get('active_org_id'); // Проверяем что клиент принадлежит организации $client = $this->clientModel ->where('id', $id) ->where('organization_id', $organizationId) ->first(); if (!$client) { throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound('Клиент не найден'); } $rules = [ 'name' => 'required|min_length[2]|max_length[255]', 'email' => 'permit_empty|valid_email', 'phone' => 'permit_empty|max_length[50]', ]; if (!$this->validate($rules)) { return redirect()->back()->withInput()->with('errors', $this->validator->getErrors()); } $this->clientModel->update($id, [ 'name' => $this->request->getPost('name'), 'email' => $this->request->getPost('email') ?? null, 'phone' => $this->request->getPost('phone') ?? null, 'notes' => $this->request->getPost('notes') ?? null, ]); if ($this->clientModel->errors()) { return redirect()->back()->withInput()->with('error', 'Ошибка при обновлении клиента'); } session()->setFlashdata('success', 'Клиент успешно обновлён'); return redirect()->to('/clients'); } public function delete($id) { $organizationId = session()->get('active_org_id'); // Проверяем что клиент принадлежит организации $client = $this->clientModel ->where('id', $id) ->where('organization_id', $organizationId) ->first(); if (!$client) { throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound('Клиент не найден'); } $this->clientModel->delete($id); session()->setFlashdata('success', 'Клиент удалён'); return redirect()->to('/clients'); } }