Page 1 sur 1

Barre de progression

Posté : 07 janv. 2022, 18:34
par lacfab
Bonjour à tous,

Je souhaite faire une barre de progression. En vrai, je l'ai déjà, mais je trouve mon code particulièrement long ... j'imagine qu'on peut faire mieux et c'est ce qui m'amène.

En gros, j'ai un formulaire de projets avec 19 étapes. Des cases à cocher permettent d'indiquer qu'une étape n'est pas utile dans ce projet par exemple. Donc mon script vérifie le nombre d'étapes valides ($compte) et compte celle qui ont une date d'enregistrée ($nbr). Ensuite on utilise la variable de largeur de l'espace ($largeur_cellule) dans lequel doit s'afficher l'image et on fait ($largeur_cellule / $compte)*$nbr

Je sais que je peux faire un for pour mon listing de if dans la seconde partie, mais ce que j'aimerai savoir, c'est si je peux faire des conditions directement dans ma requête (genre compter les étapes valides, et les dates remplies, ce qui allègerait mon code.

Qu'en pensez-vous ?

PS : ce code est à type d'exemple, l'affichage est géré différemment sur la "vraie" page, là je me contente d'agrandir une image de 1x1 pixel.



Code : Tout sélectionner

$requeteProg = mysqli_query($link, "SELECT p.projet_id as projet_id, p.projet_checklist_01_check as check01, p.projet_checklist_02_check as check02, p.projet_checklist_03_check as check03, p.projet_checklist_04_check as check04, p.projet_checklist_05_check as check05, p.projet_checklist_06_check as check06, p.projet_checklist_07_check as check07, p.projet_checklist_08_check as check08, p.projet_checklist_09_check as check09, p.projet_checklist_10_check as check10, p.projet_checklist_11_check as check11, p.projet_checklist_12_check as check12, p.projet_checklist_13_check as check13, p.projet_checklist_14_check as check14, p.projet_checklist_15_check as check15, p.projet_checklist_16_check as check16, p.projet_checklist_17_check as check17, p.projet_checklist_18_check as check18, p.projet_checklist_19_check as check19, p.projet_checklist_01_date as date 01, p.projet_checklist_02_date as date 02, p.projet_checklist_03_date as date 03, p.projet_checklist_04_date as date 04, p.projet_checklist_05_date as date 05, p.projet_checklist_06_date as date 06, p.projet_checklist_07_date as date 07, p.projet_checklist_08_date as date 08, p.projet_checklist_09_date as date 09, p.projet_checklist_10_date as date 10, p.projet_checklist_11_date as date 11, p.projet_checklist_12_date as date 12, p.projet_checklist_13_date as date 13, p.projet_checklist_14_date as date 14, p.projet_checklist_15_date as date 15, p.projet_checklist_16_date as date 16, p.projet_checklist_17_date as date 17, p.projet_checklist_18_date as date 18, p.projet_checklist_19_date as date 19, p.projet_nom as projet_nom, e.entreprise_nom as entreprise_nom FROM BOG_PROJETS as p, BOG_ENTREPRISE as e WHERE p.projet_entreprise_id=e.entreprise_id AND (projet_statut_id='51' OR projet_statut_id='52' OR projet_statut_id='53' OR projet_statut_id='54' OR projet_statut_id='55' OR projet_statut_id='56') ORDER BY p.projet_datedemande asc") or die ('ERREUR CHECKLIST<br>'. mysqli_error()); $largeur_cellule = 500; echo '<table border="1">'; while ($prog = mysqli_fetch_array($requeteProg)){ $compte = 0; // Nombre total d'étapes hors celles qui sont cochées $nbr = 0; // Nombre d'étapes qui sont faites (= une date est enregistrée) if ($prog['check01']!="1"){ $compte ++; if ($prog['date01']!="0000-00-00"){ $nbr ++; }} if ($prog['check02']!="1"){ $compte ++; if ($prog['date02']!="0000-00-00"){ $nbr ++; }} if ($prog['check03']!="1"){ $compte ++; if ($prog['date03']!="0000-00-00"){ $nbr ++; }} if ($prog['check04']!="1"){ $compte ++; if ($prog['date04']!="0000-00-00"){ $nbr ++; }} if ($prog['check05']!="1"){ $compte ++; if ($prog['date05']!="0000-00-00"){ $nbr ++; }} if ($prog['check06']!="1"){ $compte ++; if ($prog['date06']!="0000-00-00"){ $nbr ++; }} if ($prog['check07']!="1"){ $compte ++; if ($prog['date07']!="0000-00-00"){ $nbr ++; }} if ($prog['check08']!="1"){ $compte ++; if ($prog['date08']!="0000-00-00"){ $nbr ++; }} if ($prog['check09']!="1"){ $compte ++; if ($prog['date09']!="0000-00-00"){ $nbr ++; }} if ($prog['check10']!="1"){ $compte ++; if ($prog['date10']!="0000-00-00"){ $nbr ++; }} if ($prog['check11']!="1"){ $compte ++; if ($prog['date11']!="0000-00-00"){ $nbr ++; }} if ($prog['check12']!="1"){ $compte ++; if ($prog['date12']!="0000-00-00"){ $nbr ++; }} if ($prog['check13']!="1"){ $compte ++; if ($prog['date13']!="0000-00-00"){ $nbr ++; }} if ($prog['check14']!="1"){ $compte ++; if ($prog['date14']!="0000-00-00"){ $nbr ++; }} if ($prog['check15']!="1"){ $compte ++; if ($prog['date15']!="0000-00-00"){ $nbr ++; }} if ($prog['check16']!="1"){ $compte ++; if ($prog['date16']!="0000-00-00"){ $nbr ++; }} if ($prog['check17']!="1"){ $compte ++; if ($prog['date17']!="0000-00-00"){ $nbr ++; }} if ($prog['check18']!="1"){ $compte ++; if ($prog['date18']!="0000-00-00"){ $nbr ++; }} if ($prog['check19']!="1"){ $compte ++; if ($prog['date19']!="0000-00-00"){ $nbr ++; }} $size = ($largeur_cellule / $compte)*$nbr; echo '<tr>'; echo '<td><strong>'.$prog['entreprise_nom'].'</strong>&nbsp;-&nbsp;'.$prog['projet_nom'].'</td>'; echo '<td width="'.$largeur_cellule.'"><img src="images/progression.png" width="'.$size.'" height="20" alt=""></td>'; echo '</tr>'; } echo '</table>';

Re: Barre de progression

Posté : 08 janv. 2022, 11:30
par lacfab
Erreur suite à mauvaise manip ! Les "as dateXX" dans ma requête comportent un espace, il va de soi qu'il n'y a pas d'espace ;o)

Re: Barre de progression

Posté : 21 janv. 2022, 21:25
par jobi1722
Bonjour,

Rien de méchant, mais si je peux me permettre, pense à :
- utiliser les boucles for pour faire ce genre de manipulation;
- Tu peux en mysql utiliser le IN( )

$nbRows = 19;
$fields = array(
	'p.project_id',
	'p.projet_nom',
	'e.entreprise_nom'
);
for($i=1;$i<=$nbRows ;$i++)
{
	$nb = str_pad($i , 2 , 0 , STR_PAD_LEFT );
	$fields[] = 'p.projet_checklist_'.$nb.'_check as check'.$nb;
	$fields[] = 'p.projet_checklist_'.$nb.'_date as date'.$nb;
}

$requeteProg = mysqli_query($link, "SELECT ".join(',',$fields)."
FROM BOG_PROJETS as p, BOG_ENTREPRISE as e
WHERE p.projet_entreprise_id=e.entreprise_id
AND (projet_statut_id in('51','52' ,'53' ,'54' ,'55' ,'56' ) )
ORDER BY p.projet_datedemande asc") or die ('ERREUR CHECKLIST<br>'. mysqli_error());

$largeur_cellule = 500;
echo '<table border="1">';
while ($prog = mysqli_fetch_array($requeteProg)){

	$compte = 0; // Nombre total d'étapes hors celles qui sont cochées
	$nbr = 0; // Nombre d'étapes qui sont faites (= une date est enregistrée)
	for($i=1;$i<=$nbRows ;$i++)
	{
		$nb = str_pad($i , 2 , 0 , STR_PAD_LEFT );
		if ($prog['check'.$i]!="1"){ $compte ++; if ($prog['date'.$i]!="0000-00-00"){ $nbr ++; }}
	}

	$size = ($largeur_cellule / $compte)*$nbr;
	echo '<tr>';
	echo '<td><strong>'.$prog['entreprise_nom'].'</strong>&nbsp;-&nbsp;'.$prog['projet_nom'].'</td>';
	echo '<td width="'.$largeur_cellule.'"><img src="images/progression.png" width="'.$size.'" height="20" alt=""></td>';
	echo '</tr>';
}
echo '</table>';

On passe de 76 lignes à 36 et on gagne en lisibilité.

Je suis sûr que ca peut encore être amélioré !

Bonne soirée