2012-03-06 17 views
2

私が作成しているフォーラムの私のquestions.phpページでは、GET ['sort']変数をチェックして何を並べ替えるべきかを知っています。私はドロップダウンを提供しています。しかし、ドロップダウンリストのデフォルト値によって、ページが存在するソートをどのようにするのですか?これはこれまで私が持っていたものですが、それはひどく長くて面倒です。私はそれを行うより専門的な方法があると確信しています。あなたが私を啓発できるなら、してください!ソートGET変数のこのコードを改善するにはどうすればよいですか?

if(isset($_GET['sort']) && $_GET['sort']=='answers'){ 
     $questions = Question::find_most_answered(); 
     $page_title = 'Showing most answered questions! - '.SITE_NAME; 
     $sortResults = "<select class=\"sortResults\" name=\"sortResult\" id=\"sortResult\"> 
          <option value=\"questions.php?sort=answers\">Sorted By Most Answers</option> 
          <option value=\"questions.php?sort=votes\">Sorted By Most Voted</option> 
          <option value=\"questions.php?sort=recent\">Sorted By Most Recent</option> 
          <option value=\"questions.php?sort=oldest\">Sorted By Oldest</option> 
          <option value=\"questions.php?sort=views\">Sorted By Most Viewed</option> 
         </select>"; 
    }else if(isset($_GET['sort']) && $_GET['sort']=='oldest'){ 
     $questions = Question::find_oldest_questions(); 
     $page_title = 'Showing oldest questions! - '.SITE_NAME; 
     $sortResults = "<select class=\"sortResults\" name=\"sortResult\" id=\"sortResult\"> 
          <option value=\"questions.php?sort=oldest\">Sorted By Oldest</option> 
          <option value=\"questions.php?sort=answers\">Sorted By Most Answers</option> 
          <option value=\"questions.php?sort=votes\">Sorted By Most Voted</option> 
          <option value=\"questions.php?sort=recent\">Sorted By Most Recent</option> 
          <option value=\"questions.php?sort=views\">Sorted By Most Viewed</option> 
         </select>"; 
    }else if(isset($_GET['sort']) && $_GET['sort']=='recent'){ 
     $questions = Question::find_recent_questions(); 
     $page_title = 'Showing most recent questions! - '.SITE_NAME; 
     $sortResults = "<select class=\"sortResults\" name=\"sortResult\" id=\"sortResult\"> 
          <option value=\"questions.php?sort=recent\">Sorted By Most Recent</option> 
          <option value=\"questions.php?sort=answers\">Sorted By Most Answers</option> 
          <option value=\"questions.php?sort=votes\">Sorted By Most Voted</option> 
          <option value=\"questions.php?sort=oldest\">Sorted By Oldest</option> 
          <option value=\"questions.php?sort=views\">Sorted By Most Viewed</option> 
         </select>"; 
    }else if(isset($_GET['sort']) && $_GET['sort']=='views'){ 
     $questions = Question::find_most_viewed(); 
     $page_title = 'Showing most viewed questions! - '.SITE_NAME; 
     $sortResults = "<select class=\"sortResults\" name=\"sortResult\" id=\"sortResult\"> 
          <option value=\"questions.php?sort=views\">Sorted By Most Viewed</option> 
          <option value=\"questions.php?sort=votes\">Sorted By Most Voted</option> 
          <option value=\"questions.php?sort=answers\">Sorted By Most Answers</option> 
          <option value=\"questions.php?sort=recent\">Sorted By Most Recent</option> 
          <option value=\"questions.php?sort=oldest\">Sorted By Oldest</option> 
         </select>"; 
     }else{ 
      $questions = Question::find_most_voted(); 
      $page_title = 'Showing most voted questions! - '.SITE_NAME; 
      $sortResults = "<select class=\"sortResults\" name=\"sortResult\" id=\"sortResult\"> 
          <option value=\"questions.php?sort=votes\">Sorted By Most Voted</option> 
          <option value=\"questions.php?sort=answers\">Sorted By Most Answers</option> 
          <option value=\"questions.php?sort=recent\">Sorted By Most Recent</option> 
          <option value=\"questions.php?sort=oldest\">Sorted By Oldest</option> 
          <option value=\"questions.php?sort=views\">Sorted By Most Viewed</option> 
         </select>"; 
     } 

