Incentive (E1): Bilder je Incentive, Teaser mit Call to Action oben, Praemie je Teampartner statt Punkte

Titelbild und Galerie liegen jetzt in public/img/incentive/<slug>/, der
Hauptordner ist nur noch Fallback fuers Titelbild. Damit erscheinen die
Montenegro-Impressionen nicht mehr unter der Challenge; die Fotos sind in
montenegro-incentive-2026/ verschoben.

Teaser: Call to Action "Bist du bereit fuer die Challenge?" mit Button ganz
oben. Bei Geldpraemie zeigen die Kacheln "Deine Praemie" (50 EUR je neuem
Teampartner) und "Top 3 Bonus" statt Incentive-Punkte, darunter der Abschnitt
"So funktioniert die Challenge". Rangliste: Button "Jetzt teilnehmen" wieder
in der Sekundaerfarbe.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Kevin 2026-09-22 12:37:58 +00:00
parent 3341c929eb
commit f340d0de3d
20 changed files with 278 additions and 135 deletions

View file

@ -166,29 +166,13 @@ class IncentiveController extends Controller
}
/**
* Sammelt alle verfuegbaren Galerie-Bilder aus public/img/incentive/
* (ohne das Hauptbild, das bereits als Hero verwendet wird).
* Galerie-Bilder des Incentives aus seinem eigenen Ordner ({@see Incentive::galleryImages()}).
*
* @return list<string>
*/
private function collectGalleryImages(Incentive $incentive): array
{
$dir = public_path('img/incentive');
if (! is_dir($dir)) {
return [];
}
$files = glob($dir.'/*.{jpg,jpeg,png,webp}', GLOB_BRACE) ?: [];
$images = [];
foreach ($files as $file) {
$basename = basename($file);
$images[] = 'img/incentive/'.$basename;
}
sort($images);
return $images;
return $incentive->galleryImages();
}
/**

View file

@ -208,6 +208,60 @@ class Incentive extends Model
->get();
}
/**
* Ordner der Bilder dieses Incentives (relativ zu public/): img/incentive/<slug>.
*/
public function imageDirectory(): string
{
return 'img/incentive/'.$this->slug;
}
/**
* Pfad des Titelbilds relativ zu public/, bevorzugt aus dem eigenen Ordner,
* sonst aus dem Hauptordner (Altbestand). NULL ohne Titelbild.
*/
public function heroImagePath(): ?string
{
if (! $this->image) {
return null;
}
$own = $this->imageDirectory().'/'.$this->image;
if (is_file(public_path($own))) {
return $own;
}
return 'img/incentive/'.$this->image;
}
/**
* Galerie-Bilder nur aus dem eigenen Ordner, ohne Titelbild, sortiert.
* Der Hauptordner zaehlt bewusst nicht mehr, damit Bilder eines anderen
* Incentives nicht unter diesem erscheinen.
*
* @return list<string>
*/
public function galleryImages(): array
{
$dir = public_path($this->imageDirectory());
if (! is_dir($dir)) {
return [];
}
$files = glob($dir.'/*.{jpg,jpeg,png,webp}', GLOB_BRACE) ?: [];
$images = [];
foreach ($files as $file) {
$basename = basename($file);
if ($basename === $this->image) {
continue;
}
$images[] = $this->imageDirectory().'/'.$basename;
}
sort($images);
return $images;
}
/**
* Darf dieser Berater das Incentive sehen (Teaser, Rangliste, Details, Teilnahme)?
*/