feat(donations): clickable OKI links in donation disclaimer

This commit is contained in:
2026-07-25 21:52:29 +04:00
parent e673b484ce
commit aa86bf65e4
4 changed files with 33 additions and 3 deletions
+10
View File
@@ -105,6 +105,16 @@
margin-right: 10px;
}
.donation-disclaimer a {
color: var(--primary-red);
text-decoration: underline;
font-weight: 600;
}
.donation-disclaimer a:hover {
text-decoration: none;
}
@media (max-width: 1024px) {
.donation-disclaimer {
margin-bottom: 20px;
+19 -1
View File
@@ -49,6 +49,24 @@ $currencySymbol = $currency === 'EUR' ? '€' : '$';
$stripeOneTimeLinks = defined('STRIPE_ONE_TIME_LINKS') ? STRIPE_ONE_TIME_LINKS : [];
$stripeMonthlyLinks = defined('STRIPE_MONTHLY_LINKS') ? STRIPE_MONTHLY_LINKS : [];
/**
* Convertit les URLs d'un texte en liens cliquables tout en échappant le reste.
* Utilisé pour le message de transparence sur les dons.
*/
function linkUrlsInText(string $text): string {
$parts = preg_split('/(https?:\/\/[^\s<]+)/i', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
$result = '';
foreach ($parts as $i => $part) {
if ($i % 2 === 1) {
$url = htmlspecialchars($part, ENT_QUOTES, 'UTF-8');
$result .= '<a href="' . $url . '" target="_blank" rel="noopener noreferrer">' . $url . '</a>';
} else {
$result .= htmlspecialchars($part, ENT_QUOTES, 'UTF-8');
}
}
return $result;
}
?>
<!DOCTYPE html>
<html lang="fr">
@@ -136,7 +154,7 @@ $stripeMonthlyLinks = defined('STRIPE_MONTHLY_LINKS') ? STRIPE_MONTHLY_LINKS : [
<!-- Avertissement de transparence (optionnel) -->
<?php if (defined('DONATIONS_OKI_DISCLAIMER') && !empty(DONATIONS_OKI_DISCLAIMER)): ?>
<div class="donation-disclaimer" role="note">
<p><i class="fas fa-info-circle"></i> <?php echo htmlspecialchars(DONATIONS_OKI_DISCLAIMER); ?></p>
<p><i class="fas fa-info-circle"></i> <?php echo linkUrlsInText(DONATIONS_OKI_DISCLAIMER); ?></p>
</div>
<?php endif; ?>
+2 -1
View File
@@ -235,8 +235,9 @@ if (!defined('STRIPE_ENABLED')) define('STRIPE_ENABLED', false);
// Message de transparence affiché sur la page de dons.
// Renseignez ce texte lorsque les liens pointent vers les comptes d'une organisation
// tierce (par exemple OKI) afin d'expliquer aux visiteurs pourquoi.
// Les URLs présentes dans ce texte sont automatiquement transformées en liens cliquables.
if (!defined('DONATIONS_OKI_DISCLAIMER')) {
define('DONATIONS_OKI_DISCLAIMER', 'Les liens ci-dessous pointent vers les comptes de donation de l\'association ORGANISATION KA INTERNATIONALE (OKI), mainteneur de cette application libre sous licence AGPL. Vous pouvez les remplacer par vos propres liens dans config.local.php ou désactiver la page de dons avec DONATIONS_ENABLED.');
define('DONATIONS_OKI_DISCLAIMER', 'Les liens ci-dessous pointent vers les comptes de donation de l\'association ORGANISATION KA INTERNATIONALE (OKI) — o-k-i.net. Pour soutenir spécifiquement OKI : o-k-i.net/dons. Pour adapter cette page à votre propre instance, voir la documentation (lien "Code Source" en bas de la page)');
}
// Configuration Stripe
+2 -1
View File
@@ -390,8 +390,9 @@ define('WORDPRESS_ENABLED', false);
// Message de transparence affiché sur la page de dons.
// À renseigner si les liens pointent vers les comptes d'une organisation tierce
// (par exemple OKI) afin d'expliquer aux visiteurs pourquoi.
// Les URLs présentes dans ce texte sont automatiquement transformées en liens cliquables.
// Laissez vide ou commentez pour masquer ce message.
// define('DONATIONS_OKI_DISCLAIMER', 'Les liens ci-dessous pointent vers les comptes de donation de l\'association ORGANISATION KA INTERNATIONALE (OKI), mainteneur de cette application libre sous licence AGPL. Vous pouvez les remplacer par vos propres liens dans ce fichier ou désactiver la page de dons avec DONATIONS_ENABLED.');
// define('DONATIONS_OKI_DISCLAIMER', 'Les liens ci-dessous pointent vers les comptes de donation de l\'association ORGANISATION KA INTERNATIONALE (OKI) — https://o-k-i.net. Pour soutenir spécifiquement OKI : https://o-k-i.net/dons. Pour adapter cette page à votre propre instance, voir la documentation : https://labola.o-k-i.net/cedric/annu-kute-ced');
// =========================================
// Texte de présentation du podcast