可能であればお手伝いしてください。これを編集してより美しく見せてください。私はそれほど専門家ではない。

ありがとうございます!

+0

ループを持つ配列 –

+0

スイッチケースモデル[http://php.net/manual/en/control-structures.switch]を使用します。php] – AlexC

+0

あなたは、私にしてくれたすべての良きもののために、「玉の上」を書いているかもしれません。とにかくありがとう! – yehuda

答えて

1
// establish a list of possible drop-down list options 
// left-hand is the value, right hand is the "english" equivalent 
$options = array(
    'views' => 'Most Viewed', 
    'votes' => 'Most Voted', 
    'answers' => 'Most Ansers', 
    'recent' => 'Most Recent', 
    'oldest' => 'Oldest' 
); 

// determine the sort value 
$sort = (isset($_GET['sort']) && array_key_exists($_GET['sort'],$options) 
     ? $_GET['sort']  // Input was valid, accept it 
     : 'views');   // setup default sort here 

// populate the questions list based on the sort 
switch ($sort) 
{ 
    case 'views': $questions = Question::find_most_viewed(); break; 
    case 'votes': $questions = Question::find_most_voted(); break; 
    case 'answers': $questions = Question::find_most_answered(); break; 
    case 'recent': $questions = Question::find_recent_questions(); break; 
    case 'oldest': default: $questions = Question::find_oldest_questions(); break; 
} 

// Setup the title based on the $options value 
$page_title = 'Showing '.$options[$sort].' questions! - '.SITE_NAME; 

// populate the sortResults based on the value of $sort, and iterate over 
// it to reduce redundancy 
$sortResults = "<select class=\"sortResults\" name=\"sortResult\" id=\"sortResult\">"; 
foreach ($options as $k => $v){ 
    // it matches the current sort, mark it as selected 
    // (I assume this is what you were going for by moving it to the 
    // top of the list?) 
    $selected = ''; 
    if ($sort == $k) $selected = ' selected="selected"'; 

    // it's not the current filter, so append it to $sortResults 
    $sortResults .= "<option value=\"questions.php?sort={$k}\"{$selected}>Sorted By {$v}</option>"; 
} 
$sortResults .= "</select>"; 

おそらく私はそれに取り組んでいますか? (それが無効であるか免税エントリの場合、デフォルト)あなたがその配列のキーに基づいて、その$sort値に基づいて

  • 出力オプションを
  • 検証$_GETを参照することができ、アレイ内の

    1. 置きオプション。
  • +0

    おっと、静的な 'Questions ::'呼び出しの変更に気付きました。今修正しています... –

    +0

    しばらくの間、遊んでいきます。 – yehuda

    +0

    'selected'タグ' selected'のhtml属性は、デフォルトでselectオプションを選択します。これにより、順序を維持でき、一貫したユーザーエクスペリエンスを維持できます。注文を再編成すると、ドロップダウンが不一致になります。 – Brendan

    0

    $ _GETに基づいて、各オプションを一番上の配列の文字列として追加します。表示する配列の部分を選択します。このようにして、アレイの上部を1回変更することができ、それを表示しているすべてのパーツを修正して更新します。 if文を消去するには、スイッチのケースについて学ぶ必要があります。

    1

    これは、そのようにすることができますが、テストされていませんが動作するはずです。

    $questions = Question::find($criteria); 
    
    switch($_GET['sort']) 
    { 
        case 'answers': 
         $text = 'most answered'; 
         break; 
        case 'oldest': 
         $text = 'oldest'; 
         break; 
        case 'recent': 
         $text = 'most recent'; 
         break; 
        case 'views': 
         $text = 'most viewed'; 
         break; 
        default: 
         $text = 'most voted'; 
         break; 
    } 
    
    $page_title = "Showing $text questions! - ".SITE_NAME; 
    
    $sortResults = "<select class=\"sortResults\" name=\"sortResult\" id=\"sortResult\"><option value=\"questions.php?sort=views\">Sorted By Most Viewed</option><option value=\"questions.php?sort=votes\">Sorted By Most Voted</option><option value=\"questions.php?sort=answers\">Sorted By Most Answers</option><option value=\"questions.php?sort=recent\">Sorted By Most Recent</option><option value=\"questions.php?sort=oldest\">Sorted By Oldest</option></select>"; 
    

    そして、あなたのクラスで:

    <?php 
        $options[] = "<option value=\"questions.php?sort=answers\">Sorted By Most Answers</option>"; 
        $options[] = "<option value=\"questions.php?sort=votes\">Sorted By Most Voted</option>"; 
        $options[] = "<option value=\"questions.php?sort=recent\">Sorted By Most Recent</option>"; 
        $options[] = "<option value=\"questions.php?sort=oldest\">Sorted By Oldest</option>"; 
        $options[] = "<option value=\"questions.php?sort=views\">Sorted By Most Viewed</option>"; 
        $option_ontop = 0; 
        if(!empty($_GET['sort'])) { 
         switch($_GET['sort']) { 
          case 'answers': 
           $option_ontop = 0; 
           $questions = Question::find_most_answered(); 
           $page_title = 'Showing most answered questions! - '.SITE_NAME; 
           break; 
          case 'votes': 
           $option_ontop = 1; 
           $questions = Question::find_most_voted(); 
           $page_title = 'Showing most voted questions! - '.SITE_NAME; 
           break; 
          case 'recent': 
           $option_ontop = 2; 
           $questions = Question::find_recent_questions(); 
           $page_title = 'Showing most recent questions! - '.SITE_NAME; 
           break; 
          case 'oldest': 
           $option_ontop = 3; 
           $questions = Question::find_oldest_questions(); 
           $page_title = 'Showing oldest questions! - '.SITE_NAME; 
           break; 
          case 'views': 
           $option_ontop = 4; 
           $questions = Question::find_most_viewed(); 
           $page_title = 'Showing most viewed questions! - '.SITE_NAME; 
           break; 
         } 
    
        } 
    
        if($option_ontop > 0) { 
         $new_option_sort = array($options[$option_ontop]); 
         unset($options[$option_ontop]); 
         $new_option_sort = array_merge($new_option_sort, $options); 
        } 
        $sortResults = "<select class=\"sortResults\" name=\"sortResult\" id=\"sortResult\">" 
        foreach($new_option_sort AS $option) { 
         $sortResults .= $option; 
        } 
        $sortResults .= "</select>"; 
    ?> 
    
    +0

    ちょうどコードで遊んで、感謝、すぐにあなたに会いましょう。 – yehuda

    1

    私の代わりに、全く新しい機能を定義する、あなたが変数として必要なソート基準で普遍的な機能や飼料を使用したい

    public function find($criteria) 
    { 
        switch($_GET['sort']) 
        { 
         case 'answers': 
          $order = 'answers DESC'; 
          break; 
         case 'oldest': 
          $order = 'post_date ASC'; 
          break; 
         case 'recent': 
          $order = 'post_date DESC'; 
          break; 
         case 'views': 
          $order = 'views DESC'; 
          break; 
         default: 
          $order = 'votes DESC'; 
          break; 
        } 
    
        // Use your $order variable for MySQL call 
    } 
    
    +0

    私は、このベストプラクティスは疑問ですか?良いアイデアだと思う。 – yehuda

    +0

    ありがとう、今後これを実現してくれるはずです。感謝! – yehuda

    1

    私はこれを行うための最もクリーンな方法を思いつきました。どう考えているか教えてください。

    <?php 
    
    // set $sort to $_GET var or nothing if it's not set 
    $sort = isset($_GET['sort']) ? $_GET['sort'] : ''; 
    
    // Options Array 
    $options = array(
        'answers' => array('Most Answers',0), 
        'oldest' => array('Oldest',0), 
        'recent' => array('Most Recent',0), 
        'views'  => array('Most Viewed',0), 
        'votes'  => array('Most Voted',0) 
    ); 
    
    switch($sort) { 
    
        case 'answers': 
         $questions = Question::find_most_answered(); 
         $options[$sort][1] = 1; 
         break; 
        case 'oldest': 
         $questions = Question::find_oldest_questions(); 
         $options[$sort][1] = 1; 
         break; 
        case 'recent': 
         $questions = Question::find_recent_questions(); 
         $options[$sort][1] = 1; 
         break; 
        case 'views': 
         $questions = Question::find_most_viewed(); 
         $options[$sort][1] = 1; 
         break; 
        case 'votes': 
         $questions = Question::find_most_voted(); 
         $options[$sort][1] = 1; 
         break; 
        default: 
         $questions = Question::find_recent_questions(); 
         break; 
    
    } 
    ?> 
    
    <select class="sortResults" name="sortResult" id="sortResult"> 
    <?php foreach($options as $key => $val) { ?> 
        <option value="questions.php?sort=<?php echo $key; ?>" <?php if($val[1] == 1) { echo "selected=\"selected\""; } ?>>Sorted By <?php echo $val[0]; ?></option> 
    <?php } ?> 
    </select> 
    <!-- more code... --> 
    
    +0

    本当に素敵なコードです。今すぐチェックしてください。乾杯 – yehuda

    0

    皆さん、ありがとうございました。私は皆から双方向データを取得しました。これが最終コードです。 代わりにすべての私の別の種類のタイプのための5つの機能を有するので以下のように、私はジェイミーのアイデアanswerを実装している...

    switch($sort){ 
         case 'newest': 
          $order = "ORDER BY created DESC, votes DESC, total_answers DESC ,views DESC "; 
          break; 
         case 'oldest': 
          $order = "ORDER BY created ASC, votes DESC, total_answers DESC ,views DESC "; 
          break; 
         case 'answers': 
          $order = "ORDER BY total_answers DESC, votes DESC, views DESC "; 
          break; 
         case 'votes': 
          $order = "ORDER BY votes DESC, total_answers DESC, views DESC "; 
          break; 
         case 'views': 
          $order = "ORDER BY views DESC, votes DESC, total_answers DESC "; 
          break; 
         default: 
          $order = "ORDER BY votes DESC, total_answers DESC, views DESC "; // Perhaps display 404 
          break; 
        } 
    

    私はその後、

    ...ブラッドの ideaを取り、次のように配列を作成しましたそして、最後に、私は皆に再び...

    $sort = isset($_GET['sort']) && !empty($_GET['sort']) ? $_GET['sort'] : 'votes'; 
    
        $questions = Question::find_by($sort); 
        $page_title = "Showing {$sorts[$sort]} questions! - ".SITE_NAME; 
        $sortResults = "<select class=\"sortResults\" name=\"sortResult\" id=\"sortResult\">"; 
         foreach($sorts as $value=>$display){  
          if($value == $sort){ 
           $sortResults .= "<option value=\"questions.php?sort={$value}\" selected=\"selected\" \">Sorted by {$value}</option>"; 
          }else{ 
           $sortResults .= "<option value=\"questions.php?sort={$value}\">Sort by {$value}</option>"; 
          } 
         } 
        $sortResults .= "</select>"; 
    

    おかげで、次のコードを実装している

    $sorts = array(
        'votes'=>'most voted', 
        'answers'=>'most answered', 
        'views'=>'most viewed', 
        'newest'=>'newest', 
        'oldest'=>'oldest' 
        ); 
    

    誰が私を助けた!

    関連する問題