Intégration par iframe
L'intégration par iframe est la méthode la plus simple pour intégrer les fonctionnalités Wast-o dans votre application. Elle nécessite peu de code et permet une mise en place rapide.
Vue d'ensemble
L'intégration par iframe permet d'embarquer les composants Wast-o directement dans votre page web via une iframe. Cette méthode est idéale pour :
- Intégrations rapides
- Prototypes
- Sites web avec contraintes de sécurité
- Applications nécessitant une isolation
Intégration du calendrier
URL de base
L'URL de base pour le calendrier est :
https://public.wast-o.org/calendar?cityId={cityId}
Paramètres
cityId(requis) : Identifiant unique de la ville (UUID)placeId(optionnel) : Identifiant du lieu de collecte spécifiquelang(optionnel) : Code langue (fr, en). Par défaut: frtheme(optionnel) : Thème (light, dark). Par défaut: light
Exemple basique
<!DOCTYPE html>
<html>
<head>
<title>Calendrier de collecte Wast-o</title>
</head>
<body>
<h1>Calendrier de collecte</h1>
<iframe
src="https://public.wast-o.org/calendar?cityId=city-uuid&lang=fr"
width="100%"
height="600"
frameborder="0"
allowfullscreen
></iframe>
</body>
</html>
Exemple avec paramètres avancés
<iframe
src="https://public.wast-o.org/calendar?cityId=city-uuid&placeId=place-uuid&lang=fr&theme=light"
width="100%"
height="600"
frameborder="0"
allowfullscreen
style="border: 1px solid #e0e0e0; border-radius: 8px;"
></iframe>
Communication avec l'iframe (postMessage)
Vous pouvez communiquer avec l'iframe pour changer le mois affiché ou récupérer des événements :
// Écouter les messages de l'iframe
window.addEventListener('message', (event) => {
// Vérifier l'origine pour la sécurité
if (event.origin !== 'https://public.wast-o.org') {
return;
}
// Traiter les messages
if (event.data.type === 'calendar:monthChanged') {
console.log('Mois changé:', event.data.month);
}
if (event.data.type === 'calendar:daySelected') {
console.log('Jour sélectionné:', event.data.date);
}
});
// Envoyer des messages à l'iframe
const iframe = document.querySelector('iframe');
iframe.contentWindow.postMessage({
type: 'calendar:setMonth',
month: 5, // Juin (0-indexed)
year: 2024
}, 'https://public.wast-o.org');
Intégration des challenges
URL de base
L'URL de base pour les challenges est :
https://public.wast-o.org/challenges?cityId={cityId}
Paramètres
cityId(requis) : Identifiant unique de la ville (UUID)challengeId(optionnel) : Identifiant d'un challenge spécifiquelang(optionnel) : Code langue (fr, en). Par défaut: frtheme(optionnel) : Thème (light, dark). Par défaut: light
Exemple basique
<!DOCTYPE html>
<html>
<head>
<title>Challenges Wast-o</title>
</head>
<body>
<h1>Défis de tri</h1>
<iframe
src="https://public.wast-o.org/challenges?cityId=city-uuid&lang=fr"
width="100%"
height="800"
frameborder="0"
allowfullscreen
></iframe>
</body>
</html>
Communication avec l'iframe challenges
// Écouter les événements des challenges
window.addEventListener('message', (event) => {
if (event.origin !== 'https://public.wast-o.org') {
return;
}
if (event.data.type === 'challenge:completed') {
console.log('Challenge complété:', event.data.challengeId);
console.log('Score:', event.data.score);
}
if (event.data.type === 'challenge:progress') {
console.log('Progression:', event.data.progress);
}
});
Intégration du quiz
URL de base
L'URL de base pour le quiz est :
https://public.wast-o.org/quiz?cityId={cityId}&challengeId={challengeId}
Paramètres
cityId(requis) : Identifiant unique de la ville (UUID)challengeId(requis) : Identifiant du challenge contenant le quizserieId(optionnel) : Identifiant de la série de questionslang(optionnel) : Code langue (fr, en). Par défaut: fr
Exemple
<iframe
src="https://public.wast-o.org/quiz?cityId=city-uuid&challengeId=challenge-uuid&lang=fr"
width="100%"
height="600"
frameborder="0"
allowfullscreen
></iframe>
Responsive Design
Pour rendre l'iframe responsive, utilisez cette technique :
<div style="position: relative; padding-bottom: 75%; height: 0; overflow: hidden;">
<iframe
src="https://public.wast-o.org/calendar?cityId=city-uuid"
style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;"
frameborder="0"
allowfullscreen
></iframe>
</div>
Ou avec CSS moderne :
.iframe-container {
position: relative;
width: 100%;
padding-bottom: 75%; /* Ratio 4:3 */
height: 0;
overflow: hidden;
}
.iframe-container iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border: none;
}
<div class="iframe-container">
<iframe
src="https://public.wast-o.org/calendar?cityId=city-uuid"
allowfullscreen
></iframe>
</div>
Sécurité et Content Security Policy (CSP)
Si votre site utilise CSP, vous devrez autoriser l'iframe :
<meta http-equiv="Content-Security-Policy"
content="frame-src https://public.wast-o.org;">
Ou dans votre configuration serveur :
Content-Security-Policy: frame-src https://public.wast-o.org;
Gestion des erreurs
L'iframe peut renvoyer des erreurs via postMessage :
window.addEventListener('message', (event) => {
if (event.origin !== 'https://public.wast-o.org') {
return;
}
if (event.data.type === 'error') {
console.error('Erreur dans l\'iframe:', event.data.message);
// Afficher un message à l'utilisateur
}
if (event.data.type === 'loading') {
console.log('Chargement...');
}
if (event.data.type === 'loaded') {
console.log('Contenu chargé');
}
});
Exemple complet
Voici un exemple complet d'intégration avec gestion d'erreurs et communication :
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Intégration Wast-o</title>
<style>
.container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
.iframe-wrapper {
position: relative;
width: 100%;
padding-bottom: 75%;
height: 0;
overflow: hidden;
border: 1px solid #e0e0e0;
border-radius: 8px;
margin-top: 20px;
}
.iframe-wrapper iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border: none;
}
.error-message {
display: none;
padding: 20px;
background-color: #ffebee;
color: #c62828;
border-radius: 8px;
margin-top: 20px;
}
</style>
</head>
<body>
<div class="container">
<h1>Calendrier de collecte Wast-o</h1>
<div class="iframe-wrapper">
<iframe
id="wasto-calendar"
src="https://public.wast-o.org/calendar?cityId=city-uuid&lang=fr"
allowfullscreen
></iframe>
</div>
<div id="error-message" class="error-message"></div>
</div>
<script>
const iframe = document.getElementById('wasto-calendar');
const errorDiv = document.getElementById('error-message');
// Gestion des erreurs
window.addEventListener('message', (event) => {
if (event.origin !== 'https://public.wast-o.org') {
return;
}
if (event.data.type === 'error') {
errorDiv.textContent = `Erreur: ${event.data.message}`;
errorDiv.style.display = 'block';
} else if (event.data.type === 'loaded') {
errorDiv.style.display = 'none';
}
});
// Gestion des erreurs de chargement de l'iframe
iframe.addEventListener('error', () => {
errorDiv.textContent = 'Impossible de charger le calendrier. Veuillez réessayer plus tard.';
errorDiv.style.display = 'block';
});
</script>
</body>
</html>
Bonnes pratiques
- Toujours vérifier l'origine : Vérifiez toujours
event.originlors de la réception de messages - Gérer les erreurs : Implémentez une gestion d'erreurs robuste
- Responsive : Assurez-vous que l'iframe s'adapte à différentes tailles d'écran
- Accessibilité : Ajoutez des attributs
titleetaria-labelà l'iframe - Performance : Utilisez
loading="lazy"pour les iframes non visibles immédiatement
Limitations
- Les iframes peuvent être bloquées par certains navigateurs ou extensions
- La personnalisation est limitée par les contraintes de sécurité des iframes
- Les performances peuvent être inférieures à une intégration native
- Certaines fonctionnalités peuvent être limitées par les politiques de sécurité
Pour une intégration plus avancée, consultez la documentation des composants React, Vue ou Svelte.