8722 sujets

Développement web côté serveur, CMS

Bonjour, j'aimerais savoir s'il y a possibilité de simplifier d'une manière ou d'une autre ce type de fonction, sachant qu'elle est fait d'éléments assez répétitifs, et que j'aurais besoin d'en rajouter encore d'autres (line_7 avec g1, g2, g3 line_8 avec h1, h2, h3 etc...)

function is_month_precip($tab_line, $tab_a1, $tab_a2, $tab_a3, $tab_b1, $tab_b2, $tab_b3, $tab_c1, $tab_c2, $tab_c3, $tab_d1, $tab_d2, $tab_d3, $tab_e1, $tab_e2, $tab_e3, $tab_f1, $tab_f2, $tab_f3) {
	
	if ($tab_line =='line_1') {
		if(($tab_a1 =='13')||($tab_a2 =='13')||($tab_a3 =='13')){
			return true;
		}
		else {
			return false;	
		}
	}	
	elseif ($tab_line =='line_2') {
		if(($tab_a1 =='13')||($tab_a2 =='13')||($tab_a3 =='13')||($tab_b1 =='13')||($tab_b2 =='13')||($tab_b3 =='13')){
			return true;
		}
		else {
			return false;	
		}
	}	
	elseif ($tab_line =='line_3') {
		if(($tab_a1 =='13')||($tab_a2 =='13')||($tab_a3 =='13')||($tab_b1 =='13')||($tab_b2 =='13')||($tab_b3 =='13')||($tab_c1 =='13')||($tab_c2 =='13')||($tab_c3 =='13')){
			return true;
		}
		else {
			return false;	
		}
	}
	elseif ($tab_line =='line_4') {
		if(($tab_a1 =='13')||($tab_a2 =='13')||($tab_a3 =='13')||($tab_b1 =='13')||($tab_b2 =='13')||($tab_b3 =='13')||($tab_c1 =='13')||($tab_c2 =='13')||($tab_c3 =='13')||($tab_d1 =='13')||($tab_d2 =='13')||($tab_d3 =='13')){
			return true;
		}
		else {
			return false;	
		}
	}	
	elseif ($tab_line =='line_5') {
		if(($tab_a1 =='13')||($tab_a2 =='13')||($tab_a3 =='13')||($tab_b1 =='13')||($tab_b2 =='13')||($tab_b3 =='13')||($tab_c1 =='13')||($tab_c2 =='13')||($tab_c3 =='13')||($tab_d1 =='13')||($tab_d2 =='13')||($tab_d3 =='13')||($tab_e1 =='13')||($tab_e2 =='13')||($tab_e3 =='13')){
			return true;
		}
		else {
			return false;	
		}		
	}
	elseif ($tab_line =='line_6') {
		if(($tab_a1 =='13')||($tab_a2 =='13')||($tab_a3 =='13')||($tab_b1 =='13')||($tab_b2 =='13')||($tab_b3 =='13')||($tab_c1 =='13')||($tab_c2 =='13')||($tab_c3 =='13')||($tab_d1 =='13')||($tab_d2 =='13')||($tab_d3 =='13')||($tab_e1 =='13')||($tab_e2 =='13')||($tab_e3 =='13')||($tab_f1 =='13')||($tab_f2 =='13')||($tab_f3 =='13')){
			return true;
		}
		else {
			return false;	
		}		
	}	
}


j'ai beau me creuser la tête, je vois pas bien comment la simplifier sans la rendre en fait plutôt encore plus complexe.
Salut

Avec un "for of" on peut tester si les valeurs des éléments d'une ligne existante sont valides.

Comme vous ne donnez pas tous vos codes, j'ai fait un exemple avec des groupes d'inputs.

<div id="tab_line1">
    <input id="tab_a1" value="10">
    <input id="tab_a2" value="10">
    <input id="tab_a3" value="10">
</div>

<div id="tab_line2">
    <input id="tab_b1" value="10">
    <input id="tab_b2" value="10">
    <input id="tab_b3" value="10">
</div>

<div id="tab_line3">
    <input id="tab_c1" value="10">
    <input id="tab_c2" value="10">
    <input id="tab_c3" value="10">
</div>

<div id="tab_line4">
    <input id="tab_d1" value="10">
    <input id="tab_d2" value="10">
    <input id="tab_d3" value="10">
</div>

<div id="tab_line5">
    <input id="tab_e1" value="10">
    <input id="tab_e2" value="10">
    <input id="tab_e3" value="10">
