2013-07-27 3 views
0

Je crée un menu dynamique dont les éléments apparaissent en fonction d'un «mode» défini (qui est passé par ajax). Cela crée le menu, désactivant et masquant les icônes qui ne sont pas associées à ce mode.Manière plus efficace de créer un menu dynamique

Le problème est que dans mon implémentation il y a beaucoup de conditions if. Quelqu'un peut-il me montrer une façon plus propre de faire ce que j'essaie d'accomplir?

Mon code est:

public function gridMenu() 
    { 
    $mode = Validate::sanitize($_POST['mode']); 

    $modes = array(
     'products' => array('edit', 'delete', 'archive') 
    ); 

    $output = '<div id="hexContainer">'; 
    for($i = 1; $i < 7; $i++) { 
     $img = ''; 
     $output .= '<div class="hex hex' . $i; 
     if($i == 1) 
     { 
     if(in_array('edit', $modes[$mode])) 
     { 
      $output .= ' hex-selectable'; 
      $img = '<img data-option="Edit" src="' . ROOT . 'images/edit.png">'; 
     } else { 
      $output .= ' hex-disabled'; 
     } 
     } 
     if($i == 2) 
     { 
     if(in_array('zzz', $modes[$mode])) 
     { 
      $output .= ' hex-selectable'; 
     } else { 
      $output .= ' hex-disabled'; 
     } 
     } 
     if($i == 3) 
     { 
     if(in_array('delete', $modes[$mode])) 
     { 
      $output .= ' hex-selectable'; 
      $img = '<img data-option="Delete" src="' . ROOT . 'images/delete.png">'; 
     } else { 
      $output .= ' hex-disabled'; 
     } 
     } 
     if($i == 4) 
     { 
     if(in_array('xxx', $modes[$mode])) 
     { 
      $output .= ' hex-selectable'; 
     } else { 
      $output .= ' hex-disabled'; 
     } 
     } 
     if($i == 5) 
     { 
     if(in_array('archive', $modes[$mode])) 
     { 
      $output .= ' hex-selectable'; 
      $img = '<img data-option="Archive" src="' . ROOT . 'images/archive.png">'; 
     } else { 
      $output .= ' hex-disabled'; 
     } 
     } 
     if($i == 6) 
     { 
     if(in_array('zzz', $modes[$mode])) 
     { 
      $output .= ' hex-selectable'; 
     } else { 
      $output .= ' hex-disabled'; 
     } 
     } 

     $output .= '">'; 
     $output .= $img; 
     $output .= '</div>'; 
    } 
    $output .= '<div class="hex hex-mid"></div>'; 
    $output .= '</div>'; 
    echo $output; 
    } 
+0

Ne pensez-vous pas que [CodeReview] (http://codereview.stackexchange.com) serait un meilleur endroit à demander? –

Répondre

0

Utilisez la fonction switch:

switch ($i){ 
    case 1: 
     //code for $i==1 
     break; 
    case 2: 
     // code for $i==2 
     break; 

    //... 

} 
0

Cela n'a pas été testé, mais vous pouvez essayer quelque chose le long des lignes de cela. Fondamentalement à partir de votre code, je suppose que vous essayez d'insérer une image uniquement sur les tours impairs. Donc, avec cela, j'ai créé un $_modes et $_mode variables qui contiendront les valeurs pour chaque tour. Avec ces valeurs, nous allons créer automatiquement les classes HTML en utilisant les règles que vous avez définies dans votre code, et sur chaque tour si c'est impair, et dans le tableau, nous ajoutons également l'image.

public function gridMenu() { 
    $mode = Validate::sanitize($_POST['mode']); 

    $modes = array(
     'products' => array('edit', 'delete', 'archive') 
    ); 

    $_modes = array(
     false, 
     array('Edit', 'edit'), 
     array('ZZZ', 'zzz'), 
     array('Delete', 'delete'), 
     array('XXX', 'xxx'), 
     array('Archive', 'archive'), 
     array('ZZZ', 'zzz'), 
    ); 

    $output = '<div id="hexContainer">'; 

    for($i = 1; $i < 7; $i++) { 
     $_mode = $_modes[$i]; 

     $img = ''; 
     $classnames = array('hex', 'hex' . $i); 

     if (($i % 2) === 0 && in_array($_mode[1], $modes[$mode])) { 
      $img = '<img data-option="' . $_mode[0] . '" src="' . ROOT . 'images/' . $_mode[1] . '.png">'; 
     } 

     $classnames[] = (in_array($_mode[1], $modes[$mode]) ? 'hex-selectable' : 'hex-disabled'); 

     $output .= '<div class="' . implode(' ', $classnames) . '">'; 
     $output .= $img; 
     $output .= '</div>'; 
    } 

    $output .= '<div class="hex hex-mid"></div>'; 
    $output .= '</div>'; 

    echo $output; 
} 
Questions connexes