Files
xamxam/todo/02-php-components.md
Pontoporeia 234d7bae40 admin/index.php: add server-side pagination (25/page)
- Add Database::getThesesListCount(array $filters) — runs the same WHERE
  clauses as getThesesList() but with COUNT(DISTINCT t.id); used to compute
  total pages without loading all rows.
- Extend Database::getThesesList() with $limit/$offset parameters; when
  $limit > 0 appends LIMIT/OFFSET and re-binds positional params individually
  to avoid the PDO mixed-style restriction.
- Fix getThesesList() SELECT: add LEFT JOIN access_types + at.name as
  access_type — the column was referenced in the template but never fetched.
- Wire admin/index.php: read ?page=, compute $totalPages/$offset, pass
  $perPage=25 + $offset to getThesesList(); include pagination.php partial
  below the table with filter-preserving $baseParams.
- Add result-count line (<p class="admin-list-meta">) showing "X–Y sur Z TFE"
  when multiple pages exist.
- Add .admin-body .pagination-wrap / .pagination-btn / .pagination-info styles
  to admin.css (scoped to .admin-body to avoid colliding with public pages).
2026-04-06 15:33:08 +02:00

2.6 KiB

PHP Components (Reusable Partials)

Form field partials — templates/partials/form/

  • text-field.php — accepts $name, $label, $value, $required, $placeholder, $hint; renders the <div>…<label>…<input>…<small> pattern used ~15 times across add.php and edit.php
  • select-field.php — accepts $name, $label, $options[], $selected, $required; renders <div>…<label>…<select>…</div> pattern used ~6 times
  • checkbox-list.php — accepts $name, $label, $options[], $checked[]; renders the checkbox group pattern (languages, formats) used ~4 times across add.php and edit.php
  • file-field.php — accepts $name, $label, $accept, $hint, $multiple; renders file input pattern used 3 times
  • jury-fieldset.php — entire jury composition fieldset + JS duplicated verbatim between add.php and edit.php; extract into one partial accepting $juryPresident, $juryPromoteur, $juryPromoteurExt, $juryLecteurs[]

Shared UI partials — templates/partials/

  • pagination.php — partial created and used in both search.php and (now) admin/index.php; admin/index.php also gained proper server-side pagination (25/page) with filter-aware $baseParams
  • status-badge.php — published/pending badge + access badge pattern repeated in index.php admin table rows; extract into a partial
  • admin-alert.php — rename/merge flash-messages.php to also handle the 3 different legacy flash key patterns ($_SESSION['error'], $_SESSION['admin_error'], $_SESSION['edit_error'], etc.) that pages still consume manually instead of via App::consumeFlash()

Controller Extraction (In Progress)

  • Extract SearchController — most complex public page
  • Extract SystemController — biggest single-file win, 500→8 lines
  • Extract ThesisEditController — merges edit.php + actions/edit.php, deduplicates jury fieldset
  • Extract remaining controllers one by one
  • Consolidate action handlers into controller methods
  • Unify flash message keys project-wide to _flash_error / _flash_success
  • Move OG tag construction into controller logic
  • Extract inline CSS/JS from system.php into separate assets

Backend Maintenance

  • RateLimit uses per-file JSON on disk — consider switching to APCu or SQLite; at minimum move cache dir to /tmp or storage/cache/ excluded from deploy rsync
  • apropos.php contacts and credits are hardcoded — names, roles, emails (Laurent Leprince, Xavier Gorgol, Brigitte Ledune) live in PHP/HTML; move into the about page Markdown or a config array