1

データベース フィールドからフォームを作成しているので、すべてのレコードを取得してループし、フォーム要素を php の foreach ループに追加します。問題は、要素が投稿されていないフォームを送信すると、送信ボタンだけが返されることです:-

stdClass Object
(
    [submitbutton] => Submit
)

これは私が要素を作成する方法です。これらはすべて画面上で正しく表示され、機能します。送信時に投稿されませんが、foreachループに要素がない場合は要素が投稿されますが、から動的に作成する必要がありますデータベース、何かアイデアはありますか?

foreach($records as $log){
        $inc++;

        if($log->type == 0){ 

            $mform->addElement('html', '<p>'.$log->leadin.'</p>');

            $attributes = array();
            $distractors = explode(',', $log->distractors);
            $radioarray=array();
            $count = 0;

            foreach($distractors as $dis){
                $count++;
                $radioarray[] =& $mform->createElement('radio', 'radio', '', $dis, $count, array());
            }

            $mform->addGroup($radioarray, 'radioar'.$inc, '', array(' '), false);
        }
        else if($log->type == 1){

            $mform->addElement('html', '<div>'.$log->leadin.'</div>');

            $distractors = explode(',', $log->distractors);
            $count = 0;

            foreach($distractors as $dis){
                $count++;
                $mform->addElement('checkbox', 'check'.$count, $dis);
            }
        }}

完全なフォーム コード: -

class build_user_survey extends moodleform{
public function definition() {
    global $CFG;
    global $DB;
    global $OUTPUT;

    $mform =& $this->_form;
    $errors= array();
    $br = "<br />";
    $select = '';
    $records = $this->_customdata['thequestions'];
    $inc = 0;
    $attributes=array('rows'=>'10','cols'=>'80');
    $mform->addElement('hidden', 'id');
    $mform->setType('id', PARAM_INT);
    $mform->addElement('hidden', 'viewpage');
    $mform->setType('viewpage', PARAM_INT);
    $mform->addElement('hidden', 'pickedsurvey');
    $mform->setType('pickedsurvey', PARAM_INT);
    $mform->addElement('hidden', 'questiontype');
    $mform->setType('questiontype', PARAM_INT);


     foreach($records as $log){
        $inc++;

        if($log->type == 0){ 

            $mform->addElement('html', '<div>'.$log->leadin.'</div>');

            $distractors = explode(',', $log->distractors);
            $count = 0;

            foreach($distractors as $dis){
                $count++;
                $mform->addElement('radio', 'radio'.$inc, '', $dis, $count, array());
            }
        }
        else if($log->type == 1){

            $mform->addElement('html', '<div>'.$log->leadin.'</div>');

            $distractors = explode(',', $log->distractors);
            $count = 0;

            foreach($distractors as $dis){
                $count++;
                $mform->addElement('checkbox', 'check'.$count, $dis);
            }
        }
        else if($log->type == 2){
            echo "<script type='text/javascript'>alert('here');</script>";
            $thename = 'answer';
            $mform->addElement('textarea', $thename, $log->leadin, $attributes);
        }  
    } 
   foreach($records as $log){
        $mform->addElement('radio', 'radio', '', 'ioh;', 0, array());
   }

    $mform->addElement('textarea', 'answerWorking', '$log->leadin', $attributes);
    $this->add_action_buttons($cancel = true, $submitlabel='Submit');
}
public function validation($data, $files) {
    global $DB;
    $errors= array();
    if($data['id']) {
        return true;
    }
}

}

4

2 に答える 2

0

チェックボックスは、選択されている場合にのみ値を返します。

選択されていない値も必要な場合は、高度なチェック ボックスを使用します。

$mform->addElement('advcheckbox', 'check'.$count, $dis);

http://docs.moodle.org/dev/lib/formslib.php_Form_Definition#advcheckbox

編集: コードをコピーして、チェックボックスを advcheckbox に変更しただけで動作します :) for ループの前に $count = 0 を配置する必要もあります。

呼び出しコード

$thequestions = array();

$thequestion = new stdClass();
$thequestion->type = 1;
$thequestion->leadin = 'leadin 1';
$thequestion->distractors = 'dis1, dis2, dis3';
$thequestions[] = $thequestion;

$thequestion = new stdClass();
$thequestion->type = 1;
$thequestion->leadin = 'leadin 2';
$thequestion->distractors = 'dis4, dis5, dis6';
$thequestions[] = $thequestion;

$mform = new build_user_survey(null, array('thequestions'=>$thequestions ));

if ($data = $mform->get_data()) {
    var_dump($data);
}
$mform->display();

Var ダンプ

object(stdClass)[3270]
  public 'id' => int 0
  public 'viewpage' => int 0
  public 'pickedsurvey' => int 0
  public 'questiontype' => int 0
  public 'check1' => string '0' (length=1)
  public 'check2' => string '0' (length=1)
  public 'check3' => string '0' (length=1)
  public 'check4' => string '0' (length=1)
  public 'check5' => string '0' (length=1)
  public 'check6' => string '0' (length=1)
  public 'radio' => string '0' (length=1)
  public 'answerWorking' => string '' (length=0)
  public 'submitbutton' => string 'Submit' (length=6)

変更されたフォーム コード

class build_user_survey extends moodleform {
    public function definition() {


        $mform =& $this->_form;

        $records = $this->_customdata['thequestions'];
        $inc = 0;
        $attributes=array('rows'=>'10','cols'=>'80');
        $mform->addElement('hidden', 'id');
        $mform->setType('id', PARAM_INT);
        $mform->addElement('hidden', 'viewpage');
        $mform->setType('viewpage', PARAM_INT);
        $mform->addElement('hidden', 'pickedsurvey');
        $mform->setType('pickedsurvey', PARAM_INT);
        $mform->addElement('hidden', 'questiontype');
        $mform->setType('questiontype', PARAM_INT);

        $count = 0;
         foreach($records as $log){
            $inc++;

            if($log->type == 0){

                $mform->addElement('html', '<div>'.$log->leadin.'</div>');

                $distractors = explode(',', $log->distractors);

                foreach($distractors as $dis){
                    $count++;
                    $mform->addElement('radio', 'radio'.$inc, '', $dis, $count, array());
                }
            }
            else if($log->type == 1){

                $mform->addElement('html', '<div>'.$log->leadin.'</div>');

                $distractors = explode(',', $log->distractors);

                foreach($distractors as $dis){
                    $count++;
                    $mform->addElement('advcheckbox', 'check'.$count, $dis);
                }
            }
            else if($log->type == 2){
                echo "<script type='text/javascript'>alert('here');</script>";
                $thename = 'answer';
                $mform->addElement('textarea', $thename, $log->leadin, $attributes);
            }
        }
       foreach($records as $log){
            $mform->addElement('radio', 'radio', '', 'ioh;', 0, array());
       }

        $mform->addElement('textarea', 'answerWorking', '$log->leadin', $attributes);
        $this->add_action_buttons(true, 'Submit');
    }

}
于 2014-03-13T11:21:59.057 に答える