</div>

<div id="tab_line6">
    <input id="tab_f1" value="10">
    <input id="tab_f2" value="13">
    <input id="tab_f3" value="10">
</div>

<div id="tab_line7">
    <input id="tab_g1" value="10">
    <input id="tab_g2" value="10">
    <input id="tab_g3" value="10">
</div>

<div id="tab_line8">
    <input id="tab_h1" value="10">
    <input id="tab_h2" value="10">
    <input id="tab_h3" value="10">
</div>


function is_month_precip(){
    const 
        elemLines = Array.from(document.querySelectorAll('[id^="tab_line"]'));
        // elemLines est un Array contenant toutes les lignes exostantes 

    let 
        elemTabs = null;
        // elemTabs est un Array contenant tous les inputs existants dans une ligne

    for ( const [i, item] of elemLines.entries()){
        elemTabs = Array.from(item.querySelectorAll('[id^="tab_"]'));

        for (const [j, jtem] of elemTabs.entries()){
            if (Number(jtem.value) === 13){
                console.log(`true pour ligne ${ i + 1 } sur l'élément ${ jtem.id }`);
                return true;
            }
        }
    }

    return false;
}

is_month_precip();


Console (touche F12) : "true pour ligne 6 sur l'élément tab_f2"
Ok merci, je vais analyser ce que tu m'a donner, même si je sais pas si ça correspond à ce que je peux faire. L'intégralité du code est un peu compliqué à donner, elle regroupe plusieurs fonctions.

Une première qui teste le nombre de ligne désiré

			
			  <label class="form-check-label">
				<input class="form-check-input" onclick="document.getElementById('var_configuration').submit();" type="radio" name="var_line[]" <?php if ($tab_line=='line_1') { echo 'checked'; }?> value="line_1">
				<?php echo $trad['Line1'] ;?>
			  </label>

			  <label class="form-check-label">
				<input class="form-check-input" onclick="document.getElementById('var_configuration').submit();" type="radio" name="var_line[]" <?php if ($tab_line=='line_2') { echo 'checked'; }?> value="line_2">
				<?php echo $trad['Line2'];?>
			  </label>
etc...line_3, line_4


et une seconde qui choisi la valeur choisi dans chaque case. Il y a 3 cases par lignes.
if (($tab_line =='line_1') || ($tab_line =='line_2') || ($tab_line =='line_3') || ($tab_line =='line_4') || ($tab_line =='line_5') || ($tab_line =='line_6') || ($tab_line =='line_7') || ($tab_line =='line_8') || ($tab_line =='line_9') || ($tab_line =='line_10')) {
						<select name="var_a1[]" class="form-control" >			
							<option selected value="<?php echo $tab_a1 ; ?>"><?php echo $trad['Choose'] ; ?></option>
							<?php include('inc/inc_select.php'); ?> 			
						</select>
						<select name="var_a2[]" class="form-control" >			
							<option selected value="<?php echo $tab_a2 ; ?>"><?php echo $trad['Choose'] ; ?></option>
							<?php include('inc/inc_select.php'); ?>
						</select>
						<select name="var_a3[]" class="form-control" >			
							<option selected value="<?php echo $tab_a3 ; ?>"><?php echo $trad['Choose'] ; ?></option>
							<?php include('inc/inc_select.php'); ?> 			
						</select>

}

etc...
b1, b2 ,b3...


le inc_select est juste une série de <option value=""></option> donc ici value="13" choisi pour mon exemple.


Je sauvegarde tout ça dans un fichier externe


$tab_line = (isset($_POST['var_line'])) ? $_POST['var_line']:null;
	if (!empty($tab_line)) {
		$tab_line = $tab_line[0];
	}
	else {
		$tab_line = null;
	}
$tab_line = Trim(stripslashes($tab_line));



$tab_a1 = (isset($_POST['var_a1'])) ? $_POST['var_a1']:null;
	if (!empty($tab_a1)) {
		$tab_a1 = $tab_a1[0];
	}
	else {
		$tab_a1 = null;
	}
$tab_a1 = Trim(stripslashes($tab_a1));

$tab_a2 = (isset($_POST['var_a2'])) ? $_POST['var_a2']:null;
	if (!empty($tab_a2)) {
		$tab_a2 = $tab_a2[0];
	}
	else {
		$tab_a2 = null;
	}
$tab_a2 = Trim(stripslashes($tab_a2));


