Skip to content
Extraits de code Groupes Projets
blocks_fonctions.php 4,85 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;
}
nicod's avatar
nicod a validé
/**
 * Sérialisation de données (saisies ou valeurs)
 *
 * @param $data
 * @return false|string
 */
function blocks_serialize($data) {
	return json_encode($data);
}

nicod's avatar
nicod a validé
/**
 * Désérialisation de données (saisies ou valeurs)
 *
 * @param $data
 * @return mixed
 */
function blocks_deserialize($data) {
	return json_decode($data ?? '', true);
}

/**
 * Compile la balise `#GENERER_BLOCK` qui génère l'affiche d'un bloc'
 *
 * @balise
nicod's avatar
nicod a validé
 * @param Champ $p Pile au niveau de la balise
 * @return Champ   Pile complétée par le code à générer
 * @example
 *     ```
 *     #GENERER_BLOCK
 *     #GENERER_BLOCK{3}
 *     ```
 */
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;
}

nicod's avatar
nicod a validé
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
	);

	$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];
		}
	}

	$squelette = blocks_trouver_squelette($infos['identifiant']);

	return recuperer_fond($squelette, $contexte);
}

/**
 * Compile la balise `#GENERER_BLOCKS` qui génère l'affiche des blocs liés à un objet
 *
 * @balise
nicod's avatar
nicod a validé
 * @param Champ $p Pile au niveau de la balise
 * @return Champ   Pile complétée par le code à générer
 * @example
 *     ```
 *     #GENERER_BLOCKS
 *     #GENERER_BLOCKS{article,3}
 *     ```
 */
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;
}

nicod's avatar
nicod a validé
/**
 * Générer le titre d'un bloc
 * composé de son type et du titre de l'objet auquel il est lié
 *
 * @param $id_bloc
 * @return mixed|string
 */
nicod's avatar
nicod a validé
function generer_TITRE_BLOC($id_bloc) {
	if ($infos = sql_fetsel(
		'bt.titre, bl.objet, bl.rang_lien, bl.id_objet',
		'spip_blocs b join spip_blocs_types bt using(id_blocs_type) left join spip_blocs_liens bl using(id_bloc)',
nicod's avatar
nicod a validé
		'b.id_bloc = ' . (int)$id_bloc
	)) {
		$titre = $infos['titre'];
		if ($infos['id_objet'] && $infos['objet']) {
			$titre = generer_objet_info($infos['id_objet'], $infos['objet'], 'titre') . ' - ' . $titre . ' #' . $infos['rang_lien'];
		}
	} else {
nicod's avatar
nicod a validé
		$titre = _T('bloc:titre_bloc') . ' ' . $id_bloc;

/**
 * Chercher le squelette correspondant à un bloc par son identifiant
 *
 * @param string $identifiant Identifiant du bloc
 * @param bool   $force_public Forcer une recherche du squelette public
 * @return string Chemin du squelette trouvé
 */
function blocks_trouver_squelette($identifiant, $force_public = false) {
	static $cache;
	$cle = $identifiant . ($force_public ? 'oui' : 'non');
	if (isset($cache[$cle])) {
		return $cache[$cle];
	}

	if (
		!$force_public
		&& test_espace_prive()
		&& ($f = find_in_path($identifiant . '.' . _EXTENSION_SQUELETTES, 'blocks_prive/'))
		&& lire_fichier($f, $contenu)
	) {
		$squelette = 'blocks_prive/' . $identifiant;
	} else if (
		($f = find_in_path($identifiant . '.' . _EXTENSION_SQUELETTES, 'blocks/'))
		&& lire_fichier($f, $contenu)
	) {
		$squelette = 'blocks/' . $identifiant;
	} else {
		$squelette = 'blocks/dist';
	}
	$cache[$cle] = $squelette;

	return $squelette;
}