Le projet HolyBus est une plateforme de gestion multi-services déployée sur une architecture de sous-domaines. Chaque dossier représente un service indépendant accessible via un sous-domaine spécifique, permettant une organisation modulaire et une maintenance simplifiée.
holybus/ ├── main/ # Site principal (domaine racine) ├── www/ # Service web principal ├── client/ # Interface client ├── admin/ # Back-office administrateur ├── mobile/ # Services mobiles par partenaire │ ├── touriscar/ │ ├── artis/ │ ├── evolity/ │ ├── ccva/ │ ├── procars/ │ └── hegobus/ ├── stats/ # Service de statistiques └── url/ # Service de gestion d'URLs
// Configuration type noop::config(array( 'pdo' => array('db' => 'mysql,host=...;dbname=...,user,password'), 'path' => array( 'controller' => 'secure/control', 'view' => 'secure/view' ) )); // Démarrage de l'application noop::start();
index.phplib/ (jQuery, CSS, ressources visuelles)secure/ (contrôleurs, vues, fonctions)index.php secure/global.iniChaque partenaire possède sa propre instance :
index.php, secure/, lib/, img/, perso/mobile/doc/ avec assets CSS/JS.ini, .htaccess, .php-inisecure/control/secure/view/lib/, img/perso/[pdo] db = "mysql,host=154clm.myd.infomaniak.com;dbname=154clm_admin,154clm_holybus,89hG?#56m-wRF" db2 = "mysql,host=154clm.myd.infomaniak.com;dbname=154clm_url,154clm_holybus,89hG?#56m-wRF"
Format : mysql,host=HOST;dbname=DATABASE,USER,PASSWORD
define('DEV', (in_array($_SERVER['HTTP_HOST'], array('serveurweb', '192.168.2.200'))));
Le système utilise 2 bases de données MySQL distinctes avec des rôles spécifiques :
admin_clients : Gestion des clients transportadmin_campagnes : Campagnes de communicationadmin_codes : Codes QR et contenus associésurl : Mapping code -> URL longue154clm_holybus89hG?#56m-wRF// Processus de synchronisation des codes QR $pdo = new PDO('154clm_admin'); // Source : clients et campagnes $pdo2 = new PDO('154clm_url'); // Destination : URLs courtes // Mapping automatique : QR Code -> URL mobile foreach ($clients as $client) { // Lecture fichier QRCodes.txt du client // Mise à jour table url pour redirection // Mise à jour admin_codes avec contenu JSON }
db (admin), accès données clients/campagnesdb (url), dbadmin (admin) pour les référencesdb (admin) pour authentification et données// Accès base admin pour données clients 'pdo' => array('db' => '154clm_admin')
// Double accès pour redirection et logging 'pdo' => array( 'db' => '154clm_url', // URLs courtes 'dbadmin' => '154clm_admin' // Référentiel clients )
// Accès admin pour authentification partenaires 'pdo' => array('db' => '154clm_admin')
QR Code [12345] → Fichier QRCodes.txt → Base admin_codes → Base url → Redirection : url.holybus.fr/12345 → m.holybus.fr/client/arret/LOC
NoopException, NoopConfigException, NoopControllerException, NoopViewExceptionexception_callback() avec notification par emailLogger pour traçabilitémail( 'webmaster@domain.com', 'Error '.$code.': '.$message, $stackTrace, 'Content-type: text/html; charset=utf-8' );
global.iniChaque service est déployé sur son sous-domaine :
www.holybus.fr → main/client.holybus.fr → client/admin.holybus.fr → admin/touriscar.holybus.fr → mobile/touriscar/?no-cache
Le script admin/secure/control/batchCampagne.php est l'outil principal pour générer massivement des campagnes de codes QR pour les clients transport. Il automatise la création de codes QR, miniURLs, et fichiers de production.
// Configuration par campagne $id_campagne = 271; $societe = 'evolity'; $lot = '11cm'; $destination_url = 'https://evolity.holybus.fr/';
admin_campagnes154clm_urladmin_codesholybus-campagne-271_11cm.csv # Liste des codes générés holybus-campagne-271_11cm-indesign.csv # Chemins pour InDesign
out/qrcodes-271_11cm/ ├── code-12345.png ├── code-12346.png └── ...
{
"url": "https://evolity.holybus.fr/",
"miniurl": "https://url.holybus.fr/12345"
}
# Upload d'un mapping ID miniURL <-> ID SIRI curl -k -F "csv=@./holybus-campagne-269-idSiri.csv" \ https://admin.holytag.org/import
Note : Pas d'authentification requise pour l'endpoint import
[id_code, siri_code]https://m.holybus.fr/societe/arret/SIRI_CODEadmin_codes + urlcf. https://app.asana.com/1/1530398085277/project/1205755380967232/task/1209326056812982?focus=true
admin/secure/control/batchCampagne.phpadmin/secure/control/import.php# Accès navigateur pour générer codes + QR Codes + liste associations https://admin.holytag.org/batchCampagne
Sorties générées :
code = miniURL"ID miniURL" + "ID SIRI"holybus-campagne-[ID]-idSiri.csvcurl -k -F "csv=@./holybus-campagne-269-idSiri.csv" \ https://admin.holytag.org/import
url.holybus.fr/12345 → m.holybus.fr/client/arret/SIRI_CODEclass QR { const URL = 'http://qr.lca.fr/'; const AUTH = 'webmaster:ChrAle09lca'; static public function generate($data) { // Appel API externe pour génération PNG // Paramètres : size=4, ecc=L, margin=2 } }
QR Code physique → url.holybus.fr/12345 → m.holybus.fr/client/arret/LOC
usleep(300) pour éviter la surcharge APIhttps://url.holybus.fr/'api' => array( 'url' => 'https://url.holybus.fr/', 'url-auth' => 'webmaster:ChrAle09lca' )
admin/secure/global.ini : Configuration principaleclient/index.php : Configuration client*/noop.php : Framework coresecure/control/, vues dans secure/view/Documentation générée automatiquement - Projet HolyBus
Si jamais les URLs cibles sont identiques et pointent sur l'accueil du site client, c'est qu'il y a eu un manquement dans l'utilisation du batchCampagne. Il convient donc de regénérer les URLs en prenant le code de l'arrêt indiqué au début du libellé de admin_codes. Ce travail peut se faire en masse (cf. chat Holybus - mise à jour en masse des URLs cibles) via le SQL suivant (à adapter bien-sûr) :
UPDATE 154clm_admin.admin_codes AS ac JOIN 154clm_url.url AS u ON u.code = ac.id_code /* calcule CODEARRET = premiers caractères du libellé avant "-" */ JOIN ( SELECT id_code, TRIM(SUBSTRING_INDEX(libelle, '-', 1)) AS code_arret FROM 154clm_admin.admin_codes ) AS x ON x.id_code = ac.id_code SET /* nouvelle URL normalisée */ u.url = CONCAT('https://evolity.holybus.fr/arret/', x.code_arret), /* mise à jour du JSON si valide : contenu.url := nouvelle URL */ ac.contenu = CASE WHEN JSON_VALID(ac.contenu) THEN JSON_SET(ac.contenu, '$.url', CONCAT('https://evolity.holybus.fr/arret/', x.code_arret)) ELSE ac.contenu END WHERE u.url LIKE '%evolity%' AND ac.libelle NOT LIKE 'Campagne Pack%' AND x.code_arret <> '';