etc... a3 b1, b2, b3 etc...


je passe sur la fonction qui permet de sauvegarder ça dans un fichier (c'est pas du sql, mais c'est tout comme), puis je le récupère et affiche le résultat :


if (($tab_line =='line_2') || ($tab_line =='line_3') || ($tab_line =='line_4') || ($tab_line =='line_5') || ($tab_line =='line_6') || ($tab_line =='line_7') || ($tab_line =='line_8') || ($tab_line =='line_9') || ($tab_line =='line_10')) {
?>	

<div class="row row_espace row_espace_top">

	<div id="b1" class="col-xs-4">

	<?php include('inc/' . $tab_b1 . '_inc_xml.php'); ?>
	
	</div>

	<div id="b2" class="col-xs-4">
	
	<?php include('inc/' . $tab_b2 . '_inc_xml.php'); ?>
	
	</div>
	
	<div id="b3" class="col-xs-4">
	
	<?php include('inc/' . $tab_b3 . '_inc_xml.php'); ?>
	
	</div>
</div>

etc...



bon je sais pas si je suis très clair, je vais pas mettre tout le code. En gros c'est un systeme d'affichage de tableau où on choisit le nombre de ligne et le type de case que l'on veut.

La fonction is_month_precip($tab_line, $tab_a1, $tab_a2, $tab_a3, $tab_b1, $tab_b2, $tab_b3, $tab_c1, $tab_c2, $tab_c3, $tab_d1, $tab_d2, $tab_d3, $tab_e1, $tab_e2, $tab_e3, $tab_f1, $tab_f2, $tab_f3) ici teste simplement si la case correspondant à la valeur "13" a été choisi dans l'ensemble du tableau quelque-part.
Modifié par Damien49 (07 Dec 2018 - 21:17)
Bonsoir DamienHargoul, mais enfin il te demande le php et toi tu fournis le JavaQuery, ce n'est pas du tout le même language!!! Smiley eek
Le complateur ne va pas valider W3C ta page!! Il serait de bon ton de factoriser tes tests en utilisant in_array ou array_search(column) https://stackoverflow.com/questions/24470355/php-search-array-column-for-match

Enfin!! Bon code
danielhagnoul a écrit :
Salut

Avec un "for of" on peut tester si les valeurs des éléments d'une ligne existante sont valides.

Comme vous ne donnez pas tous vos codes, j'ai fait un exemple avec des groupes d'inputs.

&lt;div id="tab_line1"&gt;
    &lt;input id="tab_a1" value="10"&gt;
    &lt;input id="tab_a2" value="10"&gt;
    &lt;input id="tab_a3" value="10"&gt;
&lt;/div&gt;

&lt;div id="tab_line2"&gt;
    &lt;input id="tab_b1" value="10"&gt;
    &lt;input id="tab_b2" value="10"&gt;
    &lt;input id="tab_b3" value="10"&gt;
&lt;/div&gt;

&lt;div id="tab_line3"&gt;
    &lt;input id="tab_c1" value="10"&gt;
    &lt;input id="tab_c2" value="10"&gt;
    &lt;input id="tab_c3" value="10"&gt;
&lt;/div&gt;

&lt;div id="tab_line4"&gt;
    &lt;input id="tab_d1" value="10"&gt;
    &lt;input id="tab_d2" value="10"&gt;
    &lt;input id="tab_d3" value="10"&gt;
&lt;/div&gt;

&lt;div id="tab_line5"&gt;
    &lt;input id="tab_e1" value="10"&gt;
    &lt;input id="tab_e2" value="10"&gt;
    &lt;input id="tab_e3" value="10"&gt;
&lt;/div&gt;

&lt;div id="tab_line6"&gt;
    &lt;input id="tab_f1" value="10"&gt;
    &lt;input id="tab_f2" value="13"&gt;
    &lt;input id="tab_f3" value="10"&gt;
&lt;/div&gt;

&lt;div id="tab_line7"&gt;
    &lt;input id="tab_g1" value="10"&gt;
    &lt;input id="tab_g2" value="10"&gt;
    &lt;input id="tab_g3" value="10"&gt;
&lt;/div&gt;

&lt;div id="tab_line8"&gt;
    &lt;input id="tab_h1" value="10"&gt;
    &lt;input id="tab_h2" value="10"&gt;
    &lt;input id="tab_h3" value="10"&gt;
&lt;/div&gt;


function is_month_precip(){
    const 
        elemLines = Array.from(document.querySelectorAll('[id^="tab_line"]'));
        // elemLines est un Array contenant toutes les lignes exostantes 

    let 
        elemTabs = null;
        // elemTabs est un Array contenant tous les inputs existants dans une ligne

    for ( const [i, item] of elemLines.entries()){
        elemTabs = Array.from(item.querySelectorAll('[id^="tab_"]'));

        for (const [j, jtem] of elemTabs.entries()){
            if (Number(jtem.value) === 13){
                console.log(`true pour ligne ${ i + 1 } sur l'élément ${ jtem.id }`);
                return true;
            }
        }
    }

    return false;
}

is_month_precip();


Console (touche F12) : "true pour ligne 6 sur l'élément tab_f2"
Bonsoir DamienHargoul, mais enfin il te demande le php et toi tu fournis le JavaQuery, ce n'est pas du tout le même language!!! Smiley eek
Le complateur ne va pas valider W3C ta page!!
danielhagnoul a écrit :
Salut

Avec un "for of" on peut tester si les valeurs des éléments d'une ligne existante sont valides.

Comme vous ne donnez pas tous vos codes, j'ai fait un exemple avec des groupes d'inputs.

&lt;div id="tab_line1"&gt;
    &lt;input id="tab_a1" value="10"&gt;
    &lt;input id="tab_a2" value="10"&gt;
    &lt;input id="tab_a3" value="10"&gt;
&lt;/div&gt;

&lt;div id="tab_line2"&gt;
    &lt;input id="tab_b1" value="10"&gt;
    &lt;input id="tab_b2" value="10"&gt;
    &lt;input id="tab_b3" value="10"&gt;
&lt;/div&gt;

&lt;div id="tab_line3"&gt;
    &lt;input id="tab_c1" value="10"&gt;
    &lt;input id="tab_c2" value="10"&gt;
    &lt;input id="tab_c3" value="10"&gt;
&lt;/div&gt;

&lt;div id="tab_line4"&gt;
    &lt;input id="tab_d1" value="10"&gt;
    &lt;input id="tab_d2" value="10"&gt;
    &lt;input id="tab_d3" value="10"&gt;
&lt;/div&gt;

&lt;div id="tab_line5"&gt;
    &lt;input id="tab_e1" value="10"&gt;
    &lt;input id="tab_e2" value="10"&gt;
    &lt;input id="tab_e3" value="10"&gt;
&lt;/div&gt;

&lt;div id="tab_line6"&gt;
    &lt;input id="tab_f1" value="10"&gt;
    &lt;input id="tab_f2" value="13"&gt;
    &lt;input id="tab_f3" value="10"&gt;
&lt;/div&gt;

&lt;div id="tab_line7"&gt;
    &lt;input id="tab_g1" value="10"&gt;
    &lt;input id="tab_g2" value="10"&gt;
    &lt;input id="tab_g3" value="10"&gt;
&lt;/div&gt;

&lt;div id="tab_line8"&gt;
    &lt;input id="tab_h1" value="10"&gt;
    &lt;input id="tab_h2" value="10"&gt;
    &lt;input id="tab_h3" value="10"&gt;
&lt;/div&gt;


function is_month_precip(){
    const 
        elemLines = Array.from(document.querySelectorAll('[id^="tab_line"]'));
        // elemLines est un Array contenant toutes les lignes exostantes 

    let 
        elemTabs = null;
        // elemTabs est un Array contenant tous les inputs existants dans une ligne

    for ( const [i, item] of elemLines.entries()){
        elemTabs = Array.from(item.querySelectorAll('[id^="tab_"]'));

        for (const [j, jtem] of elemTabs.entries()){
            if (Number(jtem.value) === 13){
                console.log(`true pour ligne ${ i + 1 } sur l'élément ${ jtem.id }`);
                return true;
            }
        }
    }

    return false;
}

is_month_precip();


Console (touche F12) : "true pour ligne 6 sur l'élément tab_f2"
Bonsoir,

Je n'ai pas lu le code en détail, mais rien que le nom des paramètres de la fonction me fait immédiatement penser à un tableau bidimensionel.
C'est sans doute ce que tu devrais utiliser.

Si tu passes plus de 5 paramètres à une fonction, ça devrait te paraitre louche.
Soit elle fait trop de choses (découpe), soit tu complexifies inutilement.
Modifié par QuentinC (11 Dec 2018 - 19:32)