Page 1 sur 1

Comment combiner des fonctions quasi identiques, à l'exception d'un paramètre?

Posté : 01 sept. 2016, 06:56
par Mooks
Bonjour à tous,

Je débute en PHP, et mon code me parait bien lourd. Prenons ces 2 fonctions (j'en ai 12 au total), et examinons les différences :

Code : Tout sélectionner

function get_my_content_grid_11() { if ( have_posts() ) : while ( have_posts() ) : the_post(); $my_current_type_in_use = get_post_type( $post ); echo'<section class="grid-11 ', $my_current_type_in_use, ' primary-section"> <article class="', $my_current_type_in_use, ' primary-section-article"> <header class="', $my_current_type_in_use, ' primary-section-article-header"> <h1 class="', $my_current_type_in_use, ' primary-section-article-header-title">', the_title(), '</h1></header> <div class="', $my_current_type_in_use, ' primary-section-article-content">', the_content(), '</div> </header> </article>'; endwhile; if ( comments_open() || '0' != get_comments_number() ) echo'<article class="', $my_current_type_in_use, ' primary-section-article-comments">' , comments_template( '', true ); echo'</article></section>'; endif; } function get_my_content_grid_12() { if ( have_posts() ) : while ( have_posts() ) : the_post(); $my_current_type_in_use = get_post_type( $post ); echo'<section class="grid-12 ', $my_current_type_in_use, ' primary-section"> <article class="', $my_current_type_in_use, ' primary-section-article"> <header class="', $my_current_type_in_use, ' primary-section-article-header"> <h1 class="', $my_current_type_in_use, ' primary-section-article-header-title">', the_title(), '</h1></header> <div class="', $my_current_type_in_use, ' primary-section-article-content">', the_content(), '</div> </header> </article>'; endwhile; if ( comments_open() || '0' != get_comments_number() ) echo'<article class="', $my_current_type_in_use, ' primary-section-article-comments">' , comments_template( '', true ); echo'</article></section>'; endif; }
J'utilise Wordpress, et je compte me faire un petit système maison pour éviter de réécrire encore et toujours les même loops et autres paramètres redondants. Ces deux fonctions sont similaires en tous points, si ce n'est dans la déclaration

Code : Tout sélectionner

echo'<section class="grid-12 '
, qui change en grid-11 (puis 10, 9, 8 ... 2, et finalement 1).

Ma question va vous parraitre bête, mais y a-t-il un moyen a base de n+1 qui me permettrait (1) de dynamiquement créer une série de fontions

Code : Tout sélectionner

"get_my_content_grid_n(+1)"
et (2) qui appliquerais ce même ajout à ma classe css dans l'echo

Code : Tout sélectionner

<section class="grid-n+1''
Merci d'avance pour vos lumières.

PS : Joli forum cela dit en passant... c'est propre, clean, et ergonomique :wink:

Re: Comment combiner des fonctions quasi identiques, à l'exception d'un paramètre?

Posté : 01 sept. 2016, 07:31
par Spols
Le plus simple dans ton cas, c'est de mettre cet index en paramètre et non pas directement dans la fonction
function get_my_content_grid($index) {

   if ( have_posts() ) : 
      while ( have_posts() ) : the_post();

         $my_current_type_in_use = get_post_type( $post );
         
         echo'<section class="grid-',$index,' ', $my_current_type_in_use, ' primary-section">
               <article class="', $my_current_type_in_use, ' primary-section-article">
                  <header class="', $my_current_type_in_use, ' primary-section-article-header">
                     <h1 class="', $my_current_type_in_use, ' primary-section-article-header-title">', the_title(), '</h1></header>
                     <div class="', $my_current_type_in_use, ' primary-section-article-content">', the_content(), '</div>
                  </header>
               </article>';
      endwhile;
   
   if ( comments_open() || '0' != get_comments_number() )
            echo'<article class="', $my_current_type_in_use, ' primary-section-article-comments">'
                  , comments_template( '', true );
            echo'</article></section>';
   
   endif;

}
Tu peux alors appeler ces fonctions avec get_my_content_grid(11); par exemple

Pour être complet tu devrait aussi ajouter une vérification sur ce paramètre pour éviter qu'on puisse y injecter n'importe quoi. Vérifier qu le paramè!tre est un entier inférieure à 12 et plus grand que 0 par exemple
ceci en début de fonction devrait suffire
if (!is_int(îndex) || $index > 12 || $index < 0) return;

Re: Comment combiner des fonctions quasi identiques, à l'exception d'un paramètre?

Posté : 01 sept. 2016, 15:28
par Mooks
Ah, cool! Merci beaucoup pour la réponse!

Je reviendrais sûrement à l'avenir avec des codes pas optimisés, en vue de les optimiser... et ainsi apprendre (petit à petit) les rudiments du PHP.

Bonne journée.

Re: Comment combiner des fonctions quasi identiques, à l'exception d'un paramètre?

Posté : 01 sept. 2016, 16:13
par Mooks
Je voulais faire un [EDIT], mais je veux que ce message soit lu par spols : avoue, l'erreur glissée à l'intérieur était volontaire, hein? :wink: Au moins, je n'aurais pas eu cette réponse servie sur un plateau d'argent, et m'a encouragé à lire la doc PHP.

Pour ceux qui passeraient par là, l'erreur provient du ! à if (!is_int(îndex) || $index > 12 || $index < 0) return; On souhaite faire qqc si l'index est compris entre 1 et 12 :

- if (!is_int(îndex) déclenchera l'action si index est false
- if (is_int(îndex) déclenchera l'action si index est true

Sujet résolu, merci encore spols.

PS : (is_int(îndex) sans le $ est-il volontaire? J'ai testé les deux et les deux fonctionnent.

Re: Comment combiner des fonctions quasi identiques, à l'exception d'un paramètre?

Posté : 01 sept. 2016, 16:20
par Spols
Si index vaut TRUE ou FALSE le is_int devrait retourner FALSE, car je vérifie que c'est bien un entier qui est envoyé comme argument.
sinon je by-pass la formule avec return.

Il y a une faute de frappe à îndex plutot que $index, mais les touches sont si proche ;-)

Re: Comment combiner des fonctions quasi identiques, à l'exception d'un paramètre?

Posté : 01 sept. 2016, 16:24
par Mooks
Bon, il y a un léger souci alors, parce que c'était ma première modification, à savoir rajouter un $ au premier index. Mais je pense plutôt qu'il ne faut pas en mettre du tout. Je vais faire les tests.

[EDIT] Ok, je comprend mieux maintenant ton histoire de touches "si proches". Il y a avait un accent circonflexe sur le i en plus de ne pas avoir de $. Je perds régulièrement un temps fou sur de petites fautes comme ça aussi... si t'as pas les yeux ouverts, tu peux perdre plusieurs minutes. Mais celle là était particulièrement vicieuse :lol: Ce qui me laisse penser que je dois aller voir un ophtalmo^^

Re: Comment combiner des fonctions quasi identiques, à l'exception d'un paramètre?

Posté : 01 sept. 2016, 17:31
par Mooks
Je ne savais pas si je devais ouvrir un nouveau topic pour ce que je m'apprête à demander, mais le sujet est sensiblement le même.

Je tente actuellement de répéter le processus que l'on a vu avant avec la fonction native de Wordpress "get_sidebar". J'ai créer ma propre fonction reprenant le code source, j'y ai ajouté les modifications nécessaires, et tout fonctionne excepté ma variable $index qui n'est pas pris en compte.

En fait, la fonction get_sidebar utilise un fichier template à son éxécution... ce qui fait que le scope de la variable (je crois utiliser le bon terme?) est cassé. Suis-je obligé, pour ce context précis, de passer ma variable en $GLOBALS? Ou y a-t-il une alternative?

Voici le code :

Code : Tout sélectionner

<?php // #2 - get_my_sidebar_grid($index,$name) // function get_my_sidebar_grid( $index, $name = null ) { do_action( 'get_my_sidebar_grid', $index, $name ); $templates = array(); $name = (string) $name; if (!is_int($index) || $index > 12 || $index < 0) return; if ( '' !== $name ) $templates[] = "my-sidebar-{$name}.php"; $templates[] = 'my-sidebar.php'; locate_template( $templates, true ); }

Code : Tout sélectionner

<?php $jigname = get_field('id_images'); echo '<aside class="grid-', $index,' widget-area"><div class="sidebar-image"><h2 class="sidebar-image-title">Images</h2>' .do_shortcode('[justified_image_grid preset=c1 rml_id="'.$jigname.'"]</div>'); ?>