You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
283 lines
7.1 KiB
PHP
283 lines
7.1 KiB
PHP
<?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
|
|
*/
|
|
function blocks_serialize($data) {
|
|
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'
|
|
*
|
|
* @uses _block_charger_block()
|
|
* @balise
|
|
* @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_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) {
|
|
$retour = '';
|
|
$where = ['b.id_block = ' . (int)$id_block];
|
|
if (!test_espace_prive()) {
|
|
$where[] = 'b.statut = ' . sql_quote('publie');
|
|
}
|
|
if ($infos = sql_fetsel(
|
|
'b.valeurs, bt.saisies, bt.identifiant',
|
|
'spip_blocktypes bt join spip_blocks b using(id_blocktype)',
|
|
$where
|
|
)) {
|
|
$contexte = array_merge(
|
|
['id_block' => $id_block],
|
|
block_get_valeurs($infos['saisies'], $infos['valeurs'])
|
|
);
|
|
$retour = recuperer_fond('inclure/block', $contexte);
|
|
}
|
|
|
|
return $retour;
|
|
}
|
|
|
|
/**
|
|
* Compile la balise `#GENERER_BLOCKS` qui génère l'affiche des blocks liés à un objet
|
|
*
|
|
* @uses _block_charger_blocks()
|
|
* @balise
|
|
* @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;
|
|
}
|
|
|
|
/**
|
|
* Fonction interne à la balise GENERER_BLOCKS
|
|
*
|
|
* @param $objet
|
|
* @param $id_objet
|
|
* @return string
|
|
*/
|
|
function _block_charger_blocks($objet, $id_objet): string {
|
|
$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)',
|
|
$where,
|
|
'',
|
|
'bl.rang_lien'
|
|
);
|
|
foreach ($blocks as $block) {
|
|
$retour .= _block_charger_block($block['id_block']);
|
|
}
|
|
|
|
return $retour;
|
|
}
|
|
|
|
/**
|
|
* Générer le titre d'un block
|
|
* composé de son type et du titre de l'objet auquel il est lié
|
|
*
|
|
* @param $id_block
|
|
* @return string
|
|
*/
|
|
function generer_TITRE_BLOCK($id_block): string {
|
|
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;
|
|
}
|
|
|
|
return $titre;
|
|
}
|
|
|
|
/**
|
|
* 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 {
|
|
static $cache;
|
|
$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 {
|
|
if (
|
|
$id_blocktype
|
|
&& $role
|
|
&& ($blocktypes_parents = objet_trouver_liens(['blocktype' => $id_blocktype], ['blocktype' => '*'], ['role' => $role]))
|
|
) {
|
|
return array_column($blocktypes_parents, 'id_objet');
|
|
}
|
|
return [];
|
|
}
|