Valider f2cee814 rédigé par esj's avatar esj
Parcourir les fichiers

Le déclenchement de la prévisualisation était mal situé, car en amont des...

Le déclenchement de la prévisualisation était mal situé, car en amont des exécutions éventuelles de code PHP présents dans le code compilé du squelette.
C'était déjà peu jouable pour la prévisualisation HTML, franchement inutilisable
pour une prévisualisation PDF (voir notamment le
"plugin spipdf":http://contrib.spip.net/spiPDF-v0-2-1-generer-des-contenus-sur-mesure-en-PDF
qui oblige à dédoubler tous les squelettes faute de pouvoir faire ça).

On déplace donc un peu en aval ce déclenchement, et on confie le comportement
standard à une fonction surchargeable: "public_previsualisation".

Comme exemple d'utilisation avec la lib mpdf (à installer)
rajouter dans squelettes-dist/formulaires/administration.html
le bouton suivant :
<pre><code class='html'>
[<a class="spip-admin-boutons"
     href="(#VAL{lib/mpdf}|is_dir|?{#SELF}
	|parametre_url_nonvide{var_mode,preview}
	|parametre_url_nonvide{pdf,1})">PDF</a>
]
</code></pre>

et définir dans mes_fontions.php

<pre><code class='php'>
function public_previsualisation($page)
{
  if (!_request('pdf') OR !is_readable($f = _DIR_RACINE . 'lib/mpdf/mpdf.php'))
    return public_previsualisation_dist($page);
  include_once($f);
  $f = str_replace(' ', '_', $GLOBALS['meta']['nom_site']) . '.pdf';
  $GLOBALS['flag_preserver'] = true;
  $page['entetes']['Content-Type'] = "application/pdf";
  $page['entetes']['Content-Disposition'] = "attachment; filename=$f";
  $mpdf = new mPDF($GLOBALS['meta']['charset']);
  $mpdf->WriteHTML($page['texte']);
  $page['texte'] = $mpdf->Output('', 'S');
  return $page;
}

function parametre_url_nonvide($url, $c, $v=NULL, $sep='&amp;') {
	return !$url ? '' : parametre_url($url, $c, $v, $sep);
}
</code></pre>
parent 9c5eb7d5
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+19 −33
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -133,26 +133,12 @@ if (isset($GLOBALS['_INC_PUBLIC'])) {
		$html = preg_match(',^\s*text/html,',$page['entetes']['Content-Type']);
	}

	if ($var_preview AND $html) {
		include_spip('inc/filtres'); // pour http_img_pack
		$x = _T('previsualisation');
		$x = http_img_pack('naviguer-site.png', $x) . '&nbsp;' . majuscules($x); 
		$x = "<div class='spip-previsu'>$x</div>";
		if (!$pos = strpos($page['texte'], '</body>'))
			$pos = strlen($page['texte']);
		$page['texte'] = substr_replace($page['texte'], $x, $pos, 0);
	}

	$affiche_boutons_admin = ($html AND ((
		isset($_COOKIE['spip_admin'])
		AND !$flag_preserver
				   ) OR $debug));
	$affiche_boutons_admin = ($debug OR ($html AND isset($_COOKIE['spip_admin']) AND !$flag_preserver));

	if ($affiche_boutons_admin)
		include_spip('balise/formulaire_admin');



 	// decompte des visites, on peut forcer a oui ou non avec le header X-Spip-Visites
 	// par defaut on ne compte que les pages en html (ce qui exclue les js,css et flux rss)
 	$spip_compter_visites = $html?'oui':'non';
@@ -163,23 +149,16 @@ if (isset($GLOBALS['_INC_PUBLIC'])) {

	// Execution de la page calculee


	// traitements sur les entetes avant envoi
	// peut servir pour le plugin de stats
	$page['entetes'] = pipeline('affichage_entetes_final', $page['entetes']);


	// 1. Cas d'une page contenant uniquement du HTML :
	if ($page['process_ins'] == 'html') {
		envoyer_entetes($page['entetes']);
	}

	// 2. Cas d'une page contenant du PHP :
	if ($page['process_ins'] != 'html') {
	// Cas d'une page contenant du PHP :
	// Attention cette partie eval() doit imperativement
	// etre declenchee dans l'espace des globales (donc pas
	// dans une fonction).
	else {
		// sinon, inclure_balise_dynamique nous enverra peut-etre
	// inclure_balise_dynamique nous enverra peut-etre
	// quelques en-tetes de plus (voire qq envoyes directement)

		// restaurer l'etat des notes
@@ -189,21 +168,28 @@ if (isset($GLOBALS['_INC_PUBLIC'])) {
		}
		ob_start(); 
		xml_hack($page, true);
		$res = eval('?' . '>' . $page['texte']);
		$page['process_ins'] = eval('?' . '>' . $page['texte']);
		$page['texte'] = ob_get_contents(); 
		xml_hack($page);
		ob_end_clean();
	}

	if ($var_preview
	AND $var_preview = charger_fonction('previsualisation', 'public', true)) {
		$page = $var_preview($page);
		// Cette variable a ete calculee trop tot
		// on laisse son calcul ci-dessus pour compatibilite
		// bien que l'enlever a l'air sans incidence
		$html = preg_match(',^\s*text/html,',$page['entetes']['Content-Type']);
	}
	envoyer_entetes($page['entetes']);

	// en cas d'erreur lors du eval,
	// la memoriser dans le tableau des erreurs

		if ($res === false) {
	if ($page['process_ins'] === false) {
			$msg = array('zbug_erreur_execution_page');
			erreur_squelette($msg);
	}
	}

	//
	// Post-traitements
	//
+13 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -686,6 +686,19 @@ function page_base_href(&$texte){
	}
}

function public_previsualisation_dist($page)
{
	if (preg_match(',^\s*text/html,',$page['entetes']['Content-Type'])) {
		include_spip('inc/filtres'); // pour http_img_pack
		$x = _T('previsualisation');
		$x = http_img_pack('naviguer-site.png', $x) . '&nbsp;' . majuscules($x); 
		$x = "<div class='spip-previsu'>$x</div>";
		if (!$pos = strpos($page['texte'], '</body>'))
			$pos = strlen($page['texte']);
		$page['texte'] = substr_replace($page['texte'], $x, $pos, 0);
	}
	return $page;
}

// Envoyer les entetes, en retenant ceux qui sont a usage interne
// et demarrent par X-Spip-...