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
*/
function blocks_serialize($data) {
return json_encode($data);
}
/**
* 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
* @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;
}
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
* @param Champ $p Pile au niveau de la balise
* @return Champ Pile complétée par le code à générer
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
* @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;
}
/**
* 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
*/
'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)',
)) {
$titre = $infos['titre'];
if ($infos['id_objet'] && $infos['objet']) {
$titre = generer_objet_info($infos['id_objet'], $infos['objet'], 'titre') . ' - ' . $titre . ' #' . $infos['rang_lien'];
}
} else {
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
/**
* 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;
}