Skip to content
Extraits de code Groupes Projets
blocks_fonctions.php 6,19 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 ($data && is_array($data)) ? json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK) : '';
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 block'
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
nicod's avatar
nicod a validé
 *                 ```
 *                 #GENERER_BLOCK
 *                 #GENERER_BLOCK{3}
 *                 ```
 */
function balise_GENERER_BLOCK_dist($p) {
	if (!($id_block = interprete_argument_balise(1, $p))) {
			$id_block = champ_sql($p->boucles[$p->id_boucle]->primary, $p);
		$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_block)";
function _block_charger_block($id_block) {
	$where = ['b.id_block = ' . (int)$id_block];
	if (!test_espace_prive()) {
		$where[] = 'b.statut = ' . sql_quote('publie');
	}
	if ($infos = sql_fetsel(
nicod's avatar
nicod a validé
		'b.valeurs, bt.saisies, bt.identifiant',
		'spip_blocktypes bt join spip_blocks b using(id_blocktype)',
		// transmettre les valeurs saisies dans le block au squelette
		$saisies_blocktype = blocks_deserialize($infos['saisies']);
		if ($valeurs_saisies = blocks_deserialize($infos['valeurs'])) {
			include_spip('inc/saisies_lister');
			$saisies_par_nom = saisies_lister_par_nom($saisies_blocktype);
			foreach ($saisies_par_nom as $nom => $saisie) {
nicod's avatar
nicod a validé
				$contexte[$nom] = $valeurs_saisies[$nom] ?? null;
nicod's avatar
nicod a validé
		}

		$retour = recuperer_fond('inclure/block', $contexte);
nicod's avatar
nicod a validé
}

 * Compile la balise `#GENERER_BLOCKS` qui génère l'affiche des blocks liés à un objet
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
nicod's avatar
nicod a validé
 *                 ```
 *                 #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 = '';
	$where = [
		'bl.objet = ' . sql_quote($objet),
		'bl.id_objet = ' . (int)$id_objet,
	];
	if (!test_espace_prive()) {
		$where[] = 'b.statut = ' . sql_quote('publie');
	}
	$blocks = sql_allfetsel(
		'b.id_block',
		'spip_blocks_liens bl join spip_blocks b using(id_block)',
	foreach ($blocks as $block) {
		$retour .= _block_charger_block($block['id_block']);
nicod's avatar
nicod a validé
/**
 * Générer le titre d'un block
nicod's avatar
nicod a validé
 * composé de son type et du titre de l'objet auquel il est lié
 *
nicod's avatar
nicod a validé
 * @return mixed|string
 */
function generer_TITRE_BLOCK($id_block) {
nicod's avatar
nicod a validé
	if ($infos = sql_fetsel(
		'bt.titre, bl.objet, bl.rang_lien, bl.id_objet',
		'spip_blocks b join spip_blocktypes bt using(id_blocktype) left join spip_blocks_liens bl using(id_block)',
		'b.id_block = ' . (int)$id_block
	)) {
		$titre = $infos['titre'];
		if ($infos['id_objet'] && $infos['objet']) {
			$titre = generer_objet_info($infos['id_objet'], $infos['objet'], 'titre') . ' - ' . $titre . ' #' . $infos['rang_lien'];
		}
	} else {
		$titre = _T('block:titre_block') . ' ' . $id_block;
 * Chercher le squelette correspondant à un block par son identifiant
 * @param string $identifiant    Identifiant du block
 * @param bool   $force_public   Forcer une recherche du squelette public
 * @param bool   $chemin_complet Retourne le chemin complet du squelette
 * @return string Chemin du squelette trouvé
 */
function blocks_trouver_squelette($identifiant, $force_public = false, $chemin_complet = false, $dist = true) {
	$cle = $identifiant . (int)$force_public . (int)$chemin_complet . (int)$dist;

	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 = $chemin_complet ? $f : 'blocks_prive/' . $identifiant;
	} else if (
		($f = find_in_path($identifiant . '.' . _EXTENSION_SQUELETTES, 'blocks/'))
		&& lire_fichier($f, $contenu)
	) {
		$squelette = $chemin_complet ? $f : 'blocks/' . $identifiant;
	} else if (
		$dist
		&& ($f = find_in_path('dist.' . _EXTENSION_SQUELETTES, 'blocks/'))
		&& lire_fichier($f, $contenu)
	) {
		$squelette = $chemin_complet ? $f : 'blocks/dist';
	}
	$cache[$cle] = $squelette;

	return $squelette;
}

function bloctypes_trouver_enfants($id_blocktype) {
	return bloctypes_trouver_role($id_blocktype, 'enfant');
}

function bloctypes_trouver_parents($id_blocktype) {
	return bloctypes_trouver_role($id_blocktype, 'parent');
}

function bloctypes_trouver_role($id_blocktype, $role) {
	if (
		$id_blocktype
		&& $role
		&& ($blocktypes_parents = objet_trouver_liens(['blocktype' => $id_blocktype], ['blocktype' => '*'], ['role' => $role]))
	) {
		return array_column($blocktypes_parents, 'id_objet');
	}
	return [];
}