Fiabilise les médias et la navigation mobile

This commit is contained in:
Alexandre NOEL 2026-09-08 22:28:01 +02:00
commit 5909f55aba
12 changed files with 266 additions and 19 deletions

View file

@ -36,6 +36,7 @@ trait AnimalPhotoActions
$base = $base ?: 'photo';
$dir = __DIR__ . '/../../public/media/animals/' . $id;
try {
PrivateMediaService::ensure($dir, true);
$stored = ImageService::storeUploaded($tmp, $dir, $base, 'photo');
$filename = $stored['filename'];
$mime = $stored['mime'];

View file

@ -191,10 +191,7 @@ final class AnimalsController
private static function ensureAnimalMediaDir(int $animalId): void
{
$dir = self::animalMediaDir($animalId);
if (!is_dir($dir)) {
mkdir($dir, 0775, true);
}
PrivateMediaService::ensure(self::animalMediaDir($animalId), true);
}
private static function safeFilename(string $name): string

View file

@ -28,6 +28,19 @@ final class PrivateMediaService
throw new RuntimeException(t('service.image.directory_failed'));
}
@chmod($dir, $mode);
if ($public) {
self::hardenPublicParents($dir);
}
}
private static function hardenPublicParents(string $dir): void
{
$mediaRoot = dirname(__DIR__, 2) . '/public/media';
foreach ([$mediaRoot, $mediaRoot . '/animals', $dir] as $publicDir) {
if (is_dir($publicDir)) {
@chmod($publicDir, 0755);
}
}
}
public static function moveVisibility(int $animalId, string $filename, bool $toPublic): void

View file

@ -1,7 +1,7 @@
<?php
/** Barre de navigation et recherche globale. */
?>
<header class="navbar navbar-expand-md d-print-none">
<header class="navbar navbar-expand-lg d-print-none">
<div class="container-xl">
<div class="topbar-surface d-flex align-items-center justify-content-between w-100">
<a class="navbar-brand d-flex flex-row align-items-center py-0"
@ -16,7 +16,15 @@
</span>
</a>
<div class="navbar-nav flex-row order-md-last">
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
data-bs-target="#globinoursMainNavigation" aria-controls="globinoursMainNavigation"
aria-expanded="false" aria-label="<?= h(t('nav.open_menu')) ?>">
<span class="navbar-toggler-icon"></span>
</button>
<nav class="collapse navbar-collapse topbar-menu" id="globinoursMainNavigation"
aria-label="<?= h(t('nav.main')) ?>">
<div class="navbar-nav flex-row order-md-last ms-md-auto">
<span class="search-trigger-wrap"><button class="search-trigger" type="button" data-bs-toggle="modal"
data-bs-target="#globalSearchModal"
title="<?= h(t('search.open')) ?> — <?= h(t('search.shortcut')) ?>"
@ -124,7 +132,8 @@
</div>
</div>
</div>
</div>
</nav>
</div>
</div>
</header>

View file

@ -31,9 +31,10 @@
<div class="col-lg-6">
<section class="card h-100">
<div class="card-body">
<span class="badge bg-blue-lt mb-2">1.0.0-rc.16</span>
<h3>Mises à jour autonomes</h3>
<p class="text-muted">Installation vérifiée depuis Forgejo, sauvegarde obligatoire et retour automatique du code et des données en cas d’échec.</p>
<span class="badge bg-blue-lt mb-2">1.0.0-rc.17</span>
<h3>Utilisation mobile</h3>
<p class="text-muted">Navigation repliable sur les petits écrans et publication fiable des nouvelles
photographies, y compris depuis l’application Android.</p>
</div>
</section>
</div>