J'écris une fonction, en tant qu'exercice d'apprentissage, pour combiner et réduire les fichiers css et les fichiers php qui génèrent des css générés.Comment éviter les conflits de variables lors de l'utilisation de tampons de sortie
Tout va bien dans les fichiers css mais dès qu'il essaie de pousser la chaîne renvoyée par le tampon de sortie du fichier php, le tableau devient un int. var_dump() donne ceci:
int(5)
J'ai également essayé de concaténer les chaînes; il fonctionne bien à nouveau jusqu'à ce qu'il get dans le fichier php, puis tout précédent dans la chaîne devient 4. Comme si:
4/*
* Home: Appointment Grid
*/
.difAppointmentGrid {
margin: 2rem 0;
font-family: "Lato" !important;
box-shadow: -4px 4px 16px 4px hsla(240, 0%, 0%, 0.1);
}
. . .
Voici un exemple de ce que je fais dans le fichier styles.php:
. . .
.difAppointmentGrid header div h3 {
margin: 0;
padding: 1.5rem 0;
font-size: 2rem;
text-align: center;
color: white;
}
<?php
for ($h3 = 1, $o = 0.40; $h3 <= 4; ++$h3, $o += 0.20)
{
$rule = '.difAppointmentGrid header div:nth-child('.$h3.') h3 {'."\n\t".
'background-color: hsla(223, 63%, 22%, '.$o.');'."\n".
'}'."\n";
echo $rule;
}
?>
.dif_grid {
display: flex;
}
. . .
C'est la fonction:
function styles_init()
{
$path = __DIR__ . '/aggregate.min.css';
if (is_writable($path))
{
$r = array();
foreach(array_filter(glob(__DIR__ . '/modules/*.*'), 'is_file') as $file)
{
$fn = pathinfo($file);
if ($fn['extension'] == 'php' || $fn['extension'] == 'css' )
{
ob_start();
include($file);
$x = ob_get_flush();
$r[] = $x;
}
}
$c = implode("\n\n", $r);
//$c = str_replace(array(' {', ': ', ', '), array('{', ':', ',') , str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $c)));
$f = fopen($path, 'wb');
fwrite($f, $c);
fclose($f);
}
}
la partie la plus bizarre est pas d'erreur sont effectivement jetés quand array_pushing/concaténer. Je ne sais même pas exactement quelle question poser parce que je n'arrive pas à comprendre ce qui ne va pas. Je me suis aussi amusé avec les en-têtes, l'encodage de caractères, les différentes fonctions d'ob, et le lancement de ob_get_flush pour enchaîner le désespoir.
Solution:
function get_include_output($file)
{
ob_start();
include($file);
return ob_get_flush();
}
function styles_init()
{
$path = __DIR__ . '/aggregate.min.css';
if (is_writable($path))
{
$r = array();
foreach(array_filter(glob(__DIR__ . '/modules/*.*'), 'is_file') as $file)
{
$fn = pathinfo($file);
if ($fn['extension'] == 'php' || $fn['extension'] == 'css' )
{
$r[] = get_include_contents($file);
}
}
$c = implode("\n\n", $r);
//$c = str_replace(array(' {', ': ', ', '), array('{', ':', ',') , str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $c)));
$f = fopen($path, 'wb');
fwrite($f, $c);
fclose($f);
}
}
Où le dumping vous? Aussi '$ r [] = $ x' est mieux que d'utiliser' array_push() 'ici. – GentlemanMax
@GentlemanMax Je viens de l'essayer avec $ r [count ($ r)] = $ x; et il en résulte le même comportement. Je viens d'utiliser var_dump() et error_log() pour obtenir les valeurs lors de la boucle. Mon soupçon est que cela provient d'un aspect de la mise en mémoire tampon de sortie que je ne connais pas. – Taishi
Vous n'avez pas besoin du bit 'count ($ r)', quoi qu'il en soit, vous faites 'var_dump ($ r)' juste après 'array_push()'? Avez-vous essayé avec 'ob_get_clean()'? – GentlemanMax