2017-09-29 9 views
1

私は現在、オンライン試験システムを作成中です。私は、を追加しての機能を追加して、審査官がページの負荷に関する多くの質問に圧倒されないようにしたいと考えました。さまざまな情報源からコードを取得し、私が知っているものに基づいてそれらを組み合わせようとしました。Codeigniterコンテンツをもっと読み込むボタン

すべてがうまくいきますBUT問題は私のコントローラーに私が正しくないと思うhtmlタグを使用していたことですか? MVCのコンセプトに基づいています。ここに私のコードです。:(私は、直接私の見解ページ内のHTMLコードを入れてみましたが、私は問題をループします。

MODEL

public function getQuestion1($page, $id){ 
    $offset = 10*$page; 
    $limit = 10; 
    $sql = "select * from question_bank where examtype_id = $id limit $offset ,$limit"; 
    $result = $this->db->query($sql)->result(); 
    return $result; 
} 

CONTROLLER

public function verbal(){ 
    $this->load->view('examination/includes/header'); 
    $this->load->view('examination/verbal_meaning'); 
    $this->load->view('examination/includes/footer'); 
} 


public function getQuestion(){ 
    $page = $this->input->get('page'); 
    $questions = $this->examination_model->getQuestion1($page,1); 
    foreach($questions as $r) { 
     echo "<div class='col-lg-6'> 
     <br/> 
     <label>" 
     .$r->question_id.") ".$r->question. 
     "</label> 
     <div class='radio'> 
     <ol type='1'> 
     <div class='col-lg-6'> 
     <li> 
     <label> 
     <input type='radio' name='verbal_q5' id='' value='1'>" 
     .$r->option1. 
     "</label> 
     </li> 
     <li> 
     <label> 
     <input type='radio' name='verbal_q5' id='' value='2'>" 
     .$r->option2. 
     "</label> 
     </li> 
     <li> 
     <label> 
     <input type='radio' name='verbal_q5' id='' value='2'>" 
     .$r->option2. 
     "</label> 
     </li> 
     </div> 
     <div class='col-lg-6'> 
     <li> 
     <label> 
     <input type='radio' name='verbal_q5' id='' value='3'>" 
     .$r->option4. 
     "</label> 
     </li> 
     <li> 
     <label> 
     <input type='radio' name='verbal_q5' id='' value='4'>" 
     .$r->option5. 
     "</label> 
     </li> 
     </div> 
     </ol> 
     </div> 
     </div>"; 
    } 
    exit; 
} 

VIEW

<div class="col-lg-12"> 
    <div class="container-fluid"> 
    <div class="row"> 
     <div id="ajax_table"> 

     </div> 
    </div> 
    </div> 
</div> 

JS

<script> 
    $(document).ready(function(){ 
    getquestion(0); 
    $("#load_more").click(function(e){ 
     e.preventDefault(); 
     var page = $(this).data('val'); 
     getquestion(page); 
    }); 
    }); 
    var getquestion = function(page){ 

    $.ajax({ 
     url:"<?php echo base_url() ?>examination/getQuestion", 
     type:'GET', 
     data: {page:page} 
    }).done(function(response){ 
     $("#ajax_table").append(response); 
     $('#load_more').data('val', ($('#load_more').data('val')+1)); 
     scroll(); 
    }); 
    }; 
    var scroll = function(){ 
    $('html, body').animate({ 
     scrollTop: $('#load_more').offset().top 
    }, 1000); 
    }; 
</script> 

答えて

0

あなたがすべきは何かします

は、すべてのタグがループを使用して直接ではなく、AJAXにコンテンツをエコーでveriable 1つのPHPを作成します。変数をajaxへの応答として送信し、htmlコンテンツを追加して要素ajax_table内に表示します。

これは最適かつ適切な方法です。

+0

Codeigniterフレームワークの新機能です。あなたが話していることについての事例はありますか?しかし、私はあなたの提案を試みます。ありがとう! – miggyyy

0

ほとんどのCodeigniter開発者は、htmlがビューファイルに属していることに同意します。

あなたのコメントに基づいて、 "しかし、私はループの問題が発生します"私はあなたが正しくビューファイルに値を渡していないと思う。このようにしなければなりません。

public function getQuestion() 
{ 
    $page = $this->input->get('page'); 
    $data['questions'] = $this->examination_model->getQuestion1($page,1); 
    $this->load->view('examination/question_view', $data); 
} 

モデルのリターンが「質問」の項目キーで配列$dataに割り当てられていることに注意してください。

項目キーは、ビュー内で変数になります。つまり、$data['questions']はビュー内の変数$questionsになります。 $dataが、load->viewという2番目の引数のビューに渡されることに注意してください。

$this->load->view('examination/question_view', $data); 

ファイル「審査/ question_view.php」PHPとHTMLの両方を含み、上記のコントローラで表示し、同じテクニックを使用します。

追加の質問を読み込むと、HTMLによって問題が発生します。主な問題は、表示する内容に基づいて、すべての<input type=radioフィールドの名前が同じであることです。ラジオボタンは、関連する各ボタンに同じ名前属性を付けることによって、「グループ化」されます。あなたはそれを持っているので、ページに多くの質問を追加すると、すべてのボタンは同じ名前を持つので、すべてのボタンは同じグループになります。おっとっと。

以下、この問題を解決し、各質問の回答を固有のボタングループに保持するHTMLを提供します。私はまた、入力とラベルを構造化するもっと伝統的な方法を使用しました。

さらに、コードを読みやすくするために、レイアウトや書式に関するHTMLの一部を削除しました。ロジックが機能したら、必要に応じてHTML要素とCSSクラスを追加して、あなたが気になるレイアウトを作成できます。ここで

は、それは完璧ではないかもしれませんので、私は実際にこのマークアップをテストしていない「審査/ question_view.php

<?php 
foreach($questions as $question) : 
    $q_num = $question->question_id; 
    $q_id = "q".$q_num; 
    $name = "verbal_".$q_num; 
    ?> 
    <fieldset> 
     <legend><?= "Question $q_num"; ?></legend> 
     <div> 
      <?= $question->question; ?> 
     </div> 
     <ol type='1'> 
      <li> 
       <?php $id = "{$q_id}_a1"; ?> 
       <input type='radio' name='<?= $name; ?>' id='<?= $id; ?>' value='1'> 
       <label for='<?= $id; ?>'><?= $question->option1; ?></label> 
      </li> 
      <li> 
       <?php $id = "{$q_id}_a2"; ?> 
       <input type='radio' name='<?= $name; ?>' id='<?= $id; ?>' value='2'> 
       <label for='<?= $id; ?>'><?= $question->option2; ?></label> 
      </li> 
      <li> 
       <?php $id = "{$q_id}_a3"; ?> 
       <input type='radio' name='<?= $name; ?>' id='<?= $id; ?>' value='3'> 
       <label for='<?= $id; ?>'><?= $question->option2; ?></label> 
      </li> 
      <li> 
       <?php $id = "{$q_id}_a4"; ?> 
       <input type='radio' name='<?= $name; ?>' id='<?= $id; ?>' value='4'> 
       <label for='<?= $id; ?>'><?= $question->option4; ?></label> 
      </li> 
      <li> 
       <?php $id = "{$q_id}_a5"; ?> 
       <input type='radio' name='<?= $name; ?>' id='<?= $id; ?>' value='5'> 
       <label for='<?= $id; ?>'><?= $question->option5; ?></label> 
      </li> 
     </ol> 
    </fieldset> 
    <?php 
endforeach; 

の私のバージョンです。タイプミスやロジックの問題をお許しください。

私が使用しているPHPの代替構文に慣れていない場合 - たとえば、 <?= $name; ?> - これは同じタイプ入力<?php echo $name; ?>です。

<?php ...code here... ?>の中にいくつかの領域を設定して、PHPに文字列をエコーするのではなく、HTMLを入力することで、PHPプロセッサーをどのようにドロップアウトしているかに気づくでしょう。これにはパフォーマンス上のペナルティはありません。また、入力して読むのがはるかに簡単です。 (IMO)

また、二重引用符内の変数を評価する傾向があります。例えば

<?= "Question $q_num"; ?> 

のようにドットを使用して連結する代わりに、

<?= "Question ".$q_num; ?> 

結果は同じで、私の場合、最初に入力して読みやすくなっています。

これらの二重引用符文字列の一部に中括弧を使用することにも注意してください。例えば

<?php $id = "{$q_id}_a1"; ?> 

「curlies」は、PHPプロセッサがどの部分が変数で、どの部分が文字列リテラルであるかを把握するのに役立ちます。前の例も

<?php $id = $q_id."_a1"; ?> 

を書くことができところで、私はあなたがコントローラでexit;を使用気づきます。開発段階でのデバッグを除いて、Codeigniterでexitまたはdieを使用しないことをお勧めします。 Codeigniterに定義されたシャットダウン処理を実行させる方がよいでしょう。

+0

ありがとうございました。私はあなたの反応から多くを学んだ。私は間違いなくそれを試してみます。 – miggyyy

+0

私はあなたに私が何をすべきかを試してみました。問題は、10秒で質問を分割する多くの機能を実装する必要があることです。あなたの反応に基づいてうまくいかない。とにかくありがとう! – miggyyy

関連する問題