Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 0 additions & 6 deletions phpstan-baseline.php
Original file line number Diff line number Diff line change
Expand Up @@ -9805,12 +9805,6 @@
'count' => 1,
'path' => __DIR__ . '/sources/AppBundle/Twig/AssetsExtension.php',
];
$ignoreErrors[] = [
'message' => '#^Cannot access property \\$urlName on AppBundle\\\\Antennes\\\\Meetup\\|null\\.$#',
'identifier' => 'property.nonObject',
'count' => 1,
'path' => __DIR__ . '/sources/AppBundle/Twig/OfficesExtension.php',
];
$ignoreErrors[] = [
'message' => '#^Parameter \\#1 \\$code of method AppBundle\\\\Antennes\\\\AntenneRepository\\:\\:findByCode\\(\\) expects string, mixed given\\.$#',
'identifier' => 'argument.type',
Expand Down
3 changes: 2 additions & 1 deletion sources/AppBundle/Twig/OfficesExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ public function getFunctions(): array
return [
new TwigFunction('office_name', fn($code): string => $this->antennesRepository->findByCode($code)->label),
new TwigFunction('office_logo', fn($code): string => $this->antennesRepository->findByCode($code)->logoUrl),
new TwigFunction('office_meetup_urlname', fn($code) => $this->antennesRepository->findByCode($code)->meetup->urlName),
// Toutes les antennes n'ont pas de groupe Meetup (ex : Clermont), d'où le `?->`
new TwigFunction('office_meetup_urlname', fn($code) => $this->antennesRepository->findByCode($code)->meetup?->urlName),
];
}
}
123 changes: 60 additions & 63 deletions templates/site/superapero.html.twig
Original file line number Diff line number Diff line change
@@ -1,81 +1,78 @@
{% extends 'site/base.html.twig' %}
{% block stylesheets %}
{{ parent() }}
<link rel="stylesheet" href="{{ asset('css/grid.css') }}" media="all" />
<link rel="stylesheet" href="{{ asset('css/buttons.css') }}" media="all" />
<style type="text/css">
h1 {
text-align: center;
}
{% extends 'layouts/site.html.twig' %}

h1 img {
max-height: 80px;
}
{% block title %}Super-apéro PHP{% endblock %}

@media (max-width: 992px) {
h1 img {
display: block;
margin: 10px auto;
}
}
</style>
{% block metas %}
{{ parent() }}
<meta property="og:title" content="AFUP - Super-apéro PHP" />
<meta property="og:type" content="article" />
<meta property="og:url" content="{{ app.request.getSchemeAndHttpHost() }}{{ path('superapero') }}" />
<meta property="og:image" content="{{ app.request.getSchemeAndHttpHost() }}/images/super_apero_php-300x213.png" />
<meta property="og:url" content="{{ url('superapero') }}" />
<meta property="og:image" content="{{ absolute_url(asset('images/super_apero_php-300x213.png')) }}" />
<meta property="og:description" content="Super Apéro PHP, l’apéro avec une cape organisé dans les antennes AFUP" />
<meta property="og:site_name" content="AFUP" />
{% endblock %}

{% block content %}
<div class="mw1400p center" id="container">
<div class="line" id="main">
<h1>
<img src="https://identity.afup.org/assets/apero_php/logo_apero_php.png" alt="" />
Super-apéro PHP
<img src="https://identity.afup.org/assets/apero_php/logo_apero_php.png" alt="" />
</h1>

