Je vais essayer d’être plus clair, parce que je ne parviens pas à tirer de la réponse de @b_b de quoi arriver à mes fins.
Le plugin precipitations\core
déclare un objet Station et présente le formulaire suivant (fichier editer_station.html
vierge, tout est déclaré dans le editer_station.php
:
function formulaires_editer_station_saisies_dist($id_station = 'new', $retour = '', $lier_trad = 0, $config_fonc = '', $row = [], $hidden = '') {
$saisies = [
'options' => [
'afficher_si_avec_post' => true,
],
[
'saisie' => 'fieldset',
'options' => [
'nom' => 'definition',
'label' => _T('station:champ_description_label'),
],
'saisies' => [
[
'saisie' => 'input',
'options' => [
'nom' => 'titre',
'obligatoire' => 'oui',
'label' => _T('station:champ_titre_label'),
'explication' => _T('station:champ_titre_explication'),
],
],
[
'saisie' => 'selection',
'options' => [
'nom' => 'type',
'obligatoire' => 'oui',
'label' => _T('station:champ_type_label'),
'explication' => _T('station:champ_type_explication'),
'data' => [],
],
],
]
]
];
return $saisies;
}
Le plugin precipitations/modules/netatmo
de son côté ajoute quelques champs à la table spip_stations et va « surcharger » le formulaire d’édition des stations via le pipeline formulaire_saisie
:
function netatmo_formulaire_saisies($flux): array {
if ($flux['args']['form'] == 'editer_station') {
// On ajoute une option dans le select de type de station
$flux['data'][0]['saisies'][1]['options']['data'] = array_merge($flux['data'][0]['saisies'][1]['options']['data'], ['netatmo' => _T('netatmo:netatmo')]);
// Ajout des champs nécessaires à la configuration d'un pluvio Netatmo
include_spip('inc/saisies');
$flux['data'][] = [
'saisie' => 'fieldset',
'options' => [
'nom' => 'netatmo_authentification',
'label' => _T('netatmo:champ_netatmo_authentification_label'),
'afficher_si' => '@type@ == "netatmo"',
'afficher_si_avec_post' => 'oui',
],
'saisies' => [
[
'saisie' => 'input',
'options' => [
'nom' => 'netatmo_client_id',
'label' => _T('netatmo:champ_netatmo_client_id_label'),
'explication' => _T('netatmo:champ_netatmo_client_id_explication'),
'obligatoire' => 'oui'
]
],
[
'saisie' => 'input',
'options' => [
'nom' => 'netatmo_client_secret',
'label' => _T('netatmo:champ_netatmo_client_secret_label'),
'explication' => _T('netatmo:champ_netatmo_client_secret_explication'),
'obligatoire' => 'oui'
]
],
[
'saisie' => 'input',
'options' => [
'nom' => 'netatmo_access_token',
'label' => _T('netatmo:champ_netatmo_access_token_label'),
'explication' => _T('netatmo:champ_netatmo_access_token_explication'),
'obligatoire' => 'oui',
]
],
[
'saisie' => 'input',
'options' => [
'nom' => 'netatmo_refresh_token',
'label' => _T('netatmo:champ_netatmo_refresh_token_label'),
'explication' => _T('netatmo:champ_netatmo_refresh_token_explication'),
'obligatoire' => 'oui',
]
],
],
];
$flux['data'][] = [
'saisie' => 'fieldset',
'options' => [
'nom' => 'netatmo_choix_station',
'label' => _T('netatmo:champ_netatmo_choix_station_label'),
'afficher_si' => '@type@ == "netatmo"',
'afficher_si_avec_post' => 'oui',
],
'saisies' => [
[
'saisie' => 'selection',
'options' => [
'nom' => 'netatmo_device_id',
'label' => _T('netatmo:champ_netatmo_device_id_label'),
'explication' => _T('netatmo:champ_netatmo_device_id_explication'),
'obligatoire' => 'oui',
'data' => _request('netatmo_device_mac')
]
],
[
'saisie' => 'date',
'options' => [
'nom' => 'netatmo_debut',
'label' => _T('station:champ_debut_label'),
'explication' => _T('station:champ_debut_explication'),
],
],
],
];
// On ajoute les options pour le multi-étapes
$options = $flux['data']['options'];
if (!is_null(array_keys($options, 'etapes_activer'))) {
$flux['data']['options'] = ['etapes_activer' => true, 'etapes_ignorer_recapitulatif' => true];
}
}
return $flux;
}
On obtient ainsi un formulaire multi-étapes : en première étape, on sélectionne le type de station, en seconde étape on fournit les informations d’authentification, et enfin, on sélectionne la station souhaitée parmi une liste retournée par l’API Netatmo.
Tout fonctionne bien pour le cas nominal, lorsque l’on a saisi les bonnes informations d’authentification.
Avec le pipeline suivant :
function netatmo_formulaire_verifier($flux): array {
if ($flux['args']['form'] == 'editer_station') {
// Une fois qu'on a validé la deuxième étape de la création d'une station Netatmo
if (
_request('netatmo_client_id') !== null
&& _request('netatmo_client_secret') !== null
&& _request('netatmo_access_token') !== null
&& _request('netatmo_refresh_token') !== null
) {
try {
$stations = netatmo_lister_stations_dist(
_request('netatmo_client_id'),
_request('netatmo_client_secret'),
_request('netatmo_access_token'),
_request('netatmo_refresh_token')
);
set_request('netatmo_device_mac', $stations);
} catch (Exception $e) {
$flux['data']['netatmo_device_mac'] = $e->getMessage();
}
}
}
return $flux;
}
qui fait appel au fichier de fonctions avec :
function netatmo_authentifier_application_dist(
string $client_id,
string $client_secret,
string $access_token,
string $refresh_token
): \Netatmo\Clients\NAWSApiClient {
$config = [
'client_id' => $client_id,
'client_secret' => $client_secret,
'access_token' => $access_token,
'refresh_token' => $refresh_token,
];
$client = new \Netatmo\Clients\NAWSApiClient($config);
$tokens = $client->getAccessToken();
$nat = $tokens['access_token'];
if ($access_token !== $nat) {
sql_updateq(
'spip_stations',
['access_token' => $nat],
'refresh_token = "' . $refresh_token . '"'
);
}
return $client;
}
function netatmo_lister_stations_dist(
string $client_id,
string $client_secret,
string $access_token,
string $refresh_token
): array {
$client = netatmo_authentifier_application_dist($client_id, $client_secret, $access_token, $refresh_token);
$data = $client->getData();
$devices = $data['devices'];
$stations = [];
foreach ($devices as $device) {
$stations[$device['_id']] = $device['station_name'];
}
return $stations;
}
Ce que je ne veux pas c’est retourner une liste de stations vide si les informations d’authentification sont mauvaises et si l’API me renvoie une erreur.
L’idée serait donc d’afficher un message d’erreur « global » à la manière de SVP, le genre de message qui fait tout trembler. Mais qu’appeler pour cela ?