Skip to content
Extraits de code Groupes Projets
editer_formulaire_traitements.php 5,98 Kio
<?php

// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) {
	return;
}

include_spip('inc/formidable');
include_spip('inc/formidable_fichiers');

function formulaires_editer_formulaire_traitements_charger($id_formulaire) {
	$contexte = array();
	$id_formulaire = intval($id_formulaire);
	include_spip('formidable_fonctions');

	// On teste si le formulaire existe
	if ($id_formulaire
		and $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = '.$id_formulaire)
		and autoriser('editer', 'formulaire', $id_formulaire)
	) {
		$traitements = formidable_deserialize($formulaire['traitements']);
		if ($id_version = _request('id_version')) {
			include_spip('inc/revisions');
			$old = recuperer_version($id_formulaire, 'formulaire', $id_version);
			$traitements = formidable_deserialize($old['traitements']);
		}
		$saisies = formidable_deserialize($formulaire['saisies']);
		if (!is_array($traitements)) {
			$traitements = array();
		}
		if (!is_array($saisies)) {
			$saisies = array();
		}
		$contexte['traitements'] = $traitements;
		$contexte['traitements_choisis'] = array_keys($traitements);
		$contexte['formulaire'] = _T_ou_typo($saisies, 'multi');
		$contexte['id_formulaire'] = $id_formulaire;

		$traitements_disponibles = traitements_lister_disponibles();
		$saisie_traitements_choisis =	[
			'saisie' => 'checkbox',
			'options' => [
				'nom' => 'traitements_choisis',
				'label' => '<:formidable:traitements_choisis:>',
				'data' => [],
			]
		];


		// Calcul des traitements avec option pour le afficher_si du fieldset `options_des_traitements`
		$traitements_disponibles_avec_options = array_keys(array_filter(
			$traitements_disponibles,
			function ($t) {
				return isset($t['options']);
			}
		));
		$afficher_si_fieldset_options = implode(
			' || ',
			array_map(
				function ($t) {
					return "@traitements_choisis@ IN '$t'";
				},
				$traitements_disponibles_avec_options
			)
		);
		$saisie_options_traitements = [
			'saisie' => 'fieldset',
			'options' => [
				'nom' => 'options_traitements',
				'label' => '<:formidable:options_traitements:>',
				'afficher_si' => $afficher_si_fieldset_options
			],
			'saisies' => [],
		];


		$configurer_traitements = [&$saisie_traitements_choisis, &$saisie_options_traitements];

		foreach ($traitements_disponibles as $type_traitement => $traitement) {
			$saisie_traitements_choisis['options']['data'][$type_traitement] = $traitement['description'];
			if (isset($traitement['options'])) {
				$saisie_options_traitements['saisies'][] = [
					'saisie' => 'fieldset',
					'options' => [
						'nom' => "options_$type_traitement",
						'label' => $traitement['titre'],
						'class' => "$type_traitement options_traiter",
						'afficher_si' => "@traitements_choisis@ IN '$type_traitement'",
						'onglet' => 'on',
						'onglet_vertical' => 'on',
					],
					'saisies' => saisies_transformer_noms($traitement['options'], '/^.*$/', "traitements[$type_traitement][\\0]")
				];
			}
		}

		$configurer_traitements = saisies_transformer_option($configurer_traitements, 'conteneur_class', '#(.*)#', '\1 pleine_largeur');
		$contexte['_configurer_traitements'] = $configurer_traitements;

		// Si on demande un avertissement et qu'il y a déjà des traitements de configurés
		if (_request('avertissement') == 'oui') {
			$contexte['message_ok'] = $traitements ? _T('formidable:traitements_avertissement_modification') : _T('formidable:traitements_avertissement_creation');
		}
	} else {
		$contexte['editable'] = false;
	}
	// On enlève l'éventuel avertissement pour le prochain envoi
	$contexte['action'] = parametre_url(self(), 'avertissement', '');

	return $contexte;
}

function formulaires_editer_formulaire_traitements_verifier($id_formulaire) {
	include_spip('inc/saisies');
	$erreurs = array();
	$traitements_disponibles = traitements_lister_disponibles();

	// On regarde quels traitements sont demandés
	$traitements_choisis = _request('traitements_choisis');

	if (is_array($traitements_choisis)) {
		foreach ($traitements_choisis as $type_traitement) {
			if (!isset($traitements_disponibles[$type_traitement]['options'])) {
				continue;
			}
			$erreurs_traitement_brut = saisies_verifier(
				saisies_transformer_noms(
					$traitements_disponibles[$type_traitement]['options'],
					'/^.*$/',
					"traitements[$type_traitement][\\0]")
			);
			$erreurs = array_merge($erreurs, $erreurs_traitement_brut);
		}
	}
	return $erreurs;
}

function formulaires_editer_formulaire_traitements_traiter($id_formulaire) {
	$retours = array();
	$id_formulaire = intval($id_formulaire);
	include_spip('inc/formidable');

	// On récupère tout le tableau des options de traitement
	$traitements = _request('traitements');
	// Et tout les traitemenrs choisis
	$traitements_choisis = _request('traitements_choisis');

	if (!$traitements_choisis) {
		$traitements_choisis = array();
	}
	$traitements_choisis = array_flip($traitements_choisis);

	// Parmis toutes les options passées, ne prendre que celle des traitements choisis
	$traitements = array_intersect_key($traitements, $traitements_choisis);
	// On gère le cas des traitements sans options
	$traitements_sans_option = array_map(function($i) {return [];}, array_diff_key($traitements_choisis, $traitements));//Même si pas d'option, on fait un pseudo tableau d'option
	$traitements = array_merge($traitements, $traitements_sans_option);

	// Si besoin, on crée un dossier pour stocker les fichiers
	$erreur_creation_dossier = formidable_creer_dossier_formulaire($id_formulaire);
	if ($erreur_creation_dossier) {
		$retours['message_erreur'] = $erreur_creation_dossier;
	}
	// Et on l'enregistre tel quel
	include_spip('action/editer_objet');
	$err = objet_modifier('formulaire', $id_formulaire, array('traitements' => formidable_serialize($traitements)));

	// On va sur la page de visualisation quand c'est fini
	if (!$err) {
		$retours['redirect'] = parametre_url(generer_url_ecrire('formulaire'), 'id_formulaire', $id_formulaire);
	} else {
		$retours['editable'] = true;
		$retours['message_erreur'] = _T('formidable:erreur_base');
	}

	return $retours;
}