<h2 style="text-align: center">Des apéros PHP le même jour dans toutes les antennes !</h2>
{# En-tête pleine largeur sur le voile bleu nuit des autres pages refondues.
Le logo « apéro avec une cape » remplace les deux images qui encadraient le H1. #}
<div class="bg-gradient-to-br from-afup-900 via-afup-800 to-afup-700">
<div class="container mx-auto px-4 py-12 sm:px-28 sm:py-16 relative isolate flex flex-col items-center text-center gap-6">
<img src="https://identity.afup.org/assets/apero_php/logo_apero_php.png" alt="" width="120" height="120"
class="size-24 sm:size-28 object-contain" />

<blockquote>
<p>Bloquez votre soirée du {{ superApero.date|format_date(pattern='EEEE d MMMM', locale='fr') }} et rendez-vous dans votre antenne locale pour une soirée de conférences et d'échanges, où toute la communauté PHP sera invitée à lever son verre pour célébrer le langage !</p>
</blockquote>
<div class="flex flex-col items-center gap-4">
<h1 class="font-titre font-normal text-3xl sm:text-4xl leading-tight text-white">Super-apéro PHP</h1>
<p class="font-sans font-normal text-lg text-white/90">Des apéros PHP le même jour dans toutes les antennes !</p>
</div>

{% for meetup in superApero.meetups %}
{% if loop.index is odd %}
<div class="container">
{% endif %}
<p class="font-sans font-normal text-base text-white/90 max-w-3xl">
Bloquez votre soirée du
<time datetime="{{ superApero.date|date('Y-m-d') }}" class="font-semibold text-white">{{ superApero.date|format_date(pattern='EEEE d MMMM', locale='fr') }}</time>
et rendez-vous dans votre antenne locale pour une soirée de conférences et d'échanges, où toute la
communauté PHP sera invitée à lever son verre pour célébrer le langage !
</p>

<div class="col-md-6">
<div class="container">
<div class="col-md-2">
<img src="{{ office_logo(meetup.antenne) }}" alt="" />
</div>
<div class="col-md-10">
<h3>{{ office_name(meetup.antenne) }}</h3>
</div>
</div>
<div class="container">
<div class="col-md-{% if meetup.meetupId %}8{% else %}12{% endif %}">
{{ meetup.description|raw }}
</div>
{% if meetup.meetupId %}
<div class="col-md-4">
<a href="https://www.meetup.com/fr-FR/{{ office_meetup_urlname(meetup.antenne) }}/events/{{ meetup.meetupId }}/" class="button">S'inscrire</a>
<div class="absolute w-64 h-64 top-0 right-0 translate-x-1/3 -translate-y-1/3 bg-white/5 blur-3xl rounded-full -z-10"></div>
</div>
</div>

<div class="container mx-auto flex flex-col px-4 py-6 gap-6 sm:px-28 sm:py-10 sm:gap-10">
<div class="flex flex-col gap-5">
<twig:SectionTitle>Les antennes participantes</twig:SectionTitle>

{# La grille remplace le découpage manuel en rangées de deux (`loop.index is odd`
+ `col-md-6`) : plus de balises ouvertes/fermées à cheval sur la boucle. #}
<div class="grid grid-cols-1 md:grid-cols-2 gap-5 sm:gap-8">
{% for meetup in superApero.meetups %}
<twig:Card class="flex flex-col gap-5 p-6 sm:p-8">
<div class="flex flex-row items-center gap-4">
<div class="bg-neutre-200 rounded-2xl size-20 shrink-0 flex items-center justify-center">
<img src="{{ office_logo(meetup.antenne) }}" alt="" class="w-full h-full object-contain" />
</div>
<h3 class="font-titre font-bold text-2xl text-afup-800">{{ office_name(meetup.antenne) }}</h3>
</div>
{% endif %}
</div>
</div>

{% if loop.index is even %}
</div>
{% endif %}
{% endfor %}
{% if meetup.description %}
<div class="prose prose-sm max-w-none font-sans text-neutre-700">{{ meetup.description|raw }}</div>
{% endif %}

{% if superApero.meetups|length is odd %}
</div>
{% endif %}
{# Sans groupe Meetup l'URL d'inscription serait tronquée : on n'affiche
alors pas de bouton plutôt qu'un lien cassé. #}
{% set meetup_urlname = office_meetup_urlname(meetup.antenne) %}
{% if meetup.meetupId and meetup_urlname %}
{# `mt-auto` : le bouton reste collé en bas, aligné d'une carte à
l'autre quelle que soit la longueur de la description. #}
<div class="mt-auto border-t-2 border-neutre-300 pt-5">
<twig:Button variant="primary" as="a"
href="https://www.meetup.com/fr-FR/{{ meetup_urlname }}/events/{{ meetup.meetupId }}/"
class="flex w-full px-8 py-3 text-base font-semibold">S'inscrire</twig:Button>
</div>
{% endif %}
</twig:Card>
{% endfor %}
</div>
</div>
</div>
{% endblock %}

{% endblock %}
2 changes: 1 addition & 1 deletion tests/behat/features/PublicSite/SuperApero.feature
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,6 @@ Feature: Site Public - Super Apéro PHP
# Affichage de la page du Super Apéro
Given I am on "/super-apero"
Then the current URL should match "#/association/super-apero$#"
And the "#main h1" element should contain "Super-apéro PHP"
And the "h1" element should contain "Super-apéro PHP"
And the response should contain "Super Apéro PHP à Paris"
And the response should contain "Super Apéro PHP à Bordeaux"
Loading