diff --git a/formulaires/editer_blocs_type_champs.html b/formulaires/editer_blocs_type_champs.html new file mode 100644 index 0000000000000000000000000000000000000000..fe5ca96021eedd97ed9368340cd615088bfa9eb2 --- /dev/null +++ b/formulaires/editer_blocs_type_champs.html @@ -0,0 +1,55 @@ + +<div class="formulaire_spip formulaire_editer formulaire_#ENV{form}[ formulaire_#ENV{form}-(#ENV{id,nouveau})]"> + [(#ALERTE_MESSAGE{<:saisies:construire_attention_enregistrer:>, '', info message_saisies_modifiees})] + #SET{construire_formulaire,''} + [(#ENV*{message_erreur}|non|ou{#ENV*{erreurs/saisies_modifiees_parallele}}|ou{#ENV{erreurs/saisies_incoherence_afficher_si}}) + #SET{construire_formulaire,oui} + ] + [<p class="reponse_formulaire reponse_formulaire_ok" role="status">(#ENV**{message_ok})</p>] + [(#ENV*{message_erreur}|oui) + [(#GET{construire_formulaire}|oui) + [<p class="reponse_formulaire reponse_formulaire_erreur" role="alert">(#ENV*{message_erreur})</p>] + ] + [(#GET{construire_formulaire}|non) + #ALERTE_MESSAGE{#ENV*{message_erreur}} + ] + ] + [(#GET{construire_formulaire}|oui) + <div class="ajax"> + #FORMULAIRE_CONSTRUIRE_FORMULAIRE{#ENV{saisie_id}, #ENV{_saisies}, #ARRAY{options_globales,#ENV{_options_globales}}} + </div> + ] + [(#ENV{editable}|oui) + <form method="post" action="#ENV{action}" enctype="multipart/form-data"><div> + [(#REM) declarer les hidden qui declencheront le service du formulaire + parametre : url d'action ] + #ACTION_FORMULAIRE{#ENV{action}} + <input type="hidden" name="id_blocs_type" value="#ENV{id_blocs_type}" /> + + <div class="boutons"> + <span class='image_loading'></span> + + <div class="groupe-btns"> + [(#GET{construire_formulaire}|non) + <input type='submit' class='submit btn_secondaire' name="annulation" value='<:bouton_annuler|attribut_html:>' /> + <input type='submit' class='submit' name="enregistrer_confirmation" value='<:bouton_enregistrer|attribut_html:>' /> + ] + [(#GET{construire_formulaire}|oui) + <input type='submit' class='submit revert btn_secondaire' name="revert" value='<:formidable:bouton_revert_formulaire|attribut_html:>' + onclick="return confirm('<:saisies:construire_reinitialiser_confirmer:>')" /> + <input type='submit' class='submit' name="enregistrer" value='<:bouton_enregistrer|attribut_html:>' /> + ] + </div> + + </div> + </div></form> + ] +</div> +<style> + .formulaire_edit .formulaire_editer_formulaire_champs .message_reinitialiser, + .formulaire_edit .formulaire_editer_formulaire_champs #reinitialiser {display: none;} + + .formulaire_spip .message_saisies_modifiees,input.revert {display: none;} + .modifie .message_saisies_modifiees {display: block;} + .modifie input.revert {display: inline-block;} +</style> diff --git a/formulaires/editer_blocs_type_champs.php b/formulaires/editer_blocs_type_champs.php new file mode 100644 index 0000000000000000000000000000000000000000..0d322c2a12f7504972053977785ea7b799b10d3a --- /dev/null +++ b/formulaires/editer_blocs_type_champs.php @@ -0,0 +1,151 @@ +<?php + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} + +function formulaires_editer_blocs_type_champs_charger($id_blocs_type, $redirect = '') { + $id_blocs_type = intval($id_blocs_type); + $contexte = []; + $contexte['id_blocs_type'] = $id_blocs_type; + + // On teste si le formulaire existe + if ($id_blocs_type + and $blocs_type = sql_fetsel('*', 'spip_blocs_types', 'id_blocs_type = ' . $id_blocs_type) + and autoriser('editer', 'blocs_type', $id_blocs_type) + ) { + $saisies = json_decode($blocs_type['saisies'], true); + + // Est-ce qu'on restaure une révision ? + if ($id_version = _request('id_version')) { + include_spip('inc/revisions'); + $old = recuperer_version($id_blocs_type, 'blocs_type', $id_version); + $saisies = json_decode($old['saisies'], true); + } + if (!is_array($saisies)) { + $saisies = []; + } + $contexte['_saisies'] = $saisies; + $contexte['id'] = $id_blocs_type; + $contexte['saisie_id'] = "blocs_type_$id_blocs_type"; + + } + + return $contexte; +} + +function formulaires_editer_blocs_type_champs_verifier($id_blocs_type, $redirect = '') { + include_spip('inc/saisies'); + $erreurs = []; + + // Si c'est pas une confirmation ni une annulation, ni un revert + if (!_request('enregistrer_confirmation') + and !($annulation = _request('annulation')) + and !_request('revert') + ) { + // On récupère le formulaire dans la session + $saisies_nouvelles = session_get("constructeur_formulaire_blocs_type_$id_blocs_type"); + $md5_precedent_formulaire_initial = session_get("constructeur_formulaire_blocs_type_$id_blocs_type" . '_md5_formulaire_initial'); + + // On récupère les anciennes saisies + $saisies_anciennes = sql_getfetsel( + 'saisies', + 'spip_blocs_types', + 'id_blocs_type = ' . $id_blocs_type + ); + if (!$saisies_anciennes) { + return $erreurs; + } + // On vérifie que les saisies en bases n'ont pas été modifiés depuis le début de la modification du formulaire + // Si tel est le cas, on demande de recommencer la modif du formulaire, avec la saisie en base + // Ne pas le faire si on est en train de restaurer une vieille version, puisque dans ce cas ce qui compte sera bien sur la veille version qu'on veut restaurer, et pas la version plus récente en base:) + // Attention à s'assurer que tout les elements du tableau soit bien soit des tableaux, soit un string + // En effet, le md5 du formulaire_initial est calculé à partir de ce qui est passé au squelette + // Or dès qu'une valeur est passée à un squelette, elle est changé en string, à cause du mode de compilation (?) + $saisies_anciennes = json_decode($saisies_anciennes, true); + $saisies_anciennes_str = $saisies_anciennes; + array_walk_recursive($saisies_anciennes_str, 'blocs_types_array_walk_recursive_strval'); + $md5_saisies_anciennes = md5(serialize($saisies_anciennes_str)); + if ($md5_precedent_formulaire_initial and $md5_precedent_formulaire_initial != $md5_saisies_anciennes and !_request('id_version')) { + session_set("constructeur_formulaire_blocs_type_$id_blocs_type", $saisies_anciennes); + session_set("constructeur_formulaire_blocs_type_$id_blocs_type" . '_md5_formulaire_initial', $md5_saisies_anciennes); + $erreurs['message_erreur'] = _T('formidable:erreur_saisies_modifiees_parallele'); + $erreurs['saisies_modifiees_parallele'] = _T('formidable:erreur_saisies_modifiees_parallele'); + return $erreurs; + } + + // On compare les anciennes saisies aux nouvelles + $comparaison = saisies_comparer($saisies_anciennes, $saisies_nouvelles); + + // S'il y a des suppressions, on demande confirmation avec attention + if ($comparaison['supprimees']) { + $erreurs['message_erreur'] = _T('saisies:construire_attention_supprime'); + } + + //On vérifie s'il y a pas d'incohérence dans les afficher_si + $erreurs_afficher_si = saisies_verifier_coherence_afficher_si($saisies_nouvelles ?? []); + if ($erreurs_afficher_si) { + $erreurs['saisies_incoherence_afficher_si'] = true; + if ($erreurs['message_erreur'] ?? '') { + $erreurs['message_erreur'] .= '<br />' . $erreurs_afficher_si; + } else { + $erreurs['message_erreur'] = $erreurs_afficher_si; + } + } + } else if (isset($annulation) and $annulation) { + // Si on annule on génère une erreur bidon juste pour réafficher le formulaire + $erreurs['pouetpouet'] = true; + $erreurs['message_erreur'] = ''; + } + + return $erreurs; +} + +function formulaires_editer_blocs_type_champs_traiter($id_blocs_type, $redirect = '') { + include_spip('inc/saisies'); + include_spip('inc/formidable'); + $retours = []; + $id_blocs_type = intval($id_blocs_type); + + if (_request('revert')) { + session_set("constructeur_formulaire_blocs_type_$id_blocs_type"); + $retours = ['editable' => true]; + } + + if (_request('enregistrer') or _request('enregistrer_confirmation')) { + // On récupère le formulaire dans la session + $saisies_nouvelles = session_get("constructeur_formulaire_blocs_type_$id_blocs_type"); + + // On envoie les nouvelles dans la table + include_spip('action/editer_objet'); + $err = objet_modifier('blocs_type', $id_blocs_type, ['saisies' => json_encode(saisies_identifier($saisies_nouvelles))]); + + // Si c'est bon on reinitialise les sessions + if (!$err) { + session_set("constructeur_formulaire_blocs_type_$id_blocs_type"); + session_set("constructeur_formulaire_blocs_type_$id_blocs_type" . '_md5_formulaire_initial'); + } + } + + if (strncmp($redirect, 'javascript:', 11) == 0) { + $retours['message_ok'] = ($retours['message_ok'] ?? '') . '<script type="text/javascript">/*<![CDATA[*/' . substr($redirect, 11) . '/*]]>*/</script>'; + $retours['editable'] = true; + } else { + $retours['redirect'] = $redirect; + } + + return $retours; +} + +/** + * Fonction de rappel pour array_walk_recursive + * pour automatiquement transformer les valeur numérique en strval + * comme SPIP le fait (mais par quel biais?) lorsqu'on envoie un tableau en environnement + * @param &$value + * @param $key + **/ +function blocs_types_array_walk_recursive_strval(&$value, $key) { + if (!is_array($value)) { + $value = strval($value); + } +} diff --git a/lang/blocs_type_fr.php b/lang/blocs_type_fr.php index 8de0f948f116cc6586d88daffb11417df6c24183..3010c89f4f2ff632252813b07c81be5b10e6a457 100644 --- a/lang/blocs_type_fr.php +++ b/lang/blocs_type_fr.php @@ -12,13 +12,14 @@ $GLOBALS[$GLOBALS['idx_lang']] = [ // C 'champ_id_blocs_type_parent_label' => 'Type de bloc parent', - 'champ_saisies_label' => 'Saisies', + 'champ_saisies_label' => 'Paramètres de ce type de bloc', 'champ_titre_label' => 'Titre', 'confirmer_supprimer_blocs_type' => 'Confirmez-vous la suppression de cet type de bloc ?', // I 'icone_creer_blocs_type' => 'Créer un type de bloc', 'icone_modifier_blocs_type' => 'Modifier ce type de bloc', + 'icone_modifier_blocs_type_champs' => 'Modifier les champs', 'info_1_blocs_type' => 'Un type de bloc', 'info_aucun_blocs_type' => 'Aucun type de bloc', 'info_blocs_types_auteur' => 'Les types de blocs de cet auteur', diff --git a/prive/objets/contenu/blocs_type.html b/prive/objets/contenu/blocs_type.html index 2ff2a21e59936742f1781cb8ae87f8e4698adb7d..8b8e718e958ceaf8e43ad058bf3f9596e10c53ff 100644 --- a/prive/objets/contenu/blocs_type.html +++ b/prive/objets/contenu/blocs_type.html @@ -9,9 +9,12 @@ <span dir="#LANG_DIR" class="#EDIT{id_blocs_type_parent} id_blocs_type_parent">(#ID_BLOCS_TYPE_PARENT)</span> </div>] -[<div class="champ contenu_saisies[ (#SAISIES*|strlen|?{'',vide})]"> - <div class="label"><:blocs_type:champ_saisies_label:/> : </div> - <span dir="#LANG_DIR" class="#EDIT{saisies} saisies">(#SAISIES)</span> -</div>] +#SET{saisies, #SAISIES|json_decode{1}} +[(#GET{saisies}|oui) + <h2><:blocs_type:champ_saisies_label:/></h2> + <div class="formulaire_spip"> + [(#GENERER_SAISIES{#GET{saisies}})] + </div> +] </BOUCLE_blocs_type> diff --git a/prive/squelettes/contenu/blocs_type.html b/prive/squelettes/contenu/blocs_type.html index da1c58c065fead201ff6af07bb8e158296ae803b..08fabd537f7f41404f222716b9bc0d419d4747ea 100644 --- a/prive/squelettes/contenu/blocs_type.html +++ b/prive/squelettes/contenu/blocs_type.html @@ -1,15 +1,12 @@ [(#AUTORISER{voir,blocs_type,#ID_BLOCS_TYPE}|sinon_interdire_acces)] [(#SET{url_voir,#VAL{blocs_type}|objet_info{url_voir}})] [(#SET{url_edit,#VAL{blocs_type}|objet_info{url_edit}})] +[(#SET{url_edit_champs,blocs_type_edit_champs})] <BOUCLE_blocs_type(BLOCS_TYPES){id_blocs_type}{si #ENV{exec}|=={#GET{url_voir}}}> [(#BOITE_OUVRIR{[ [(#AUTORISER{modifier,blocs_type,#ID_BLOCS_TYPE}) - [(#ID_BLOCS_TYPE|afficher_qui_edite{blocs_type}|non) - [(#URL_ECRIRE{#GET{url_edit},id_blocs_type=#ID_BLOCS_TYPE}|icone_verticale{<:blocs_type:icone_modifier_blocs_type:/>,blocs_type,edit,right ajax preload})] - ] - [(#ID_BLOCS_TYPE|afficher_qui_edite{blocs_type}|oui) - [(#URL_ECRIRE{#GET{url_edit},id_blocs_type=#ID_BLOCS_TYPE}|icone_verticale{#ID_BLOCS_TYPE|afficher_qui_edite{blocs_type},warning-24,'',right edition_deja ajax preload})] - ] + [(#URL_ECRIRE{#GET{url_edit_champs},id_blocs_type=#ID_BLOCS_TYPE}|icone_verticale{<:blocs_type:icone_modifier_blocs_type_champs:/>,formulaire,edit,right ajax preload})] + [(#URL_ECRIRE{#GET{url_edit},id_blocs_type=#ID_BLOCS_TYPE}|icone_verticale{<:blocs_type:icone_modifier_blocs_type:/>,blocs_type,edit,right ajax preload})] ] <h1>[(#RANG). ](#TITRE|sinon{<:info_sans_titre:/>})[(#CHEMIN_IMAGE{blocs_type-24.png}|balise_img{blocs_type,cadre-icone})]</h1> @@ -29,12 +26,8 @@ <div class="nettoyeur"></div> [(#AUTORISER{modifier,blocs_type,#ID_BLOCS_TYPE}) - [(#ID_BLOCS_TYPE|afficher_qui_edite{blocs_type}|non) - [(#URL_ECRIRE{#GET{url_edit},id_blocs_type=#ID_BLOCS_TYPE}|icone_verticale{<:blocs_type:icone_modifier_blocs_type:/>,blocs_type,edit,right ajax preload})] - ] - [(#ID_BLOCS_TYPE|afficher_qui_edite{blocs_type}|oui) - [(#URL_ECRIRE{#GET{url_edit},id_blocs_type=#ID_BLOCS_TYPE}|icone_verticale{#ID_BLOCS_TYPE|afficher_qui_edite{blocs_type},warning-24,'',right edition_deja ajax preload})] - ] + [(#URL_ECRIRE{#GET{url_edit_champs},id_blocs_type=#ID_BLOCS_TYPE}|icone_verticale{<:blocs_type:icone_modifier_blocs_type_champs:/>,formulaire,edit,right ajax preload})] + [(#URL_ECRIRE{#GET{url_edit},id_blocs_type=#ID_BLOCS_TYPE}|icone_verticale{<:blocs_type:icone_modifier_blocs_type:/>,blocs_type,edit,right ajax preload})] ] #PIPELINE{afficher_complement_objet,#ARRAY{args,#ARRAY{type,blocs_type,id,#ID_BLOCS_TYPE},data,'<div class="nettoyeur"></div>'}} diff --git a/prive/squelettes/contenu/blocs_type_edit_champs.html b/prive/squelettes/contenu/blocs_type_edit_champs.html new file mode 100644 index 0000000000000000000000000000000000000000..0bc010acbbcf9ab4619ca1a95db51d639445ec5b --- /dev/null +++ b/prive/squelettes/contenu/blocs_type_edit_champs.html @@ -0,0 +1,29 @@ +[(#ID_BLOCS_TYPE|oui) + [(#AUTORISER{modifier,blocs_type,#ID_BLOCS_TYPE}|sinon_interdire_acces)] +] + +#SET{redirect,#ENV{redirect}|sinon{#ID_BLOCS_TYPE|?{#ID_BLOCS_TYPE|generer_url_entite{blocs_type},#URL_ECRIRE{blocs_types}}}} +<div class="cadre-formulaire-editer"> +<div class="entete-formulaire"> + [(#ID_BLOCS_TYPE|oui) + [(#GET{redirect}|icone_verticale{<:icone_retour:/>,blocs_type,'',left retour[(#ENV{retourajax,''}|oui)ajax preload]})] + ] + [ + [(#ID_BLOCS_TYPE|?{<:blocs_type:icone_modifier_blocs_type:/>,<:blocs_type:icone_creer_blocs_type:/>})] + <h1>(#ENV*{titre,#INFO_TITRE{blocs_type,#ID_BLOCS_TYPE}|sinon{<:info_sans_titre:/>}})</h1> + ] +</div> + +#SET{redirect,#ENV{redirect,#ID_BLOCS_TYPE|generer_url_entite{blocs_type}}} +[(#ENV{retourajax,''}|oui) + #SET{redirect,'javascript:if (window.jQuery) jQuery(".entete-formulaire .retour a").followLink();'} + <div class="ajax"> +] + +#FORMULAIRE_EDITER_BLOCS_TYPE_CHAMPS{#ENV{id_blocs_type}, #GET{redirect}} + +[(#ENV{retourajax,''}|oui) + </div> + <script type="text/javascript">/*<!\[CDATA\[*/reloadExecPage('#ENV{exec}');/*\]\]>*/</script> +] +</div> diff --git a/prive/themes/spip/images/formulaire-xx.svg b/prive/themes/spip/images/formulaire-xx.svg new file mode 100644 index 0000000000000000000000000000000000000000..b56507ecf52ad5f97623ee7eeabf28adad4b1dfb --- /dev/null +++ b/prive/themes/spip/images/formulaire-xx.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path d="M11 13h8l-.25-8h26.5L45 13h8v44H11z" fill="#fff" paint-order="fill markers stroke"/><path style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;shape-margin:0;inline-size:0;isolation:auto;mix-blend-mode:normal" d="M27.96 20a2 2 0 0 0-1.419.63l-5.072 5.405-2.076-2.015a2 2 0 0 0-2.829.04 2 2 0 0 0 .043 2.829l3.536 3.433a2 2 0 0 0 2.851-.066l6.465-6.887a2 2 0 0 0-.09-2.828A2 2 0 0 0 27.961 20z" color="#000" font-weight="400" font-family="sans-serif" overflow="visible" fill="#1d83d4" fill-rule="evenodd"/><path style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;shape-margin:0;inline-size:0;isolation:auto;mix-blend-mode:normal" d="M36 24a2 2 0 0 0-2 2 2 2 0 0 0 2 2h10a2 2 0 0 0 2-2 2 2 0 0 0-2-2zm0 16a2 2 0 0 0-2 2 2 2 0 0 0 2 2h10a2 2 0 0 0 2-2 2 2 0 0 0-2-2z" color="#000" font-weight="400" font-family="sans-serif" overflow="visible" fill="#888" fill-rule="evenodd"/><path style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;shape-margin:0;inline-size:0;isolation:auto;mix-blend-mode:normal" d="M18.025 36a2 2 0 0 0-1.44.586 2 2 0 0 0 0 2.828L20.173 43l-3.586 3.586a2 2 0 0 0 0 2.828 2 2 0 0 0 2.828 0L23 45.828l3.586 3.586a2 2 0 0 0 2.828 0 2 2 0 0 0 0-2.828L25.828 43l3.586-3.586a2 2 0 0 0 0-2.828A2 2 0 0 0 28.025 36a2 2 0 0 0-1.44.586L23 40.172l-3.586-3.586A2 2 0 0 0 18.025 36z" color="#000" font-weight="400" font-family="sans-serif" overflow="visible" fill="#e895b7" fill-rule="evenodd"/><path style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;shape-margin:0;inline-size:0;isolation:auto;mix-blend-mode:normal" d="M17.5 2A1.5 1.5 0 0 0 16 3.5V6h-2.8C9.252 6 6 9.255 6 13.201V54.69c0 3.946 3.253 7.202 7.2 7.202h37.6c3.947 0 7.2-3.256 7.2-7.202V13.201C58 9.255 54.747 6 50.8 6H48V3.5A1.5 1.5 0 0 0 46.5 2zM19 5h26v7H19zm-5.8 6H16v2.5a1.5 1.5 0 0 0 1.5 1.5h29a1.5 1.5 0 0 0 1.5-1.5V11h2.8c1.263 0 2.2.938 2.2 2.201V54.69c0 1.263-.937 2.202-2.2 2.202H13.2c-1.263 0-2.2-.939-2.2-2.202V13.201c0-1.263.937-2.201 2.2-2.201z" color="#000" font-weight="400" font-family="sans-serif" overflow="visible" fill="#666" paint-order="fill markers stroke"/></svg> \ No newline at end of file