Skip to content
Extraits de code Groupes Projets
blocks_fonctions.php 5,3 ko
Newer Older
<?php
/**
 * Fonctions utiles au plugin Blocks
 *
 * @plugin     Blocks
 * @copyright  2023
 * @author     nicod_
 * @licence    GNU/GPL
 * @package    SPIP\Blocks\Fonctions
 */

include_spip('inc/blocks');

 * Compile la balise `#GENERER_BLOCK` qui génère l'affiche d'un block'
nicod's avatar
nicod a validé
 * @uses _block_charger_block()
 * @balise
nicod's avatar
nicod a validé
 * @param Champ $p Pile au niveau de la balise
 * @return Champ   Pile complétée par le code à générer
nicod's avatar
nicod a validé
 *                 ```
nicod's avatar
nicod a validé
 *                 #GENERER_BLOCK génère le block de la boucle(BLOCK) en cours
 *                 #GENERER_BLOCK{3} génère le block 3
nicod's avatar
nicod a validé
 *                 ```
 */
function balise_GENERER_BLOCK_dist($p) {
	if (!($id_block = interprete_argument_balise(1, $p))) {
			$id_block = champ_sql($p->boucles[$p->id_boucle]->primary, $p);
		$msg = _T('zbug_balise_sans_argument', ['balise' => ' GENERER_BLOCK']);
		erreur_squelette($msg, $p);
		$p->interdire_scripts = true;
nicod's avatar
nicod a validé

	$p->code = "_block_charger_block($id_block)";
nicod's avatar
nicod a validé
/**
 * Fonction interne à la balise GENERER_BLOCK
 *
nicod's avatar
nicod a validé
 * @param int $id_block
 * @return string
nicod's avatar
nicod a validé
 */
nicod's avatar
nicod a validé
function _block_charger_block(int $id_block): string {
nicod's avatar
nicod a validé
	$where = ['id_block = ' . $id_block];
nicod's avatar
nicod a validé
		$where[] = 'statut = ' . sql_quote('publie');
nicod's avatar
nicod a validé
	$saisies = block_get_saisies($id_block);
	$valeurs = blocks_deserialize(sql_getfetsel('valeurs', 'spip_blocks', $where));
	$contexte = array_merge(
		[
			'id_block' => $id_block,
		],
		block_get_valeurs($saisies, $valeurs ?? [])
	);
	$html = recuperer_fond('inclure/block', $contexte);
	if ($blocs_enfants = sql_allfetsel(
		'id_block, blocktype, valeurs',
		'spip_blocks',
		'objet="block" and id_objet = ' . $id_block
	)) {
		$html_enfants = '';
		foreach ($blocs_enfants as $bloc_enfant) {
			$contexte = array_merge(
					'id_block' => $bloc_enfant['id_block'],
				block_get_valeurs(
					blocktype_info($bloc_enfant['blocktype'], 'saisies'),
					blocks_deserialize($bloc_enfant['valeurs']) ?? []
				)
			);
			if (test_espace_prive()) {
				$squelette = 'prive/squelettes/inclure/block_objet';
				$recuperer_fond_options = ['ajax' => 'block-' . $bloc_enfant['id_block']];
			} else {
				$squelette = 'inclure/block';
				$recuperer_fond_options = [];
			}
			$html_enfants .= recuperer_fond(
				$squelette,
				$contexte,
				$recuperer_fond_options
		if (str_contains($html, '<!--blocks-->')) {
			$html = str_replace('<!--blocks-->', $html_enfants, $html);
		} else {
			$html .= $html_enfants;
		}
	}
	// Ajouter un block
	if (test_espace_prive() && bloctype_trouver_enfants(block_get_blocktype($id_block))) {
		$html .= recuperer_fond(
			'prive/squelettes/inclure/block_objet',
			[
				'objet'            => 'block',
				'id_objet'         => $id_block,
				//						'id_block'            => 'new',
				'blocktype_parent' => block_get_blocktype($id_block),
				'edit_bloc'        => 1,
			],
			[
				'ajax' => 'new_block-' . $id_block,
			]
		);
	}
nicod's avatar
nicod a validé
	return $html;
nicod's avatar
nicod a validé
}

 * Compile la balise `#GENERER_BLOCKS` qui génère l'affiche des blocks liés à un objet
nicod's avatar
nicod a validé
 * @uses _block_charger_blocks()
 * @balise
nicod's avatar
nicod a validé
 * @param Champ $p Pile au niveau de la balise
 * @return Champ   Pile complétée par le code à générer
nicod's avatar
nicod a validé
 *                 ```
nicod's avatar
nicod a validé
 *                 #GENERER_BLOCKS génère les blocks de l'objet de la bouvle en cours
 *                 #GENERER_BLOCKS{article,3} génère les blocks de l'article 3
nicod's avatar
nicod a validé
 *                 ```
 */
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;
nicod's avatar
nicod a validé

		return $p;
	}

	$p->code = "_block_charger_blocks($objet, $id_objet)";
	$p->interdire_scripts = false;

	return $p;
}

nicod's avatar
nicod a validé
/**
 * Fonction interne à la balise GENERER_BLOCKS
 *
nicod's avatar
nicod a validé
 * @param string $objet
 * @param int    $id_objet
nicod's avatar
nicod a validé
 * @return string
 */
nicod's avatar
nicod a validé
function _block_charger_blocks(string $objet, int $id_objet): string {
		'objet = ' . sql_quote($objet),
		'id_objet = ' . (int)$id_objet,
		$where[] = 'statut = ' . sql_quote('publie');
		'id_block',
		'spip_blocks b',
		'rang_lien'
	foreach ($blocks as $block) {
		$retour .= _block_charger_block($block['id_block']);
nicod's avatar
nicod a validé
/**
 * Générer le titre d'un block
nicod's avatar
nicod a validé
 * composé de son type et du titre de l'objet auquel il est lié
 *
nicod's avatar
nicod a validé
 * @return string
nicod's avatar
nicod a validé
 */
nicod's avatar
nicod a validé
function generer_TITRE_BLOCK($id_block): string {
nicod's avatar
nicod a validé
	if ($infos = sql_fetsel(
nicod's avatar
nicod a validé
		'objet, id_objet, rang_lien, blocktype',
		'spip_blocks',
		'id_block = ' . (int)$id_block
		$titre = blocktype_info($infos['blocktype'], '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;