Skip to content
Extraits de code Groupes Projets
blocks_fonctions.php 7,23 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é
 * @uses _block_charger_block()
 * @balise
nicod's avatar
nicod a validé
 *                 ```
nicod's avatar
nicod a validé
 *                 #GENERER_BLOCK génère le block de la boucle(BLOCK) en cours
 *                 #GENERER_BLOCK{3} génère le block 3
nicod's avatar
nicod a validé
 *                 ```
 */
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)";
nicod's avatar
nicod a validé
/**
 * Fonction interne à la balise GENERER_BLOCK
 *
 * @param $id_block
 * @return array|string
 */
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)',
		$contexte = array_merge(
			['id_block' => $id_block],
			block_get_valeurs($infos['saisies'], $infos['valeurs'])
		);
		$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é
 * @uses _block_charger_blocks()
 * @balise
nicod's avatar
nicod a validé
 *                 ```
nicod's avatar
nicod a validé
 *                 #GENERER_BLOCKS génère les blocks de l'objet de la bouvle en cours
 *                 #GENERER_BLOCKS{article,3} génère les blocks de l'article 3
nicod's avatar
nicod a validé
 *                 ```
 */
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;
}

nicod's avatar
nicod a validé
/**
 * Fonction interne à la balise GENERER_BLOCKS
 *
 * @param $objet
 * @param $id_objet
 * @return string
 */
function _block_charger_blocks($objet, $id_objet): string {
		'objet = ' . sql_quote($objet),
		'id_objet = ' . (int)$id_objet,
		$where[] = 'statut = ' . sql_quote('publie');
		'id_block',
		'spip_blocks b',
		'rang_lien'
	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 string
nicod's avatar
nicod a validé
 */
nicod's avatar
nicod a validé
function generer_TITRE_BLOCK($id_block): string {
nicod's avatar
nicod a validé
	if ($infos = sql_fetsel(
		'bt.titre, b.objet, b.rang_lien, b.id_objet',
		'spip_blocks b join spip_blocktypes bt using(id_blocktype)',
		'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;
/**
 * Retourner un tableau des valeurs saisies
 *
 * @param string $saisies (sérialisées)
 * @param string $valeurs (sérialisées)
 *
 * @return array
 */
function block_get_valeurs(string $saisies, string $valeurs): array {
	$retour = [];
	$saisies_blocktype = blocks_deserialize($saisies);
	if ($valeurs_saisies = blocks_deserialize($valeurs)) {
		include_spip('inc/saisies_lister');
		$saisies_par_nom = saisies_lister_par_nom($saisies_blocktype);
		foreach ($saisies_par_nom as $nom => $saisie) {
			$retour[$nom] = $valeurs_saisies[$nom] ?? null;
		}
	}
	return $retour;
}

 * 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é
 */
nicod's avatar
nicod a validé
function blocks_trouver_squelette($identifiant, $force_public = false, $chemin_complet = false, $dist = true): string {
	$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;
}
nicod's avatar
nicod a validé
/**
 * Calculer la liste des types de blocks pouvant être créés sous un type de block
 * @param $id_blocktype
 * @return array
 */
function bloctypes_trouver_enfants($id_blocktype): array {
	return bloctypes_trouver_role($id_blocktype, 'enfant');
}

nicod's avatar
nicod a validé
/**
 * Calculer la liste des types de blocks dans lesquels un type de block peut être créé
 * @param $id_blocktype
 * @return array
 */
function bloctypes_trouver_parents($id_blocktype): array {
	return bloctypes_trouver_role($id_blocktype, 'parent');
}

nicod's avatar
nicod a validé
/**
 * Calculer une liste de types de blocks enfants ou parents en fonction du rôle
 * @param $id_blocktype
 * @param $role
 * @return array
 */
function bloctypes_trouver_role($id_blocktype, $role): array {
	include_spip('action/editer_liens');
	if (
		$id_blocktype
		&& $role
		&& ($blocktypes_parents = objet_trouver_liens(['blocktype' => $id_blocktype], ['blocktype' => '*'], ['role' => $role]))
	) {
		return array_column($blocktypes_parents, 'id_objet');
	}
	return [];
}