Skip to content
Extraits de code Groupes Projets
editer_block.php 9,09 Kio
<?php
/**
 * Gestion du formulaire de d'édition de block
 *
 * @plugin     Blocks
 * @copyright  2023
 * @author     nicod_
 * @licence    GNU/GPL
 * @package    SPIP\Blocks\Formulaires
 */

if (!defined('_ECRIRE_INC_VERSION')) {
	return;
}

include_spip('blocks_fonctions');
include_spip('inc/actions');
include_spip('inc/editer');

/**
 * Identifier le formulaire en faisant abstraction des paramètres qui ne représentent pas l'objet edité
 *
 * @param int|string  $id_block            Identifiant du block. 'new' pour un nouveau block.
 * @param string|null $objet               Type d'objet à associer (article, rubrique,...)
 * @param int|null    $id_objet            Id de l'objet à associer
 * @param int|null    $id_blocktype_parent Type du block parent
 * @param string|null $retour              URL de redirection après le traitement
 * @param string|null $include             Indique si le formulaire est ouvert en inclusion
 * @return string              Hash du formulaire
 */
function formulaires_editer_block_identifier_dist($id_block = 'new', $objet = null, $id_objet = null, $id_blocktype_parent = null, $retour = null, $include = null) {
	return serialize([intval($id_block), $objet, $id_objet]);
}

/**
 * Chargement du formulaire d'édition de block
 *
 * Déclarer les champs postés et y intégrer les valeurs par défaut
 *
 * @param int|string  $id_block            Identifiant du block. 'new' pour un nouveau block.
 * @param string|null $objet               Type d'objet à associer (article, rubrique,...)
 * @param int|null    $id_objet            Id de l'objet à associer
 * @param int|null    $id_blocktype_parent Type du block parent
 * @param string|null $retour              URL de redirection après le traitement
 * @param string|null $include             Indique si le formulaire est ouvert en inclusion
 * @return array               Environnement du formulaire
 * @uses formulaires_editer_objet_charger()
 */
function formulaires_editer_block_charger_dist($id_block = 'new', $objet = null, $id_objet = null, $id_blocktype_parent = null, $retour = null, $include = null) {
	if ((int)$id_block) {
		$id_blocktype = (int)sql_getfetsel('id_blocktype', 'spip_blocks', 'id_block = ' . $id_block);
		$infos = sql_fetsel('id_objet, objet', 'spip_blocks', 'id_block = ' . $id_block);
		$objet = $infos['objet'];
		$id_objet = $infos['id_objet'];
		$valeurs = formulaires_editer_objet_charger('block', $id_block, $id_blocktype, 0, $retour, '');
	} else {
		$id_blocktype = _request('id_blocktype');
	}
	if (!$objet || !(int)$id_objet) {
		return null;
	}

	$valeurs['objet'] = $objet;
	$valeurs['id_objet'] = $id_objet;
	$valeurs['include'] = (bool)$include;
	$valeurs['redirect'] = $retour;

	if ($id_blocktype) {
		// charger les saisies du type de block
		$saisies_blocktype = [];
		if ($saisies_json = sql_getfetsel('saisies', 'spip_blocktypes', 'id_blocktype = ' . $id_blocktype)) {
			$saisies_blocktype = blocks_deserialize($saisies_json);
		}
		if (!$saisies_blocktype) {
			$saisies_blocktype = [
				[
					'saisie'  => 'explication',
					'options' => [
						'nom'   => 'saisies_vides',
						'texte' => _T('blocktype:aucune_saisie'),
					],
				],
			];
		}

		// ajout du champ "ancre nommée"
		$saisies_blocktype[] = [
			'saisie'  => 'input',
			'options' => [
				'nom'         => 'ancre',
				'label'       => _T('block:champ_ancre_label'),
				'explication' => _T('block:champ_ancre_explication'),
			],
		];

		// passer les saisies au formulaire
		$valeurs['_saisies'] = saisies_inserer(
			$saisies_blocktype,
			[
				'saisie'  => 'hidden',
				'options' => [
					'nom'         => 'id_blocktype',
					'obligatoire' => 'oui',
				],
			],
			0
		);
		$valeurs['id_blocktype'] = $id_blocktype;

		// charger les valeurs déjà saisies
		$valeurs_saisies = blocks_deserialize($valeurs['valeurs'] ?? null);
		$valeurs_saisies['ancre'] = $valeurs['ancre'] ?? null;
		include_spip('inc/saisies_lister');
		$saisies_par_nom = saisies_lister_par_nom($saisies_blocktype);
		foreach ($saisies_par_nom as $nom => $saisie) {
			if ((int)$id_block) {
				$valeurs[$nom] = (_request($nom) ? _request($nom) : ($valeurs_saisies[$nom] ?? ''));
			} else {
				$valeurs[$nom] = '';
			}
		}

	} else {

		$valeurs['_saisies'] = [
			[
				'saisie'  => 'blocktypes',
				'options' => [
					'nom'                 => 'id_blocktype',
					'obligatoire'         => 'oui',
					'label'               => _T('block:champ_id_blocktype_label'),
					'objet'               => $objet,
					'id_blocktype_parent' => $id_blocktype_parent,
				],
			],
		];

	}
	return $valeurs;
}

