<?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; } function blocks_serialize($data) { return json_encode($data); } function blocks_deserialize($data) { return json_decode($data ?? '', true); } /** * Compile la balise `#GENERER_BLOCK` qui génère l'affiche d'un bloc' * * @balise * @example * ``` * #GENERER_BLOCK * #GENERER_BLOCK{3} * ``` * @param Champ $p Pile au niveau de la balise * @return Champ Pile complétée par le code à générer */ 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; } /** * Compile la balise `#GENERER_BLOCKS` qui génère l'affiche des blocs liés à un objet * * @balise * @example * ``` * #GENERER_BLOCKS * #GENERER_BLOCKS{article,3} * ``` * @param Champ $p Pile au niveau de la balise * @return Champ Pile complétée par le code à générer */ 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; } 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 ); // chercher le squelette pour afficher le contenu du bloc if ( test_espace_prive() && ($f = find_in_path($infos['identifiant'] . '.' . _EXTENSION_SQUELETTES, 'blocks_prive/')) && lire_fichier($f, $contenu) ) { $squelette = 'blocks_prive/' . $infos['identifiant']; } else if ( ($f = find_in_path($infos['identifiant'] . '.' . _EXTENSION_SQUELETTES, 'blocks/')) && lire_fichier($f, $contenu) ) { $squelette = 'blocks/' . $infos['identifiant']; } else { $squelette = 'blocks/dist'; } $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]; } } return recuperer_fond($squelette, $contexte); }