Skip to content
Extraits de code Groupes Projets
blocks_fonctions.php 3,49 ko
Newer Older
<?php
/**
 * Fonctions utiles au plugin Blocks
 *
 * @plugin     Blocks
 * @copyright  2023
 * @author     nicod_
 * @licence    GNU/GPL
 * @package    SPIP\Blocks\Fonctions
 */

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

function blocks_serialize($data) {
	return json_encode($data);
}

function blocks_deserialize($data) {
	return json_decode($data ?? '', true);
}

/**
 * Compile la balise `#GENERER_BLOCK` qui génère l'affiche d'un bloc'
 *
 * @balise
 * @example
 *     ```
 *     #GENERER_BLOCK
 *     #GENERER_BLOCK{3}
 *     ```
 * @param Champ $p Pile au niveau de la balise
 * @return Champ   Pile complétée par le code à générer
 */
function balise_GENERER_BLOCK_dist($p) {
	if (!($id_bloc = interprete_argument_balise(1, $p))) {
		if ($p->id_boucle) {
			$id_bloc = champ_sql($p->boucles[$p->id_boucle]->primary, $p);
		}
	}

	if (!$id_bloc) {
		$msg = _T('zbug_balise_sans_argument', ['balise' => ' GENERER_BLOCK']);
		erreur_squelette($msg, $p);
		$p->interdire_scripts = true;
		return $p;
	}

	$p->code = "_block_charger_block($id_bloc)";
	$p->interdire_scripts = false;

	return $p;
}

/**
 * Compile la balise `#GENERER_BLOCKS` qui génère l'affiche des blocs liés à un objet
 *
 * @balise
 * @example
 *     ```
 *     #GENERER_BLOCKS
 *     #GENERER_BLOCKS{article,3}
 *     ```
 * @param Champ $p Pile au niveau de la balise
 * @return Champ   Pile complétée par le code à générer
 */
function balise_GENERER_BLOCKS_dist($p) {
	if ($objet = interprete_argument_balise(1, $p)) {
		$id_objet = interprete_argument_balise(2, $p);
	} else {
		$id_objet = null;
		if ($p->id_boucle) {
			$id_objet = champ_sql($p->boucles[$p->id_boucle]->primary, $p);
			$objet = "objet_type('" . $p->boucles[$p->id_boucle]->id_table . "')";
		}
	}

	if (!$objet || !$id_objet) {
		$msg = _T('zbug_balise_sans_argument', ['balise' => ' GENERER_BLOCKS']);
		erreur_squelette($msg, $p);
		$p->interdire_scripts = true;
		return $p;
	}

	$p->code = "_block_charger_blocks($objet, $id_objet)";
	$p->interdire_scripts = false;

	return $p;
}

function _block_charger_blocks($objet, $id_objet) {
	$retour = '';
	$blocs = objet_trouver_liens(['bloc' => '*'], [$objet => $id_objet]);
	// TODO : vérifier statuts et rangs_liens
	foreach ($blocs as $bloc) {
		$retour .= _block_charger_block($bloc['id_bloc']);
	}
	return $retour;
}

function _block_charger_block($id_bloc) {
	// TODO : vérifier statut
	$infos = sql_fetsel(
		'b.valeurs, bt.saisies, bt.identifiant',
		'spip_blocs_types bt join spip_blocs b using(id_blocs_type)',
		'b.id_bloc = ' . (int)$id_bloc
	);

	// chercher le squelette pour afficher le contenu du bloc
	if (
		test_espace_prive()
		&& ($f = find_in_path($infos['identifiant'] . '.' . _EXTENSION_SQUELETTES, 'blocks_prive/'))
		&& lire_fichier($f, $contenu)
	) {
		$squelette = 'blocks_prive/' . $infos['identifiant'];
	} else if (
		($f = find_in_path($infos['identifiant'] . '.' . _EXTENSION_SQUELETTES, 'blocks/'))
		&& lire_fichier($f, $contenu)
	) {
		$squelette = 'blocks/' . $infos['identifiant'];
	} else {
		$squelette = 'blocks/dist';
	}

	$contexte = [
		'id_bloc' => $id_bloc,
	];
	// transmettre les valeurs saisies dans le bloc au squelette
	$saisies_bloc_type = blocks_deserialize($infos['saisies']);
	if ($valeurs_saisies = blocks_deserialize($infos['valeurs'])) {
		include_spip('inc/saisies_lister');
		$saisies_par_nom = saisies_lister_par_nom($saisies_bloc_type);
		foreach ($saisies_par_nom as $nom => $saisie) {
			$contexte[$nom] = $valeurs_saisies[$nom];
		}
	}

	return recuperer_fond($squelette, $contexte);
}