From 7f9ae22f26f8637affcc70f84e88b1e101b549f6 Mon Sep 17 00:00:00 2001
From: nicod_ <nicod@lerebooteux.fr>
Date: Sun, 16 Apr 2023 19:54:01 +0200
Subject: [PATCH] =?UTF-8?q?Un=20formulaire=20d'=C3=A9dition=20de=20bloc=20?=
 =?UTF-8?q?en=20deux=20temps=20:=20choix=20du=20type,=20puis=20saisie?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 formulaires/editer_bloc.html |  28 ++---
 formulaires/editer_bloc.php  | 220 +++++++++++++++++------------------
 lang/bloc_fr.php             |   4 +
 3 files changed, 120 insertions(+), 132 deletions(-)

diff --git a/formulaires/editer_bloc.html b/formulaires/editer_bloc.html
index 41a8c53..991d6ff 100644
--- a/formulaires/editer_bloc.html
+++ b/formulaires/editer_bloc.html
@@ -2,31 +2,23 @@
 	[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV**{message_ok})</p>]
 	[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
 
-	<BOUCLE_editable(CONDITION){si #ENV{editable}}>
-
 	<form method='post' action='[(#ENV{action}|ancre_url{[formulaire_#ENV{form}-(#ENV{id,nouveau})]})]' enctype='multipart/form-data'><div>
 		#ACTION_FORMULAIRE{#ENV{action}}
-		<input type="hidden" name="id_bloc" value="#ID_BLOC">
 
 		<div class="editer-groupe">
-			#SET{saisies, #ENV{_saisies}}
-			[(#ENV{_etape}|oui)
-				[(#ENV{_saisies/options/etapes_ignorer_recapitulatif}|non|et{#ENV{_etape}|=={#ENV{_etapes}}}|oui)
-					<INCLURE{fond=formulaires/inc-saisies-cvt-etapes-recapitulatif,env} />
-				]
-				[(#ENV{_saisies/options/etapes_ignorer_recapitulatif}|non|et{#ENV{_etape}|=={#ENV{_etapes}}}|non)
-					#SET{saisies, #GET{etapes}|table_valeur{etape_#ENV{_etape}/saisies}}
-					#GENERER_SAISIES{#GET{saisies},saisies_par_etapes=#ENV{_saisies_par_etapes}}
-				]
-			]
-			[(#ENV{_etape}|non)
-				#GENERER_SAISIES{#GET{saisies}}
-			]
+			#GENERER_SAISIES{#ENV{_saisies}}
 		</div>
 
-		<INCLURE{fond=formulaires/inc-saisies-cvt-boutons,saisies_texte_submit=<:bouton_valider:>,env} />
+		<p class="boutons">
+			[(#ENV{id_blocs_type}|non)
+				<button type="submit" class="submit" name="choisir" value="1"><:bloc:bouton_choisir:/></button>
+			]
+			[(#ENV{id_blocs_type}|oui)
+				<button type="submit" class="submit" name="ajouter" value="1"><:bloc:bouton_ajouter:></button>
+				<button type="submit" class="submit btn_secondaire"  name="annuler" value="1" formnovalidate><:bouton_annuler:></button>
+			]
+		</p>
 
 	</div></form>
 
-	</BOUCLE_editable>
 </div>
diff --git a/formulaires/editer_bloc.php b/formulaires/editer_bloc.php
index a9346ac..b6e9f94 100644
--- a/formulaires/editer_bloc.php
+++ b/formulaires/editer_bloc.php
@@ -17,70 +17,6 @@ include_spip('blocks_fonctions');
 include_spip('inc/actions');
 include_spip('inc/editer');
 
-/**
- * Déclaration des saisies de bloc
- *
- * @param int|string $id_bloc  Identifiant du bloc. 'new' pour un nouveau bloc.
- * @param null       $objet    Type d'objet à associer (article, rubrique,...)
- * @param null       $id_objet Id de l'objet à associer
- * @param null       $retour   URL de redirection après le traitement
- * @return array               Saisies du formulaire
- */
-function formulaires_editer_bloc_saisies_dist($id_bloc = 'new', $objet = null, $id_objet = null, $retour = null) {
-	if ((int)$id_bloc) {
-		$id_blocs_type = (int)sql_getfetsel('id_blocs_type', 'spip_blocs', 'id_bloc = ' . $id_bloc);
-	} else {
-		$id_blocs_type = (int)_request('id_blocs_type');
-	}
-
-	$saisies_bloc_type = [];
-	if ($id_blocs_type && ($saisies_json = sql_getfetsel('saisies', 'spip_blocs_types', 'id_blocs_type = ' . $id_blocs_type))) {
-		$saisies_bloc_type = blocks_deserialize($saisies_json);
-	}
-
-	$saisies = [
-		'options' =>
-			[
-				'texte_submit'                    => '',
-				'afficher_si_submit'              => '',
-				'etapes_activer'                  => 'on',
-				'etapes_presentation'             => 'courante',
-				'etapes_suivant'                  => '',
-				'etapes_precedent'                => '',
-				'etapes_precedent_suivant_titrer' => '',
-				'etapes_ignorer_recapitulatif'    => 'on',
-				'verifier_valeurs_acceptables'    => '',
-			],
-		[
-			'saisie'  => 'fieldset',
-			'options' => [
-				'nom'   => 'bloc_config',
-				'label' => _T('bloc:champ_bloc_config_label'),
-			],
-			'saisies' => [
-				[
-					'saisie'  => ($id_blocs_type ? 'hidden' : 'blocs_types'),
-					'options' => [
-						'nom'         => 'id_blocs_type',
-						'obligatoire' => 'oui',
-						'label'       => _T('bloc:champ_id_blocs_type_label'),
-					],
-				],
-			],
-		],
-		[
-			'saisie'  => 'fieldset',
-			'options' => [
-				'nom'   => 'bloc_contenu',
-				'label' => _T('bloc:champ_bloc_contenu_label'),
-			],
-			'saisies' => $saisies_bloc_type,
-		],
-	];
-
-	return $saisies;
-}
-
 /**
  * Identifier le formulaire en faisant abstraction des paramètres qui ne représentent pas l'objet edité
  *
@@ -107,31 +43,62 @@ function formulaires_editer_bloc_identifier_dist($id_bloc = 'new', $objet = null
  * @uses formulaires_editer_objet_charger()
  */
 function formulaires_editer_bloc_charger_dist($id_bloc = 'new', $objet = null, $id_objet = null, $retour = null) {
+	if (!$objet || !(int)$id_objet) {
+		return null;
+	}
+
 	if ((int)$id_bloc) {
 		$id_blocs_type = (int)sql_getfetsel('id_blocs_type', 'spip_blocs', 'id_bloc = ' . $id_bloc);
+		$valeurs = formulaires_editer_objet_charger('bloc', $id_bloc, $id_blocs_type, 0, $retour, '');
 	} else {
-		$id_blocs_type = (int)_request('id_blocs_type');
+		$id_blocs_type = _request('id_blocs_type');
 	}
 
-	$valeurs = formulaires_editer_objet_charger('bloc', $id_bloc, $id_blocs_type, 0, $retour, '');
-	if (!$valeurs['id_blocs_type']) {
+	if ($id_blocs_type) {
+		// charger les saisies du type de bloc
+		$saisies_bloc_type = [];
+		if ($saisies_json = sql_getfetsel('saisies', 'spip_blocs_types', 'id_blocs_type = ' . $id_blocs_type)) {
+			$saisies_bloc_type = blocks_deserialize($saisies_json);
+		}
+		$valeurs['_saisies'] = saisies_inserer(
+			$saisies_bloc_type,
+			[
+				'saisie'  => 'hidden',
+				'options' => [
+					'nom'         => 'id_blocs_type',
+					'obligatoire' => 'oui',
+				],
+			],
+			0
+		);
 		$valeurs['id_blocs_type'] = $id_blocs_type;
-	}
-	$valeurs['saisies'] = call_user_func_array('formulaires_editer_bloc_saisies_dist', func_get_args());
 
-	// mettre à jour le bloc avec les valeurs saisies
-	$saisies_bloc_type = [];
-	if ($saisies_json = sql_getfetsel('saisies', 'spip_blocs_types', 'id_blocs_type = ' . $id_blocs_type)) {
-		$saisies_bloc_type = blocks_deserialize($saisies_json);
-	}
-	if ($valeurs_saisies = blocks_deserialize($valeurs['valeurs'])) {
+		// charger les valeurs déjà saisies
+		$valeurs_saisies = blocks_deserialize($valeurs['valeurs'] ?? null);
 		include_spip('inc/saisies_lister');
 		$saisies_par_nom = saisies_lister_par_nom($saisies_bloc_type);
 		foreach ($saisies_par_nom as $nom => $saisie) {
-			$valeurs[$nom] = $valeurs_saisies[$nom];
+			if ((int)$id_bloc) {
+				$valeurs[$nom] = (_request($nom) ? _request($nom) : $valeurs_saisies[$nom]);
+			} else {
+				$valeurs[$nom] = '';
+			}
 		}
-	}
 
+	} else {
+
+		$valeurs['_saisies'] = [
+			[
+				'saisie'  => 'blocs_types',
+				'options' => [
+					'nom'         => 'id_blocs_type',
+					'obligatoire' => 'oui',
+					'label'       => _T('bloc:champ_id_blocs_type_label'),
+				],
+			],
+		];
+
+	}
 	return $valeurs;
 }
 
@@ -144,64 +111,89 @@ function formulaires_editer_bloc_charger_dist($id_bloc = 'new', $objet = null, $
  * @param string     $retour   URL de redirection après le traitement
  * @param null       $objet    Type d'objet à associer (article, rubrique,...)
  * @param null       $id_objet Id de l'objet à associer
- * @return array                    Tableau des erreurs
+ * @return array               Tableau des erreurs
  * @uses formulaires_editer_objet_verifier()
  */
-//function formulaires_editer_bloc_verifier_dist($id_bloc = 'new', $objet = null, $id_objet = null, $retour = null) {
-//	$erreurs = formulaires_editer_objet_verifier('bloc', $id_bloc, ['id_blocs_type']);
-//	return $erreurs;
-//}
+function formulaires_editer_bloc_verifier_dist($id_bloc = 'new', $objet = null, $id_objet = null, $retour = null) {
+	if ((int)$id_bloc) {
+		$id_blocs_type = (int)sql_getfetsel('id_blocs_type', 'spip_blocs', 'id_bloc = ' . $id_bloc);
+	} else {
+		$id_blocs_type = _request('id_blocs_type');
+	}
+	$erreurs = [];
+
+	if (_request('choisir') && !$id_blocs_type) {
+		$erreurs['id_blocs_type'] = _T('info_obligatoire');
+	}
+
+	if (_request('ajouter')) {
+		if ($id_blocs_type) {
+			// charger les saisies du type de bloc
+			$saisies_bloc_type = [];
+			if ($saisies_json = sql_getfetsel('saisies', 'spip_blocs_types', 'id_blocs_type = ' . $id_blocs_type)) {
+				$saisies_bloc_type = blocks_deserialize($saisies_json);
+			}
+			$erreurs = saisies_verifier($saisies_bloc_type);
+		} else {
+			$erreurs['id_blocs_type'] = _T('info_obligatoire');
+		}
+	}
+
+	return $erreurs;
+}
 
 /**
  * Traitement du formulaire d'édition de bloc
  *
  * Traiter les champs postés
  *
- * @param int|string $id_bloc  Identifiant du bloc. 'new' pour un nouveau bloc.
- * @param string     $retour   URL de redirection après le traitement
- * @param null       $objet    Type d'objet à associer (article, rubrique,...)
- * @param null       $id_objet Id de l'objet à associer
- * @return array               Retours des traitements
+ * @param int|string $id_bloc       Identifiant du bloc. 'new' pour un nouveau bloc.
+ * @param int|string $id_blocs_type Type de bloc
+ * @param string     $retour        URL de redirection après le traitement
+ * @param null       $objet         Type d'objet à associer (article, rubrique,...)
+ * @param null       $id_objet      Id de l'objet à associer
+ * @return array                    Retours des traitements
  * @uses formulaires_editer_objet_traiter()
  */
 function formulaires_editer_bloc_traiter_dist($id_bloc = 'new', $objet = null, $id_objet = null, $retour = null) {
 	if ((int)$id_bloc) {
 		$id_blocs_type = (int)sql_getfetsel('id_blocs_type', 'spip_blocs', 'id_bloc = ' . $id_bloc);
 	} else {
-		$id_blocs_type = (int)_request('id_blocs_type');
+		$id_blocs_type = _request('id_blocs_type');
 	}
+	$retours = [];
 
-	$retours = formulaires_editer_objet_traiter('bloc', $id_bloc, $id_blocs_type, 0, $retour, '');
+	if ($id_blocs_type && $objet && (int)$id_objet && _request('ajouter')) {
 
-	if ($id_bloc = $retours['id_bloc']) {
+		$retours = formulaires_editer_objet_traiter('bloc', $id_bloc, $id_blocs_type, 0, $retour, '');
 
-		// mettre à jour le bloc avec les valeurs saisies
-		$saisies_bloc_type = [];
-		if ($saisies_json = sql_getfetsel('saisies', 'spip_blocs_types', 'id_blocs_type = ' . $id_blocs_type)) {
-			$saisies_bloc_type = blocks_deserialize($saisies_json);
-		}
-		include_spip('inc/saisies_lister');
-		$valeurs = [];
-		$saisies_par_nom = saisies_lister_par_nom($saisies_bloc_type);
-		foreach ($saisies_par_nom as $nom => $saisie) {
-			$valeurs[$nom] = _request($nom);
-		}
-		sql_updateq('spip_blocs', ['valeurs' => blocks_serialize($valeurs)], 'id_bloc = ' . $id_bloc);
-
-		// associer à l'objet
-		if ($objet
-			&& ($id_objet = (int)$id_objet)
-			&& autoriser('modifier', $objet, $id_objet)
-		) {
-			include_spip('action/editer_liens');
-			objet_associer(['bloc' => $id_bloc], [$objet => $id_objet]);
-
-			if (isset($retours['redirect'])) {
-				$retours['redirect'] = parametre_url($retours['redirect'], 'id_lien_ajoute', $id_bloc, '&');
+		if ($id_bloc = $retours['id_bloc']) {
+
+			// mettre à jour le bloc avec les valeurs saisies
+			$saisies_bloc_type = [];
+			if ($saisies_json = sql_getfetsel('saisies', 'spip_blocs_types', 'id_blocs_type = ' . $id_blocs_type)) {
+				$saisies_bloc_type = blocks_deserialize($saisies_json);
 			}
+			include_spip('inc/saisies_lister');
+			$valeurs = [];
+			$saisies_par_nom = saisies_lister_par_nom($saisies_bloc_type);
+			foreach ($saisies_par_nom as $nom => $saisie) {
+				$valeurs[$nom] = _request($nom);
+			}
+			sql_updateq('spip_blocs', ['valeurs' => blocks_serialize($valeurs)], 'id_bloc = ' . $id_bloc);
 
-		}
+			// associer à l'objet
+			if (autoriser('modifier', $objet, $id_objet)) {
+				include_spip('action/editer_liens');
+				objet_associer(['bloc' => $id_bloc], [$objet => $id_objet]);
 
+				if (isset($retours['redirect'])) {
+					$retours['redirect'] = parametre_url($retours['redirect'], 'id_lien_ajoute', $id_bloc, '&');
+				}
+
+			}
+
+		}
 	}
 
 	return $retours;
diff --git a/lang/bloc_fr.php b/lang/bloc_fr.php
index 925ed59..6ce20a0 100644
--- a/lang/bloc_fr.php
+++ b/lang/bloc_fr.php
@@ -10,6 +10,10 @@ $GLOBALS[$GLOBALS['idx_lang']] = [
 	// A
 	'ajouter_lien_bloc'                   => 'Ajouter ce bloc',
 
+	// B
+	'bouton_ajouter'                      => 'Ajouter ce bloc',
+	'bouton_choisir'                      => 'Choisir',
+
 	// C
 	'champ_bloc_config_label'             => 'Configuration du bloc',
 	'champ_bloc_contenu_label'            => 'Contenu du bloc',
-- 
GitLab