/**
 * Vérifications du formulaire d'édition de block
 *
 * Vérifier les champs postés et signaler d'éventuelles erreurs
 *
 * @param int|string  $id_block            Identifiant du block. 'new' pour un nouveau block.
 * @param string|null $objet               Type d'objet à associer (article, rubrique,...)
 * @param int|null    $id_objet            Id de l'objet à associer
 * @param int|null    $id_blocktype_parent Type du block parent
 * @param string|null $retour              URL de redirection après le traitement
 * @param string|null $include             Indique si le formulaire est ouvert en inclusion
 * @return array               Tableau des erreurs
 * @uses formulaires_editer_objet_verifier()
 */
function formulaires_editer_block_verifier_dist($id_block = 'new', $objet = null, $id_objet = null, $id_blocktype_parent = null, $retour = null, $include = null) {
	if ((int)$id_block) {
		$id_blocktype = (int)sql_getfetsel('id_blocktype', 'spip_blocks', 'id_block = ' . $id_block);
	} else {
		$id_blocktype = _request('id_blocktype');
	}
	$erreurs = [];

	if (_request('choisir') && !$id_blocktype) {
		$erreurs['id_blocktype'] = _T('info_obligatoire');
	}

	if (_request('ajouter')) {
		if ($id_blocktype) {
			// charger les saisies du type de block
			$saisies_blocktype = [];
			if ($saisies_json = sql_getfetsel('saisies', 'spip_blocktypes', 'id_blocktype = ' . $id_blocktype)) {
				$saisies_blocktype = blocks_deserialize($saisies_json);
			}
			$erreurs = saisies_verifier($saisies_blocktype);
		} else {
			$erreurs['id_blocktype'] = _T('info_obligatoire');
		}
	}

	return $erreurs;
}

/**
 * Traitement du formulaire d'édition de block
 *
 * Traiter les champs postés
 *
 * @param int|string  $id_block            Identifiant du block. 'new' pour un nouveau block.
 * @param string|null $objet               Type d'objet à associer (article, rubrique,...)
 * @param int|null    $id_objet            Id de l'objet à associer
 * @param int|null    $id_blocktype_parent Type du block parent
 * @param string|null $retour              URL de redirection après le traitement
 * @param string|null $include             Indique si le formulaire est ouvert en inclusion
 * @return array                Retours des traitements
 * @uses formulaires_editer_objet_traiter()
 */
function formulaires_editer_block_traiter_dist($id_block = 'new', $objet = null, $id_objet = null, $id_blocktype_parent = null, $retour = null, $include = null) {
	if ((int)$id_block) {
		$id_blocktype = (int)sql_getfetsel('id_blocktype', 'spip_blocks', 'id_block = ' . $id_block);
		$infos = sql_fetsel('id_objet, objet', 'spip_blocks', 'id_block = ' . $id_block);
		$objet = $infos['objet'];
		$id_objet = $infos['id_objet'];
		$creation = false;
	} else {
		$id_blocktype = _request('id_blocktype');
		$creation = true;
	}
	$retours = [];
	if ($id_blocktype && $objet && (int)$id_objet && _request('ajouter')) {

		$retours = formulaires_editer_objet_traiter('block', $id_block, $id_blocktype, 0, $retour, '');

		if ($id_block = $retours['id_block']) {

			// mettre à jour le block avec les valeurs saisies
			$saisies_blocktype = [];
			if ($saisies_json = sql_getfetsel('saisies', 'spip_blocktypes', 'id_blocktype = ' . $id_blocktype)) {
				$saisies_blocktype = blocks_deserialize($saisies_json);
			}
			include_spip('inc/saisies_lister');
			$valeurs = [];
			$saisies_par_nom = saisies_lister_par_nom($saisies_blocktype);
			foreach ($saisies_par_nom as $nom => $saisie) {
				$valeurs[$nom] = _request($nom);
			}
			sql_updateq('spip_blocks', ['valeurs' => blocks_serialize($valeurs)], 'id_block = ' . $id_block);

			// associer à l'objet
			if ($creation) {
				$rang_max = sql_getfetsel(
					'max(rang_lien)',
					'spip_blocks',
					[
						'objet = ' . sql_quote($objet),
						'id_objet = ' . $id_objet,
					]
				);
				sql_updateq(
					'spip_blocks',
					[
						'id_objet'  => $id_objet,
						'objet'     => $objet,
						'rang_lien' => $rang_max + 1,
					],
					'id_block = ' . $id_block
				);
			}

			// un block est automatiquement publié lors de sa création
			if ($creation) {
				objet_instituer('block', $id_block, ['statut' => 'publie']);
			}

			if (isset($retours['redirect'])) {
				$retours['redirect'] = parametre_url($retours['redirect'], 'id_blocktype', '');
				$retours['redirect'] = parametre_url($retours['redirect'], 'id_block', '');
				$retours['redirect'] = parametre_url($retours['redirect'], 'edit_bloc', '');
				$retours['redirect'] = ancre_url($retours['redirect'], 'block_' . $id_block);
			}

		}
	}

	if (_request('annuler')) {
		$retours['redirect'] = parametre_url($retour, 'id_blocktype', '');
	}

	return $retours;
}