[RESOLU] Fonction s'arrêtant en cours de traitement

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Fonction s'arrêtant en cours de traitement

Re: Fonction s'arrêtant en cours de traitement

par Choopi » 11 oct. 2013, 16:00

Eurêka ! :D

C'est ni plus ni moins que la boucle qui se trouve dans mon include utilise les variables $i et $c, comme celles du fichier appelant.

Du coup, ça rentrait en conflit. :P

Merci à mon collègue de gauche (c'est lui qui a trouvé) et à votre écoute. :wink:

Re: Fonction s'arrêtant en cours de traitement

par Choopi » 11 oct. 2013, 15:20

Je suis sur le serveur de ma boite (je n'ai pas accès à tout) et, en me renseignant auprès des développeurs back, ceux-ci m'ont dit qu'ils n'écrivaient pas les erreurs PHP dans un fichier sur la plate-forme de développement mais qu'en revanche, les erreurs étaient systématiquement affichées sur la page (ce que j'ai déjà vu à de nombreuses reprises et ce qui me permet habituellement de débugguer).

J'ai tenté de forcer la chose en mettant directement dans ma page :
ini_set('display_errors', 1);
ini_set('log_errors', 1);
ini_set('error_log', '../../../modules/_cbm_php/log_error_php.txt');
chmod('../../../modules/_cbm_php/log_error_php.txt', '0777');
error_reporting(e_all);
... mais là encore, je n'obtiens rien. Bref, à priori, pas d'erreur.

Encore une fois, ce qui m'étonne, c'est surtout qu'avec l'exemple en dur (avec les Riri, Fifi, Loulou), je n'ai pas de problème, ça fonctionne.
Du coup, je me demande si ça vient vraiment de ma fonction vu qu'à la base, je n'ai pas de problème et que le passage à la version dynamisée de la vue suffit à planter ma boucle.
J'ai fait un test, au sein de ma première boucle de la fonction applyTemplates, pour afficher les valeurs de $i et $c.
$i m'affiche une fois (seulement) 0 et $c est égal à 3 (c'est ce que j'attends) mais c'est comme si je perdais le contexte.

Et ce qui m'étonne aussi, c'est que la ligne :
print "$tabs<" . (isset($componentsValues[$i]['tagName']) ? $componentsValues[$i]['tagName'] : 'section') . " id=\"$id\">\n";
... de ma fonction applyTemplates affiche bien "<header id="header"> mais que la ligne :
print $tabs . "</" . (isset($componentsValues[$i]['tagName']) ? $componentsValues[$i]['tagName'] : 'section') . ">\n\n";
... située en sortie de boucle génère "</section>" au lieu de "</header>".
En somme, c'est comme si la variable "$componentsValues[$i]['tagName']" perdait sa valeur en cours de route.

Re: Fonction s'arrêtant en cours de traitement

par xTG » 11 oct. 2013, 13:59

Que te dis le log d'erreur de PHP ?
Celui d'Apache ? (timeout ?)

Re: Fonction s'arrêtant en cours de traitement

par Choopi » 11 oct. 2013, 11:34

Je viens de voir que j'avais oublié de vous transmettre un jeu de données pour peupler ma vue. :P

En voici un :
<?php

$datas = array(
	'common'	=> array(
		'menu'	=> array(
			'url'	=> array(
				'http://www.monsite.fr/voiture.php',
				'http://www.monsite.fr/camion.php',
				'http://www.monsite.fr/moto.php',
				'http://www.monsite.fr/camping_car.php',
				'http://www.monsite.fr/velo'
			),
			'label'	=> array(
				'Voiture',
				'Camion',
				'Moto',
				'Camping car',
				'Vélo'
			)
		)
	)
);

?>

Fonction s'arrêtant en cours de traitement

par Choopi » 11 oct. 2013, 10:55

Bonjour à toutes et à tous,

J'ai une fonction récursive servant au traitement d'un tableau et celle-ci contient quelques boucles imbriquées. Cependant, la première boucle, dès lors que je dynamise une vue, ne veut plus boucler et, pour le coup, je sèche. :|

Le tableau traité est le suivant :
$page_template 	= array(
	'components' 	=> array(
		'entity:header' 	=> array(
			'tagName'	=> 'header',
			'lines' 	=> array(
				'l1'	=> array(
					'units'	=> array(
						'u1' => array(
							'size' 		=> '40%',
							'blocks' 	=> array(
								'logo'	=> array(
									'tpl'	=> TPL_PATH . '/_cbm_tpl_blocks/_cbm_tpl_blocks_buttons/logo.tpl.php'
								)
							)
						),
						'u2'	=> array(
							'blocks' 	=> array(
								'search'	=> array(
									'tpl'	=> TPL_PATH . '/_cbm_tpl_blocks/_cbm_tpl_blocks_forms/search.tpl.php'
								)
							)
						)
					)
				),
				'l2'	=> array(
					'units'	=> array(
						'u1' 	=> array(
							'blocks' 	=> array(
								'menu'	=> array(
									'tpl'	=> TPL_PATH . '/_cbm_tpl_blocks/_cbm_tpl_blocks_menus/menu.tpl.php'
								)
							)	
						)
					)
				)
			)
		),
		'hybrid:content'	=> array(
			'entity:leftCol' 	=> array(
				'tagName'	=> 'aside',
				'lines'		=> array(
					'l1'	=> array(
						'units'	=> array(
							'u1' 	=> array(
								'blocks'	=> array(
									'submenu'	=> array(
										'tpl'	=> TPL_PATH . '/_cbm_tpl_blocks/_cbm_tpl_blocks_menus/submenu.tpl.php'
									)
								)
							)
						)
					)
				)
			),
			'entity:mainCol'	=> array(
				'tagName'	=> 'article',
				'lines'		=> array(
					'l1'	=> array(
						'units'	=> array(
							'u1'	=> array(
								'blocks'	=> array(
									'article1'	=> array(
										'tpl'	=> TPL_PATH . '/_cbm_tpl_blocks/_cbm_tpl_blocks_articles/article1.tpl.php'
									),
									'searchMotor'	=> array(
										'tpl'	=> TPL_PATH . '/_cbm_tpl_blocks/_cbm_tpl_blocks_forms/searchMotor.tpl.php'
									),
									'article2'	=> array(
										'tpl'	=> TPL_PATH . '/_cbm_tpl_blocks/_cbm_tpl_blocks_articles/article2.tpl.php'
									)
								)
							)
						)
					)
				)
			),
			'entity:rightCol'	=> array(
				'tagName'	=> 'aside',
				'lines'		=> array(
					'l1'	=> array(
						'units'	=> array(
							'u1'	=> array(
								'blocks'	=> array(
									'pub1'	=> array(
										'tpl'	=> TPL_PATH . '/_cbm_tpl_blocks/_cbm_tpl_blocks_pubs/pub1.tpl.php'
									),
									'pub2'	=> array(
										'tpl'	=> TPL_PATH . '/_cbm_tpl_blocks/_cbm_tpl_blocks_pubs/pub2.tpl.php'
									)
								)
							)
						)
					)
				)
			)
		),
		'entity:footer'	=> array(
			'tagName'	=> 'footer',
			'lines'		=> array(
				'l1'	=> array(
					'units'	=> array(
						'u1'	=> array(
							'size'		=> '25%',
							'blocks'	=> array(
								'links1'	=> array(
									'tpl'	=> TPL_PATH . '/_cbm_tpl_blocks/_cbm_tpl_blocks_listings/links1.tpl.php'
								)
							)
						),
						'u2'	=> array(
							'size'		=> '50%',
							'blocks'	=> array(
								'links2'	=> array(
									'tpl'	=> TPL_PATH . '/_cbm_tpl_blocks/_cbm_tpl_blocks_listings/links2.tpl.php'
								)
							)
						),
						'u3'	=> array(
							'blocks'	=> array(
								'links3'	=> array(
									'tpl'	=> TPL_PATH . '/_cbm_tpl_blocks/_cbm_tpl_blocks_listings/links3.tpl.php'
								)
							)
						)
					)
				)
			)
		)
	)
);
et la fonction de traitement est la suivante :
function applyTemplates($components, $tabs = "\t\t\t")
{
	global $datas;
	$componentsKeys		= array_keys($components);
	$componentsValues	= array_values($components);
	for($i = 0, $c = count($components); $i < $c; $i++) {
		$id = substr($componentsKeys[$i], 7);
		if(preg_match('/entity:/', $componentsKeys[$i])) {
			$recursive = false;
		}
		elseif(preg_match('/hybrid:/', $componentsKeys[$i])) {
			$recursive = true;
		}
		print "$tabs<" . (isset($componentsValues[$i]['tagName']) ? $componentsValues[$i]['tagName'] : 'section') . " id=\"$id\">\n";
		if($recursive) {
			print "\n";
			applyTemplates($componentsValues[$i], "\t" . $tabs);
		}
		else {
			$lines 			= $componentsValues[$i]['lines'];
			$linesKeys		= array_keys($lines);
			$linesValues	= array_values($lines);
			for($j = 0, $d = count($lines); $j < $d; $j++) {
				print "\t$tabs<section class=\"" . $linesKeys[$j] . " line\">\n";
				$units			= $linesValues[$j]['units'];
				$unitsKeys		= array_keys($units);
				$unitsValues	= array_values($units);
				for($k = 0, $e = count($units); $k < $e; $k++) {
					print "\t\t$tabs<section class=\"" . $unitsKeys[$k];
					print (($k == $e - 1) ? ' lastunit">' : (' unit" style="width:' . $unitsValues[$k]['size'] . ';">')) . "\n";
					$blocks			= $unitsValues[$k]['blocks'];
					$blocksKeys		= array_keys($blocks);
					$blocksValues	= array_values($blocks);
					for($l = 0, $f = count($blocks); $l < $f; $l++) {
						$filename = substr($blocksValues[$l]['tpl'], strrpos($blocksValues[$l]['tpl'], '/') + 1);
						print "\t\t\t$tabs<article class=\"block " . $blocksKeys[$l] . "\">\n";
						print "<!-- $filename -->\n";
						include $blocksValues[$l]['tpl'];
						print "<!-- / $filename -->\n\t\t\t$tabs</article>\n";
					}
					print "\t\t$tabs</section>\n";
				}
				print "\t$tabs</section>\n";
			}
		}
		print $tabs . "</" . (isset($componentsValues[$i]['tagName']) ? $componentsValues[$i]['tagName'] : 'section') . ">\n\n";
	}
}
Comme vous pouvez le voir, il y a une include qui représente ma vue et je tentais de dynamiser mon menu (menu.tpl.php).
Lorsque, dans cette vue, je mets :
<div>
	<ul>
		<li>Riri</li>
		<li>Fifi</li>
		<li>Loulou</li>
	</ul>
</div>
... tout se déroule pour le mieux et la fonction arrive au bout de son traitement.

En revanche, dès lors que j'essaie de dynamiser le tout en traitant mon tableau référent, la première boucle for n'itère plus.

J'ai mis ce code au sein de ma vue :
<div>
<?php

$urls	= $datas['common']['menu']['url'];
$labels	= $datas['common']['menu']['label'];
if(count($urls) == count($labels)) {
	echo "\t", '<ul class="menu">', "\n";
	for($i = 0, $c = count($urls); $i < $c; $i++) {
		echo "\t\t", '<li><a href="', $urls[$i], '">', $labels[$i], '</a></li>', "\n";
	}
	echo "\t", '</ul>', "\n";
}

?>
</div>
Le menu s'affiche bien mais la fonction arrête son traitement juste après.

Auriez-vous une idée de mon erreur, s'il vous plait ? 8-|

Cordialement.