0

我正在创建一个动态菜单,其项目取决于一组“模式”(通过 ajax 传递)。在此基础上,它会创建菜单,禁用和隐藏与该模式无关的图标。

问题是,在我的实现中有很多 if 条件。谁能告诉我一种更清洁的方式来做我想要实现的目标?

我的代码是:

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;
  }
4

2 回答 2

0

这还没有经过测试,但您可以尝试类似的方法。

基本上从您的代码中,我假设您仅尝试在奇数轮中插入图像。因此,我创建了一个$_modes$_mode变量,它将保存每一轮的值。

使用这些值,我们将使用您在代码中设置的规则自动创建 HTML 类,如果它是奇数,则在每一轮中,然后我们还会在数组中添加图像。

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;
}
于 2013-07-27T17:28:44.577 回答
0

使用switch功能:

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

   //...

}
于 2013-07-27T16:41:39.803 回答