/**
  * Generate the display of the formulation part of the question. This is the
  * area that contains the quetsion text, and the controls for students to
  * input their answers. Some question types also embed bits of feedback, for
  * example ticks and crosses, in this area.
  *
  * @param question_attempt $qa the question attempt to display.
  * @param question_display_options $options controls what should and should not be displayed.
  * @return string HTML fragment.
  */
 public function formulation_and_controls(question_attempt $qa, question_display_options $options)
 {
     $question = $qa->get_question();
     $response = $qa->get_last_qt_data();
     $table = new html_table();
     $table->attributes['class'] = 'matrix';
     $table->head = array();
     $table->head[] = '';
     foreach ($question->cols as $col) {
         $table->head[] = self::matrix_header($col);
     }
     if ($options->correctness) {
         $table->head[] = '';
     }
     foreach ($question->rows as $row) {
         $row_data = array();
         $row_data[] = self::matrix_header($row);
         foreach ($question->cols as $col) {
             $key = $question->key($row, $col);
             $cell_name = $qa->get_field_prefix() . $key;
             $is_readonly = $options->readonly;
             $is_checked = $question->is_answered($response, $row, $col);
             if ($question->multiple) {
                 $cell = self::checkbox($cell_name, $is_checked, $is_readonly);
             } else {
                 $cell = self::radio($cell_name, $col->id, $is_checked, $is_readonly);
             }
             if ($options->correctness) {
                 $weight = $question->weight($row, $col);
                 $cell .= $this->feedback_image($weight);
             }
             $row_data[] = $cell;
         }
         if ($options->correctness) {
             $row_grade = $question->grading()->grade_row($question, $row, $response);
             $feedback = $row->feedback;
             $feedback = strip_tags($feedback) ? $feedback : '';
             $row_data[] = $this->feedback_image($row_grade) . $feedback;
         }
         $table->data[] = $row_data;
         //$row_index++;
     }
     $result = $question->questiontext;
     $result .= html_writer::table($table, true);
     return $result;
 }