<?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) { $retour = ''; $where = ['b.id_bloc = ' . (int)$id_bloc]; if (!test_espace_prive()) { $where[] = 'b.statut = ' . sql_quote('publie'); } if ($infos = sql_fetsel( 'b.valeurs, bt.saisies, bt.identifiant', 'spip_blocs_types bt join spip_blocs b using(id_blocs_type)', $where )) { $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] ?? null; } } $squelette = blocks_trouver_squelette($infos['identifiant']); $retour = recuperer_fond($squelette, $contexte); } return $retour; } /** * 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 * @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 = ''; $where = [ 'bl.objet = ' . sql_quote($objet), 'bl.id_objet = ' . (int)$id_objet, ]; if (!test_espace_prive()) { $where[] = 'b.statut = ' . sql_quote('publie'); } $blocs = sql_allfetsel( 'b.id_bloc', 'spip_blocs_liens bl join spip_blocs b using(id_bloc)', $where, '', 'bl.rang_lien' ); 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 */ function generer_TITRE_BLOC($id_bloc) { if ($infos = sql_fetsel( '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)', 'b.id_bloc = ' . (int)$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 { $titre = _T('bloc:titre_bloc') . ' ' . $id_bloc; } return $titre; } /** * 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; }