diff --git a/.claude/settings.local.json b/.claude/settings.local.json index a48b55d..038bcf9 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -3,7 +3,9 @@ "allow": [ "Bash(git add:*)", "Bash(git commit:*)", - "Bash(cat:*)" + "Bash(cat:*)", + "Bash(curl:*)", + "Bash(php -l:*)" ], "deny": [], "ask": [] diff --git a/.gitignore b/.gitignore index 42cbd09..ff728b3 100644 --- a/.gitignore +++ b/.gitignore @@ -60,5 +60,11 @@ Icon /vendor/* # Local +# --------------- local/ -/local/* \ No newline at end of file +/local/* + +# Claude config +# --------------- +.claude/ +/.claude/* \ No newline at end of file diff --git a/site/blueprints/files/cover.yml b/site/blueprints/files/cover.yml new file mode 100644 index 0000000..ca64d64 --- /dev/null +++ b/site/blueprints/files/cover.yml @@ -0,0 +1,12 @@ +title: Image de couverture + +fields: + alt: + label: Texte alternatif + type: text + help: Description de l'image pour l'accessibilité + caption: + label: Légende + type: textarea + size: small + help: Légende affichée sous l'image diff --git a/site/blueprints/pages/investigation-summary.yml b/site/blueprints/pages/investigation-summary.yml index e69de29..c062b0b 100644 --- a/site/blueprints/pages/investigation-summary.yml +++ b/site/blueprints/pages/investigation-summary.yml @@ -0,0 +1,111 @@ +title: Investigation +create: + fields: + - subtitle + +tabs: + contentTab: + label: Contenu + icon: page + columns: + - width: 2/6 + fields: + publicationDate: + label: Date de publication + type: date + display: DD / MM / YYYY + default: today + width: 1/4 + - width: 4/6 + fields: + subtitle: + label: Sous-titre + type: text + chapo: + label: Chapo + type: writer + nodes: false + buttons: false + cover: + label: Visuel de couverture + type: files + multiple: false + min: 1 + layout: cards + size: full + uploads: + template: cover + image: + ratio: 12/7 + cover: true + body: + label: Corps + type: layout + layouts: + - "1/1" + - "1/2, 1/2" + - "1/3, 1/3, 1/3" + fieldsets: + - heading + - text + - image + metadataTab: + label: Métadonnées + icon: table + fields: + incidentDate: + label: Date de l'incident + type: date + display: DD / MM / YYYY + width: 1/3 + incidentLocation: + label: Lieu de l'incident + type: text + width: 1/3 + incidentConsequences: + label: Conséquence(s) + type: text + width: 1/3 + keywords: + label: Mots-clés + type: tags + width: 1/2 + partners: + label: Partenaire(s) + type: structure + width: 1/2 + fields: + name: + label: Nom + type: text + link: + label: Lien + type: link + options: + - url + methodologies: + label: Méthodologie + type: entries + field: + type: text + line: + type: line + team: + label: Équipe + type: structure + columns: + responsability: + width: 1/2 + names: + width: 1/2 + fields: + responsability: + label: Responsabilité + type: text + width: 1/2 + names: + label: Nom + type: entries + width: 1/2 + field: + type: text diff --git a/site/cache/index.html b/site/cache/index.html deleted file mode 100644 index e69de29..0000000 diff --git a/site/config/config.php b/site/config/config.php index 8e65d31..bc17179 100644 --- a/site/config/config.php +++ b/site/config/config.php @@ -30,5 +30,53 @@ return [ 'campaign_slug' => 'soutenir-index-en-2024', 'campaign_url' => 'https://donorbox.org/soutenir-index-en-2024', 'api_base_url' => 'https://donorbox.org/api/v1' + ], + + 'routes' => [ + // Route pour /enquetes/:slug/resume - Page virtuelle résumé + [ + 'pattern' => 'enquetes/(:any)/resume', + 'action' => function($slug) { + $parent = page('enquetes/' . $slug); + if (!$parent) { + return false; + } + + if ($parent->intendedTemplate()->name() !== 'investigation') { + return false; + } + + // Créer une page virtuelle avec le template investigation-summary + return Page::factory([ + 'slug' => 'resume', + 'template' => 'investigation-summary', + 'parent' => $parent, + 'content' => $parent->content()->toArray() + ]); + } + ], + + // Route pour /enquetes/:slug/detail - Page virtuelle détail + [ + 'pattern' => 'enquetes/(:any)/detail', + 'action' => function($slug) { + $parent = page('enquetes/' . $slug); + if (!$parent) { + return false; + } + + if ($parent->intendedTemplate()->name() !== 'investigation') { + return false; + } + + // Créer une page virtuelle avec le template investigation + return Page::factory([ + 'slug' => 'detail', + 'template' => 'investigation', + 'parent' => $parent, + 'content' => $parent->content()->toArray() + ]); + } + ] ] ]; \ No newline at end of file diff --git a/site/config/routes/investigations.php b/site/config/routes/investigations.php new file mode 100644 index 0000000..29dfff4 --- /dev/null +++ b/site/config/routes/investigations.php @@ -0,0 +1,62 @@ + 'enquetes/(:any)/resume', + 'action' => function($slug) { + $parent = page('enquetes/' . $slug); + if (!$parent) { + return false; + } + + if ($parent->intendedTemplate()->name() !== 'investigation') { + return false; + } + + // Créer une page virtuelle avec le template investigation-summary + return Page::factory([ + 'slug' => 'resume', + 'template' => 'investigation-summary', + 'parent' => $parent, + 'content' => $parent->content()->toArray() + ]); + } + ], + + // Route pour /enquetes/:slug/detail - Page virtuelle détail + [ + 'pattern' => 'enquetes/(:any)/detail', + 'action' => function($slug) { + $parent = page('enquetes/' . $slug); + if (!$parent) { + return false; + } + + if ($parent->intendedTemplate()->name() !== 'investigation') { + return false; + } + + // Créer une page virtuelle avec le template investigation + return Page::factory([ + 'slug' => 'detail', + 'template' => 'investigation', + 'parent' => $parent, + 'content' => $parent->content()->toArray() + ]); + } + ] +]; diff --git a/site/controllers/investigation.php b/site/controllers/investigation.php new file mode 100644 index 0000000..9f0788d --- /dev/null +++ b/site/controllers/investigation.php @@ -0,0 +1,19 @@ +slug() !== 'resume' && $page->slug() !== 'detail') { + // Redirection 301 vers la page résumé + go($page->url() . '/resume', 301); + } + + // Si c'est une page virtuelle, laisser le template s'afficher normalement + return compact('page'); +}; diff --git a/site/snippets/blocks/heading.php b/site/snippets/blocks/heading.php new file mode 100644 index 0000000..f2d61fd --- /dev/null +++ b/site/snippets/blocks/heading.php @@ -0,0 +1,4 @@ +level()->or('h2'); +?> +<>text() ?>> diff --git a/site/snippets/blocks/image.php b/site/snippets/blocks/image.php new file mode 100644 index 0000000..ec2beee --- /dev/null +++ b/site/snippets/blocks/image.php @@ -0,0 +1,8 @@ +image()->toFile()): ?> +
+ <?= $block->alt()->or($image->alt()) ?> + caption()->isNotEmpty()): ?> +
caption() ?>
+ +
+ diff --git a/site/snippets/blocks/text.php b/site/snippets/blocks/text.php new file mode 100644 index 0000000..c0078c3 --- /dev/null +++ b/site/snippets/blocks/text.php @@ -0,0 +1 @@ +text() ?> diff --git a/site/templates/investigation-summary.php b/site/templates/investigation-summary.php index 8260f25..f98c7dc 100644 --- a/site/templates/investigation-summary.php +++ b/site/templates/investigation-summary.php @@ -3,29 +3,35 @@

Enquête

-

L’exécution de Nidal et Khaled ‘Amirah à Naplouse

-

+

title() ?>

+

- + cover()->toFile()): ?> + <?= $cover->alt() ?> +
-
Ici la légende de l’image. À partir d’images exclusives, l’analyse conjointe de B’Tselem et Index démontre que les deux hommes ont été abattus par des soldats israéliens alors qu’ils ne présentaient aucun danger.
+ cover()->toFile()): ?> + caption()->isNotEmpty()): ?> +
caption() ?>
+ +
-

À partir d’images exclusives, l’analyse conjointe de B’Tselem et Index démontre que les deux hommes ont été abattus par des soldats israéliens alors qu’ils ne présentaient aucun danger.

+ chapo()->isNotEmpty()): ?> +
chapo() ?>
+ + -
-
Date de l’incident
-
+
Date de l'incident
+
-
Lieu de l’incident
-
Naplouse, Cisjordanie occupée, Palestine
+
Lieu de l'incident
+
incidentLocation() ?>
-
Conséquences
-
Mort
+
Conséquence(s)
+
incidentConsequences() ?>
Mots-clés
@@ -68,45 +74,63 @@
Méthodologie
Équipe
-
Nadav Joffe, Basile Trouillet, Francesco Sebregondi, Basile Trouillet, Francesco Sebregondi
+
+ team()->toStructure() as $row) { + foreach ($row->names()->toEntries() as $name) { + $namesList[] = $name; + } + } + echo implode(', ', $namesList); + ?> +
Partenaire(s)
-
B’Tselem
+
+ partners()->toStructure() as $partner) { + if ($partner->link()->isNotEmpty()) { + $partnersList[] = '' . $partner->name() . ''; + } else { + $partnersList[] = $partner->name(); + } + } + echo implode(', ', $partnersList); + ?> +
Date de publication
-
+
-
-

Synthèse

- -

Le 10 juin 2025, lors d’un raid de grande envergure dans la vieille ville de Naplouse, les forces armées israéliennes ont tué deux Palestiniens : les frères Nidal et Khaled ‘Amirah. -

-

- Suite à l’incident, l’armée israélienne a affirmé dans un communiqué que les hommes étaient des « terroristes » qui avaient essayé de s’emparer de l’arme d’un soldat et en avaient blessé quatre autres. Les soldats auraient alors riposté en tirant sur les deux hommes, les tuant tous les deux. -

-

- Cependant, l’analyse vidéo et les témoignages recueillis contredisent cette version des faits. Une enquête menée conjointement par B’Tselem et Index révèle que les frères ‘Amirah n’ont à aucun moment posé de danger pour les soldats impliqués. Pourtant, Khaled a été exécuté à bout portant alors qu’il était maintenu au sol par plusieurs soldats armés, tandis que son frère Nidal a été abattu par un tir dans le dos. Les soldats ont également empêché les secouristes présents de leur prêter assistance. -

-

Un sous-titre ici pour tester

-

- Les corps de Nidal et de Khaled ‘Amirah sont toujours détenus par les forces armées israéliennes. -

-

- À Naplouse comme à Jénine – où des soldats ont été filmés le mois dernier en train d’exécuter deux Palestiniens qui s’étaient rendus – ces images révèlent une politique de “tir à vue”, qui permet à l’armée israélienne de faire un usage sans aucun frein de la force létale contre les Palestiniens. Depuis octobre 2023, Israël a tué plus de 1 000 Palestiniens en Cisjordanie occupée. -

-
+ body()->isNotEmpty()): ?> +
+

Synthèse

+ body()->toLayouts() as $layout): ?> +
+ columns() as $column): ?> +
+ blocks() ?> +
+ +
+ +
+
@@ -130,7 +154,7 @@

Judiciaire

12 Dec 2025

-

La justice israélienne déclare ouvrir une enquête sur “les circonstances de la mort de Nidal et Khaled Amirah”. +

La justice israélienne déclare ouvrir une enquête sur "les circonstances de la mort de Nidal et Khaled Amirah".

@@ -139,7 +163,7 @@

Judiciaire

12 Dec 2025

-

La justice israélienne déclare ouvrir une enquête sur “les circonstances de la mort de Nidal et Khaled Amirah” +

La justice israélienne déclare ouvrir une enquête sur "les circonstances de la mort de Nidal et Khaled Amirah"

@@ -149,7 +173,7 @@

Judiciaire

12 Dec 2025

-

Index présente une série d’enquêtes récentes au Festival du Réel 2025. Voir plus +

Index présente une série d'enquêtes récentes au Festival du Réel 2025. Voir plus

@@ -164,7 +188,7 @@
-

L’homicide de Nahel Merzouk

+

L'homicide de Nahel Merzouk