[spip-dev] Headers ...

Bonjour,

pour gérer avec SPIP le contenu d'un site de type portail, c'est à dire la
partie centrale, j'ai des fichiers 'article.php3' du type suivant :

<?php
require 'global.inc.php';
pageHeader();

$fond = 'skel/article';
$delais = 24 * 3600;
require 'inc-public.php3';

pageFooter();
?>

Malheureusement, cela me donne le warning suivant :

Warning: Cannot add header information - headers already sent by (output
started at D:\Mes documents\lecercle\private\include\design.inc.php:17) in
d:\mes documents\lecercle\public\actualites\ecrire\inc_version.php3 on line 181

En effet, ma fonction pageHeader() a déjà envoyé un contenu HTML, et les
headers ne peuvent donc plus être envoyés ...

Je suppose que c'est un problème qui risque de revenir souvent, donc il
faudrait penser à une solution plus modulaire ou tout est dans des fonctions
appelées par 'spipHeaders()' et 'spipContent()', ce qui pourrait donner :

<?php
require 'inc-public.php3';
require 'global.inc.php';

$fond = 'skel/article';
$delais = 24 * 3600;
spipHeaders();

pageHeader();

spipContent();

pageFooter();
?>

On obtiendrait ainsi une énorme souplesse pour l'intégration de SPIP à des
sites existants. Par exemple, un site géré globalement par daCode, mais avec
les articles (mieux) gérés par SPIP ... :slight_smile:

Qu'en dites-vous ?

-Nicolas

Tu dois pouvoir jouer avec l'output buffering de php4.

@ Nicolas Hoizey (nhoizey@phpheaven.net) :

En effet, ma fonction pageHeader() a déjà envoyé un contenu HTML, et les
headers ne peuvent donc plus être envoyés ...

-- Fil

(re)Bonjour,

je me répond à moi-même ... :slight_smile:

Warning: Cannot add header information - headers already sent [...]
En effet, ma fonction pageHeader() a déjà envoyé un contenu HTML,
et les headers ne peuvent donc plus être envoyés ...

Grace à Fil (merci !) qui m'a suggéré d'aller voir du côté de l'Output
Buffering (http://zend.com/zend/art/buffering.php), voici une solution qui
marche au moins pour moi :

<?php
ob_start();
require_once 'global.inc.php';
pageHeader();

// Contenu SPIP
$fond = 'skel/article';
$delais = 24 * 3600;
require 'inc-public.php3';
// Fin contenu SPIP

pageFooter();
?>

(il y a juste le 'ob_start()' du début en plus)

Et dans 'ecrire/inc_version.php3', remplacer (tout à la fin) :

if ($use_gz) {
  ob_start("ob_gzhandler");
}

Par :

if ($use_gz) {
  $alreadySent = ob_get_contents();
  if ($alreadySent == false) $alreadySent = '';
  ob_end_clean();
  ob_start("ob_gzhandler");
  echo $alreadySent;
}

-Nicolas

Salut,

C'est une collection compl=E8te, aujourd'hui! Modification sur le fichier:
/inc-public.php3

Ca corrige le bug des p=E9titions qui ne se signaient plus (LSIjolie,
idem sur uZine...).

Il risque d'y avoir d'autres probl=E8mes similaires. Ca vient du
"/ecrire/inc-version.php3", qui semble r=E9initialiser les variables
d'environnement (un truc comme =E7a, hein, je sais pas trop =E0 quoi sert
la fonction reset_kekchose()). Du coup, chaque fois qu'on fait appel
=E0 une variable de l'URL, =E7a semble merder (ici, c'=E9tait $val qui
s'=E9tait perdu en cours de route).

ARNO*

Salut,

Il risque d'y avoir d'autres problèmes similaires. Ca vient du
"/ecrire/inc-version.php3", qui semble réinitialiser les variables
d'environnement (un truc comme ça, hein, je sais pas trop à quoi sert
la fonction reset_kekchose()). Du coup, chaque fois qu'on fait appel
à une variable de l'URL, ça semble merder (ici, c'était $val qui
s'était perdu en cours de route).

Ah je vois ;)) La partie qui traite les variables passées en paramètre
utilise une ligne du genre while (list($key, $val) = each($HTTP_GET_VARS)).
Du coup, les variables d'URL nommées $key et $val ne passent plus....
Soit on modifie ces noms dans inc_version, soit on s'astreint (ce qui
est plus propre) à utiliser des variables d'url explicites (par exemple
$pass_petition au lieu de $val, etc).

Sinon j'ai retrouvé le message qui parle de propre et typo :

a+

Antoine.

@ Antoine Pitrou (pitrou@free.fr) :

Ah je vois ;)) La partie qui traite les variables passées en paramètre
utilise une ligne du genre while (list($key, $val) = each($HTTP_GET_VARS)).
Du coup, les variables d'URL nommées $key et $val ne passent plus....

Il faudrait des variables locales, faire une fonction quoi...

-- Fil

@ Fil (fil@rezo.net) :

> Du coup, les variables d'URL nommées $key et $val ne passent plus....

Il faudrait des variables locales, faire une fonction quoi...

voilà qui est fait : inc_version.php3

-- Fil

Coucou,

Désolé, mais ça ne résout pas le problème. si $val est un jour
utilisé ailleurs, ça va foirer de nouveau. Il faut utiliser des
variables explicites pour le passage de paramètres et tout ce
qui ressemble à des données persistantes (i.e. éviter $i, $val,
$toto, etc.). C'est pas la première fois que je le signale, d'ailleurs,
m'enfin :))

En réponse à Fil <fil@rezo.net>:

@ Antoine Pitrou (pitrou@free.fr) :

Désolé, mais ça ne résout pas le problème. si $val est un jour
utilisé ailleurs, ça va foirer de nouveau. Il faut utiliser des

pas ce $val là, tout de même, il est local à la fonction magic_quotes() ???

variables explicites pour le passage de paramètres et tout ce
qui ressemble à des données persistantes (i.e. éviter $i, $val,
$toto, etc.).

bien dit !

-- Fil