| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- <?php
- namespace App\Filament\Resources\TextbookResource\Pages;
- use App\Filament\Resources\TextbookResource;
- use App\Services\TextbookApiService;
- use Filament\Actions;
- use Filament\Resources\Pages\ListRecords;
- use Illuminate\Contracts\Pagination\Paginator;
- use Illuminate\Pagination\LengthAwarePaginator;
- class ManageTextbooks extends ListRecords
- {
- protected static string $resource = TextbookResource::class;
- private function pickFilterValue(array $filters, string $key): mixed
- {
- $fromState = $filters[$key] ?? null;
- if (is_array($fromState)) {
- if (array_key_exists('value', $fromState)) {
- return $fromState['value'];
- }
- if (array_key_exists('values', $fromState)) {
- return $fromState['values'];
- }
- }
- if ($fromState !== null) {
- return $fromState;
- }
- return request()->input("filters.{$key}.value", request()->input("tableFilters.{$key}.value"));
- }
- private function getActiveKeyword(array $filters): ?string
- {
- $keyword = $this->pickFilterValue($filters, 'keyword');
- if (filled($keyword)) {
- return trim((string) $keyword);
- }
- if (filled($this->tableSearch)) {
- return trim((string) $this->tableSearch);
- }
- $search = request()->input('search');
- return filled($search) ? trim((string) $search) : null;
- }
- protected function getHeaderActions(): array
- {
- return [
- Actions\CreateAction::make()
- ->label('新建教材'),
- ];
- }
- protected function paginateTableQuery(\Illuminate\Database\Eloquent\Builder $query): Paginator
- {
- return $this->getTableRecords();
- }
- public function getTableRecords(): Paginator
- {
- $apiService = app(TextbookApiService::class);
- $page = max(1, (int) $this->getTablePage());
- $perPageOption = $this->getTableRecordsPerPage();
- $perPage = is_numeric($perPageOption) ? (int) $perPageOption : 10;
- $perPage = min(max($perPage, 10), 50);
- $filters = $this->tableFilters ?? [];
- $seriesId = $this->pickFilterValue($filters, 'series_id');
- $stage = $this->pickFilterValue($filters, 'stage');
- $grade = $this->pickFilterValue($filters, 'grade');
- $semester = $this->pickFilterValue($filters, 'semester');
- $namingScheme = $this->pickFilterValue($filters, 'naming_scheme');
- $status = $this->pickFilterValue($filters, 'status');
- $keyword = $this->getActiveKeyword($filters);
- $params = [
- 'page' => $page,
- 'per_page' => $perPage,
- 'series_id' => $seriesId,
- 'stage' => $stage,
- 'grade' => $grade,
- 'semester' => $semester,
- 'naming_scheme' => $namingScheme,
- 'status' => $status,
- 'keyword' => $keyword,
- ];
- $params = array_filter($params, fn ($value) => $value !== null && $value !== '');
- \Log::info('ManageTextbooks::getTableRecords called', [
- 'page' => $page,
- 'perPage' => $perPage,
- 'series_id' => $seriesId,
- 'tableFilters' => $filters,
- 'tableSearch' => $this->tableSearch,
- 'resolved_params' => $params,
- ]);
- $result = $apiService->getTextbooks($params);
- \Log::info('API result', [
- 'total' => $result['meta']['total'] ?? 0,
- 'count' => count($result['data'] ?? [])
- ]);
- $records = collect($result['data'] ?? [])->map(function ($item) {
- $model = new \App\Models\Textbook();
- // 直接设置属性
- foreach ($item as $key => $value) {
- $model->setAttribute($key, $value);
- }
- $model->exists = true;
- // 确保ID被正确设置
- if (isset($item['id'])) {
- $model->id = $item['id'];
- }
- // 设置关联
- if (isset($item['series'])) {
- $seriesModel = new \App\Models\TextbookSeries();
- foreach ($item['series'] as $key => $value) {
- $seriesModel->setAttribute($key, $value);
- }
- $seriesModel->exists = true;
- $model->setRelation('series', $seriesModel);
- }
- return $model;
- });
- return new LengthAwarePaginator(
- $records,
- $result['meta']['total'] ?? 0,
- $perPage,
- $page,
- ['path' => request()->url()]
- );
- }
- }
|