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;
}
/**
* Sérialisation de données (saisies ou valeurs)
*
* @param $data
* @return false|string
*/
return ($data && is_array($data)) ? json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK) : '';
/**
* 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'
* @balise
* @param Champ $p Pile au niveau de la balise
* @return Champ Pile complétée par le code à générer
* @example
*/
function balise_GENERER_BLOCK_dist($p) {
if (!($id_block = interprete_argument_balise(1, $p))) {
if ($p->id_boucle) {
$id_block = champ_sql($p->boucles[$p->id_boucle]->primary, $p);
}
}
if (!$id_block) {
$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)";
$p->interdire_scripts = false;
return $p;
}
/**
* Fonction interne à la balise GENERER_BLOCK
*
* @param $id_block
* @return array|string
*/
function _block_charger_block($id_block) {

nicod
a validé
$retour = '';
$where = ['b.id_block = ' . (int)$id_block];

nicod
a validé
if (!test_espace_prive()) {
$where[] = 'b.statut = ' . sql_quote('publie');
}
if ($infos = sql_fetsel(
'spip_blocktypes bt join spip_blocks b using(id_blocktype)',

nicod
a validé
$where
)) {

nicod
a validé
$contexte = array_merge(
['id_block' => $id_block],
block_get_valeurs($infos['saisies'], $infos['valeurs'])
);
$retour = recuperer_fond('inclure/block', $contexte);

nicod
a validé
}
return $retour;
* Compile la balise `#GENERER_BLOCKS` qui génère l'affiche des blocks liés à un objet
* @balise
* @param Champ $p Pile au niveau de la balise
* @return Champ Pile complétée par le code à générer
* @example
*/
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;
}
/**
* Fonction interne à la balise GENERER_BLOCKS
*
* @param $objet
* @param $id_objet
* @return string
*/
function _block_charger_blocks($objet, $id_objet): string {
$retour = '';

nicod
a validé
$where = [
'objet = ' . sql_quote($objet),
'id_objet = ' . (int)$id_objet,

nicod
a validé
];
if (!test_espace_prive()) {
$where[] = 'statut = ' . sql_quote('publie');

nicod
a validé
}
$blocks = sql_allfetsel(

nicod
a validé
$where,
'',

nicod
a validé
);
foreach ($blocks as $block) {
$retour .= _block_charger_block($block['id_block']);

nicod
a validé
return $retour;
}
* Générer le titre d'un block
* @param $id_block
'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;

nicod
a validé
/**
* 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é
*/
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];
}
$squelette = '';
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;
}
/**
* 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');
}
/**
* 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');
}
/**
* 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 [];
}