3

PHP を使用してナビゲーション メニューをレイアウトし、URL に従ってコンテンツを表示しています。

表示するコンテンツを決定する IF-ELSE スタックに到達しました (必要なクラスやメソッドをロードすることによって)。しかし、これを書くためのより良い方法が必要です..何か提案はありますか?

BreadCrumbs::getCrumb()は、インデックス値に基づいて URL から保存された要素を取得するために使用される静的メソッドです (URI リクエストは「/」で分割され、配列に保存されます)。

... (ArrayHelp::recValueSearch(BreadCrumbs::getCrumb(2), Config::getNavPrimary())は、Config クラスのナビゲーション リストを含む配列に対して URI 要素をチェックします。

BreadCrumbs::setEmptyCrumb(1, "home")は、値が存在しないか有効でない場合にデフォルト値を設定するメソッドを実行します (nav リスト配列内)。

<?php
// set bread crumbs
BreadCrumbs::setCrumbs($_SERVER['REQUEST_URI']);
BreadCrumbs::setEmptyCrumb(1, "home");
BreadCrumbs::setEmptyCrumb(2, "all");



if (BreadCrumbs::getCrumb(1) == 'about') {
    echo 'This is the <b>About</b> Page';
}
else if (BreadCrumbs::getCrumb(1) == 'contact') {
    echo 'This is the <b>Contact</b> Page';
}
else if (BreadCrumbs::getCrumb(1) == 'search') {
    echo 'This is the <b>Search</b> Page';
}
else if (BreadCrumbs::getCrumb(1) == 'home') {
    if (BreadCrumbs::getCrumb(2) == 'all') {
        echo 'This is the <b>Home</b> Page';
    }
    else if (ArrayHelp::recValueSearch(BreadCrumbs::getCrumb(2), Config::getNavSecondary())) {
        echo 'This is the list page for category: <b>' . BreadCrumbs::getCrumb(1) . '</b> and the country filter is: <b>'. BreadCrumbs::getCrumb(2) . '</b>';
    }
    else {
        echo 'change filter value and go to the <b>home</b> page';
    }
}
else if (ArrayHelp::recValueSearch(BreadCrumbs::getCrumb(1), Config::getNavPrimary())) {
    if (BreadCrumbs::getCrumb(2) == 'all') {
        echo 'This is the list page for category: <b>' . BreadCrumbs::getCrumb(1) . '</b> and the country filter is <b>all countries</b>';
    }
    else if (ArrayHelp::recValueSearch(BreadCrumbs::getCrumb(2), Config::getNavSecondary())) {
        echo 'This is the list page for category: <b>' . BreadCrumbs::getCrumb(1) . '</b> and the country filter is: <b>'. BreadCrumbs::getCrumb(2) . '</b>';
    }
    else {
        echo 'change filter value to all and go to category: <b>' . BreadCrumbs::getCrumb(1) . '</b>';
    }
}
else {
    echo 'redirect page to home/all';
}

?>

編集: 以下のように Switch ステートメントに変更され、少し良くなりました..

    <?php
    $array_helper = new ArrayHelp;
    $valid_primary = $array_helper->recValueReturn(BreadCrumbs::getCrumb(1), Config::getNavPrimary());
    $valid_secondary = $array_helper->recValueReturn(BreadCrumbs::getCrumb(2), Config::getNavSecondary());
    switch (BreadCrumbs::getCrumb(1)) {
        case 'about' :
        case 'contact' :
        case 'search' :
            echo 'This is the <b>' . BreadCrumbs::getCrumb(1) . '</b> Page';
            break;
        case 'home' :
            switch (BreadCrumbs::getCrumb(2)) {
                case 'all' :
                    echo 'This is the <b>Home</b> Page';
                    break;
                case ($valid_secondary[1]) : 
                    echo 'This is the list page for category: <b>' . BreadCrumbs::getCrumb(1) . '</b> and the country filter is: <b>'. BreadCrumbs::getCrumb(2) . '</b>';
                    break;
                default:
                    echo 'change filter value and go to the <b>' . BreadCrumbs::getCrumb(1) . '</b> page';
                    break;
            }
            break;
        case ($valid_primary[1]) :
            switch (BreadCrumbs::getCrumb(2)) {
                case ($valid_secondary[1]) : 
                    echo 'This is the list page for category: <b>' . BreadCrumbs::getCrumb(1) . '</b> and the country filter is: <b>'. BreadCrumbs::getCrumb(2) . '</b>';
                    break;
                default:
                    echo 'change filter value and go to the <b>' . BreadCrumbs::getCrumb(1) . '</b> page';
                    break;
            }
            break;
        default:
            echo 'redirect page to home/all';
            break;
    }
?>
4

2 に答える 2

5

はい、switch ステートメントはややクリーンです

switch(BreadCrumbs::getCrumb(1)) {

   case 'about':
     echo 'This is the <b>About</b> Page';
     break;  

   case 'contact':
     echo 'This is the <b>Contact</b> Page';
     break;

   case 'search':
     echo 'This is the <b>Search</b> Page';
     break;


   // ....

   default: 
     // Default behavior
      break;
}

次のステップは、各ページの印刷出力を取得し、それを独自の関数に配置するか、html をテンプレート ファイルに外部化することです。

于 2012-12-22T20:23:46.897 に答える
2

サンプルコードが完全な要件を示している場合、 によって返される実際の文字列を使用するだけで、その一部を大幅に簡素化できますgetCrumb

  $crumb = ucfirst(BreadCrumbs::getCrumb(1));
  switch($crumb){

     case 'home': case 'foobar': # etc, etc
        echo "This is the <b>$crumb</b> Page";
        break; # or add some extra logic
     default:
        # handle invalid crumbs here
        break;
  }

(ucfirst文字列の最初の文字を大文字にするために使用されます。)

于 2012-12-22T20:29:21.490 に答える