MDL-53638 mod_feedback: convert to moodleforms

This commit is contained in:
Marina Glancy
2016-04-27 13:28:43 +08:00
parent ffee513ef2
commit 97d71cbc3a
30 changed files with 2230 additions and 1651 deletions
+11 -27
View File
@@ -36,16 +36,15 @@ list($course, $cm) = get_course_and_cm_from_cmid($id, 'feedback');
require_course_login($course, true, $cm);
$feedback = $PAGE->activityrecord;
$feedbackstructure = new mod_feedback_structure($feedback, $cm);
$context = context_module::instance($cm->id);
if (!feedback_can_view_analysis($feedback, $context)) {
if (!$feedbackstructure->can_view_analysis()) {
print_error('error');
}
/// Print the page header
$strfeedbacks = get_string("modulenameplural", "feedback");
$strfeedback = get_string("modulename", "feedback");
$PAGE->set_heading($course->fullname);
$PAGE->set_title($feedback->name);
@@ -57,9 +56,8 @@ require('tabs.php');
//get the groupid
$myurl = $CFG->wwwroot.'/mod/feedback/analysis.php?id='.$cm->id.'&do_show=analysis';
$mygroupid = groups_get_activity_group($cm, true);
groups_print_activity_menu($cm, $myurl);
groups_print_activity_menu($cm, $url);
if ( has_capability('mod/feedback:viewreports', $context) ) {
//button "export to excel"
@@ -69,17 +67,15 @@ if ( has_capability('mod/feedback:viewreports', $context) ) {
echo $OUTPUT->container_end();
}
//get completed feedbacks
$completedscount = feedback_get_completeds_group_count($feedback, $mygroupid);
// Get completed feedbacks.
$completedcount = $feedbackstructure->count_completed_responses($mygroupid);
echo '<div class="analysis_header">';
// Show the submissions count.
echo '<b>'.get_string('completed_feedbacks', 'feedback').': '.$completedscount. '</b><br />';
// get the items of the feedback
$items = $DB->get_records('feedback_item',
array('feedback'=>$feedback->id, 'hasvalue'=>1),
'position');
// Get the items of the feedback.
$items = $feedbackstructure->get_items(true);
// Show the items count.
if (is_array($items)) {
echo '<b>'.get_string('questions', 'feedback').': ' .count($items). ' </b><hr />';
@@ -90,30 +86,18 @@ echo '</div>';
$check_anonymously = true;
if ($mygroupid > 0 AND $feedback->anonymous == FEEDBACK_ANONYMOUS_YES) {
if ($completedscount < FEEDBACK_MIN_ANONYMOUS_COUNT_IN_GROUP) {
if ($completedcount < FEEDBACK_MIN_ANONYMOUS_COUNT_IN_GROUP) {
$check_anonymously = false;
}
}
echo '<div>';
if ($check_anonymously) {
$itemnr = 0;
//print the items in an analysed form
// Print the items in an analysed form.
foreach ($items as $item) {
if ($item->hasvalue == 0) {
continue;
}
echo '<table width="100%" class="generalbox">';
//get the class of item-typ
echo '<table class="analysis">';
$itemobj = feedback_get_item_class($item->typ);
$itemnr++;
if ($feedback->autonumbering) {
$printnr = $itemnr.'.';
} else {
$printnr = '';
}
$printnr = ($feedback->autonumbering && $item->itemnr) ? ($item->itemnr . '.') : '';
$itemobj->print_analysed($item, $printnr, $mygroupid);
echo '</table>';
}
+16 -35
View File
@@ -49,26 +49,19 @@ if ($searchcourse !== '') {
}
$PAGE->set_url($url);
if (! $cm = get_coursemodule_from_id('feedback', $id)) {
print_error('invalidcoursemodule');
}
if (! $course = $DB->get_record("course", array("id"=>$cm->course))) {
print_error('coursemisconf');
}
if (! $feedback = $DB->get_record("feedback", array("id"=>$cm->instance))) {
print_error('invalidcoursemodule');
}
list($course, $cm) = get_course_and_cm_from_cmid($id, 'feedback');
$context = context_module::instance($cm->id);
require_login($course, true, $cm);
require_course_login($course, true, $cm);
$feedback = $PAGE->activityrecord;
if (!($feedback->publish_stats OR has_capability('mod/feedback:viewreports', $context))) {
print_error('error');
}
$feedbackstructure = new mod_feedback_structure($feedback, $PAGE->cm, $courseid);
/// Print the page header
$strfeedbacks = get_string("modulenameplural", "feedback");
$strfeedback = get_string("modulename", "feedback");
@@ -96,14 +89,13 @@ if (has_capability('mod/feedback:viewreports', $context)) {
//lstgroupid is the choosen id
$mygroupid = false;
//get completed feedbacks
$completedscount = feedback_get_completeds_group_count($feedback, $mygroupid, $courseid);
$completedcount = $feedbackstructure->count_completed_responses();
//show the count
echo '<b>'.get_string('completed_feedbacks', 'feedback').': '.$completedscount. '</b><br />';
// get the items of the feedback
$params = array('feedback' => $feedback->id, 'hasvalue' => 1);
$items = $DB->get_records('feedback_item', $params, 'position');
// Get the items of the feedback.
$items = $feedbackstructure->get_items(true);
//show the count
if (is_array($items)) {
echo '<b>'.get_string('questions', 'feedback').': ' .count($items). ' </b><hr />';
@@ -123,8 +115,6 @@ if ($courseitemfilter > 0) {
echo '<div class="clearfix">';
echo '<table>';
echo '<tr><th>Course</th><th>Average</th></tr>';
$sep_dec = get_string('separator_decimal', 'feedback');
$sep_thous = get_string('separator_thousand', 'feedback');
foreach ($courses as $c) {
$coursecontext = context_course::instance($c->course_id);
@@ -133,7 +123,7 @@ if ($courseitemfilter > 0) {
echo '<tr>';
echo '<td>'.$shortname.'</td>';
echo '<td align="right">';
echo number_format(($c->sumvalue / $c->countvalue), 2, $sep_dec, $sep_thous);
echo format_float(($c->sumvalue / $c->countvalue), 2);
echo '</td>';
echo '</tr>';
}
@@ -182,23 +172,14 @@ if ($courseitemfilter > 0) {
echo '</form>';
echo '</div>';
echo '<hr />';
$itemnr = 0;
//print the items in an analysed form
// Print the items in an analysed form.
foreach ($items as $item) {
if ($item->hasvalue == 0) {
continue;
}
echo '<table>';
//get the class from item-typ
echo '<table class="analysis">';
echo "<tr><td colspan=\"2\" class=\"analysis_separator\"><hr></td></tr>";
$itemobj = feedback_get_item_class($item->typ);
$itemnr++;
if ($feedback->autonumbering) {
$printnr = $itemnr.'.';
} else {
$printnr = '';
}
$itemobj->print_analysed($item, $printnr, $mygroupid, $courseid);
$printnr = ($feedback->autonumbering && $item->itemnr) ? ($item->itemnr . '.') : '';
$itemobj->print_analysed($item, $printnr, $mygroupid, $feedbackstructure->get_courseid());
if (preg_match('/rated$/i', $item->typ)) {
$url = new moodle_url('/mod/feedback/analysis_course.php', array('id' => $id,
'courseitemfilter' => $item->id, 'courseitemfiltertyp' => $item->typ));
+4 -3
View File
@@ -54,6 +54,7 @@ if (! $feedback = $DB->get_record("feedback", array("id"=>$cm->instance))) {
$context = context_module::instance($cm->id);
require_login($course, true, $cm);
$feedbackstructure = new mod_feedback_structure($feedback, $PAGE->cm, $coursefilter);
require_capability('mod/feedback:viewreports', $context);
@@ -78,8 +79,8 @@ $fstring->anonymous_user = get_string('anonymous_user', 'feedback');
ob_end_clean();
//get the questions (item-names)
$params = array('feedback' => $feedback->id, 'hasvalue' => 1);
if (!$items = $DB->get_records('feedback_item', $params, 'position')) {
$items = $feedbackstructure->get_items(true);
if (!$items) {
print_error('no_items_available_yet',
'feedback',
$CFG->wwwroot.'/mod/feedback/view.php?id='.$id);
@@ -139,7 +140,7 @@ $worksheet1->write_string($row_offset1, 0, userdate(time()), $xls_formats->head1
//print the analysed sheet
////////////////////////////////////////////////////////////////////////
//get the completeds
$completedscount = feedback_get_completeds_group_count($feedback, $mygroupid, $coursefilter);
$completedscount = $feedbackstructure->count_completed_responses($mygroupid);
if ($completedscount > 0) {
//write the count of completeds
$row_offset1++;
+579
View File
@@ -0,0 +1,579 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Contains class mod_feedback_complete_form
*
* @package mod_feedback
* @copyright 2016 Marina Glancy
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
/**
* Class mod_feedback_complete_form
*
* @package mod_feedback
* @copyright 2016 Marina Glancy
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class mod_feedback_complete_form extends moodleform {
/** @var int */
const MODE_COMPLETE = 1;
/** @var int */
const MODE_PRINT = 2;
/** @var int */
const MODE_EDIT = 3;
/** @var int */
const MODE_VIEW_RESPONSE = 4;
/** @var int */
const MODE_VIEW_TEMPLATE = 5;
/** @var int */
protected $mode;
/** @var mod_feedback_structure|mod_feedback_completion */
protected $structure;
/** @var mod_feedback_completion */
protected $completion;
/** @var int */
protected $gopage;
/** @var bool */
protected $hasrequired = false;
/**
* Constructor
*
* @param int $mode
* @param mod_feedback_structure $structure
* @param string $formid CSS id attribute of the form
* @param array $customdata
*/
public function __construct($mode, mod_feedback_structure $structure, $formid, $customdata = null) {
$this->mode = $mode;
$this->structure = $structure;
$this->gopage = isset($customdata['gopage']) ? $customdata['gopage'] : 0;
$isanonymous = $this->structure->is_anonymous() ? ' ianonymous' : '';
parent::__construct(null, $customdata, 'POST', '',
array('id' => $formid, 'class' => 'feedback_form' . $isanonymous), true);
}
/**
* Form definition
*/
public function definition() {
$mform = $this->_form;
$mform->addElement('hidden', 'id', $this->get_cm()->id);
$mform->setType('id', PARAM_INT);
$mform->addElement('hidden', 'courseid', $this->get_current_course_id());
$mform->setType('courseid', PARAM_INT);
$mform->addElement('hidden', 'gopage');
$mform->setType('gopage', PARAM_INT);
$mform->addElement('hidden', 'lastpage');
$mform->setType('lastpage', PARAM_INT);
$mform->addElement('hidden', 'startitempos');
$mform->setType('startitempos', PARAM_INT);
$mform->addElement('hidden', 'lastitempos');
$mform->setType('lastitempos', PARAM_INT);
if (isloggedin() && !isguestuser() && $this->mode != self::MODE_EDIT && $this->mode != self::MODE_VIEW_TEMPLATE &&
$this->mode != self::MODE_VIEW_RESPONSE) {
// Output information about the current mode (anonymous or not) in some modes.
if ($this->structure->is_anonymous()) {
$anonymousmodeinfo = get_string('anonymous', 'feedback');
} else {
$anonymousmodeinfo = get_string('non_anonymous', 'feedback');
}
$element = $mform->addElement('static', 'anonymousmode', '',
get_string('mode', 'feedback') . ': ' . $anonymousmodeinfo);
$element->setAttributes($element->getAttributes() + ['class' => 'feedback_mode']);
}
// Add buttons to go to previous/next pages and submit the feedback.
if ($this->mode == self::MODE_COMPLETE) {
$buttonarray = array();
$buttonarray[] = &$mform->createElement('submit', 'gopreviouspage', get_string('previous_page', 'feedback'));
$buttonarray[] = &$mform->createElement('submit', 'gonextpage', get_string('next_page', 'feedback'),
array('class' => 'form-submit'));
$buttonarray[] = &$mform->createElement('submit', 'savevalues', get_string('save_entries', 'feedback'),
array('class' => 'form-submit'));
$buttonarray[] = &$mform->createElement('static', 'buttonsseparator', '', '<br>');
$buttonarray[] = &$mform->createElement('cancel');
$mform->addGroup($buttonarray, 'buttonar', '', array(' '), false);
$mform->closeHeaderBefore('buttonar');
}
// Set data.
$this->set_data(array('gopage' => $this->gopage));
}
/**
* This method is called after definition(), data submission and set_data().
* All form setup that is dependent on form values should go in here.
*/
public function definition_after_data() {
parent::definition_after_data();
if ($this->mode == self::MODE_COMPLETE) {
$this->definition_after_data_complete();
} else {
$this->definition_after_data_preview();
}
}
/**
* Called from definition_after_data() in the completion mode
*
* This will add only items from a current page to the feedback and adjust the buttons
*/
protected function definition_after_data_complete() {
if (!$this->structure instanceof mod_feedback_completion) {
// We should not really be here but just in case.
return;
}
$pages = $this->structure->get_pages();
$gopage = $this->gopage;
$pageitems = $pages[$gopage];
$hasnextpage = $gopage < count($pages) - 1; // Until we complete this page we can not trust get_next_page().
$hasprevpage = $gopage && ($this->structure->get_previous_page($gopage, false) !== null);
// Add elements.
foreach ($pageitems as $item) {
$itemobj = feedback_get_item_class($item->typ);
$itemobj->complete_form_element($item, $this);
}
// Remove invalid buttons (for example, no "previous page" if we are on the first page).
if (!$hasprevpage) {
$this->remove_button('gopreviouspage');
}
if (!$hasnextpage) {
$this->remove_button('gonextpage');
}
if ($hasnextpage) {
$this->remove_button('savevalues');
}
}
/**
* Called from definition_after_data() in all modes except for completion
*
* This will add all items to the form, including pagebreaks as horizontal rules.
*/
protected function definition_after_data_preview() {
foreach ($this->structure->get_items() as $feedbackitem) {
$itemobj = feedback_get_item_class($feedbackitem->typ);
$itemobj->complete_form_element($feedbackitem, $this);
}
}
/**
* Removes the button that is not applicable for the current page
*
* @param string $buttonname
*/
private function remove_button($buttonname) {
$el = $this->_form->getElement('buttonar');
foreach ($el->_elements as $idx => $button) {
if ($button instanceof MoodleQuickForm_submit && $button->getName() === $buttonname) {
unset($el->_elements[$idx]);
return;
}
}
}
/**
* Returns value for this element that is already stored in temporary or permanent table,
* usually only available when user clicked "Previous page". Null means no value is stored.
*
* @param stdClass $item
* @return string
*/
public function get_item_value($item) {
if ($this->structure instanceof mod_feedback_completion) {
return $this->structure->get_item_value($item);
}
return null;
}
/**
* Can be used by the items to get the course id for which feedback is taken
*
* This function returns 0 for feedbacks that are located inside the courses.
* $this->get_feedback()->course will return the course where feedback is located.
* $this->get_current_course_id() will return the course where user was before taking the feedback
*
* @return int
*/
public function get_course_id() {
return $this->structure->get_courseid();
}
/**
* Record from 'feedback' table corresponding to the current feedback
* @return stdClass
*/
public function get_feedback() {
return $this->structure->get_feedback();
}
/**
* Current feedback mode, see constants on the top of this class
* @return int
*/
public function get_mode() {
return $this->mode;
}
/**
* Returns whether the form is frozen, some items may prefer to change the element
* type in case of frozen form. For example, text or textarea element does not look
* nice when frozen
*
* @return bool
*/
public function is_frozen() {
return $this->mode == self::MODE_VIEW_RESPONSE;
}
/**
* Returns the current course module
* @return cm_info
*/
public function get_cm() {
return $this->structure->get_cm();
}
/**
* Returns the course where user was before taking the feedback.
*
* For feedbacks inside the course it will be the same as $this->get_feedback()->course.
* For feedbacks on the frontpage it will be the same as $this->get_course_id()
*
* @return int
*/
public function get_current_course_id() {
return $this->structure->get_courseid() ?: $this->get_feedback()->course;
}
/**
* CSS class for the item
* @param stdClass $item
* @return string
*/
protected function get_suggested_class($item) {
$class = "feedback_itemlist feedback-item-{$item->typ}";
if ($item->dependitem) {
$class .= " feedback_is_dependent";
}
if ($item->typ !== 'pagebreak') {
$itemobj = feedback_get_item_class($item->typ);
if ($itemobj->get_hasvalue()) {
$class .= " feedback_hasvalue";
}
}
return $class;
}
/**
* Adds an element to this form - to be used by items in their complete_form_element() method
*
* @param stdClass $item
* @param HTML_QuickForm_element|array $element either completed form element or an array that
* can be passed as arguments to $this->_form->createElement() function
* @param bool $addrequiredrule automatically add 'required' rule
* @param bool $setdefaultvalue automatically set default value for element
* @return HTML_QuickForm_element
*/
public function add_form_element($item, $element, $addrequiredrule = true, $setdefaultvalue = true) {
global $OUTPUT;
// Add element to the form.
if (is_array($element)) {
if ($this->is_frozen() && $element[0] === 'text') {
// Convert 'text' element to 'static' when freezing for better display.
$element = ['static', $element[1], $element[2]];
}
$element = call_user_func_array(array($this->_form, 'createElement'), $element);
}
$element = $this->_form->addElement($element);
// Prepend standard CSS classes to the element classes.
$attributes = $element->getAttributes();
$class = !empty($attributes['class']) ? ' ' . $attributes['class'] : '';
$attributes['class'] = $this->get_suggested_class($item) . $class;
$element->setAttributes($attributes);
// Add required rule.
if ($item->required && $addrequiredrule) {
$this->_form->addRule($element->getName(), get_string('required'), 'required', null, 'client');
}
// Set default value.
if ($setdefaultvalue && ($tmpvalue = $this->get_item_value($item))) {
$this->_form->setDefault($element->getName(), $tmpvalue);
}
// Freeze if needed.
if ($this->is_frozen()) {
$element->freeze();
}
// Add red asterisks on required fields.
if ($item->required) {
$required = '<img class="req" title="'.get_string('requiredelement', 'form').'" alt="'.
get_string('requiredelement', 'form').'" src="'.$OUTPUT->pix_url('req') .'" />';
$element->setLabel($element->getLabel() . $required);
$this->hasrequired = true;
}
// Add different useful stuff to the question name.
$this->add_item_label($item, $element);
$this->add_item_dependencies($item, $element);
$this->add_item_number($item, $element);
if ($this->mode == self::MODE_EDIT) {
$this->enhance_name_for_edit($item, $element);
}
return $element;
}
/**
* Adds a group element to this form - to be used by items in their complete_form_element() method
*
* @param stdClass $item
* @param string $groupinputname name for the form element
* @param string $name question text
* @param array $elements array of arrays that can be passed to $this->_form->createElement()
* @param string $separator separator between group elements
* @param string $class additional CSS classes for the form element
* @return HTML_QuickForm_element
*/
public function add_form_group_element($item, $groupinputname, $name, $elements, $separator,
$class = '') {
$objects = array();
foreach ($elements as $element) {
$object = call_user_func_array(array($this->_form, 'createElement'), $element);
$objects[] = $object;
}
$element = $this->add_form_element($item,
['group', $groupinputname, $name, $objects, $separator, false],
false,
false);
if ($class !== '') {
$attributes = $element->getAttributes();
$attributes['class'] .= ' ' . $class;
$element->setAttributes($attributes);
}
return $element;
}
/**
* Adds an item number to the question name (if feedback autonumbering is on)
* @param stdClass $item
* @param HTML_QuickForm_element $element
*/
protected function add_item_number($item, $element) {
if ($this->get_feedback()->autonumbering && !empty($item->itemnr)) {
$name = $element->getLabel();
$element->setLabel(html_writer::span($item->itemnr. '.', 'itemnr') . ' ' . $name);
}
}
/**
* Adds an item label to the question name
* @param stdClass $item
* @param HTML_QuickForm_element $element
*/
protected function add_item_label($item, $element) {
if (strlen($item->label) && ($this->mode == self::MODE_EDIT || $this->mode == self::MODE_VIEW_TEMPLATE)) {
$name = $element->getLabel();
$name = '('.format_string($item->label).') '.$name;
$element->setLabel($name);
}
}
/**
* Adds a dependency description to the question name
* @param stdClass $item
* @param HTML_QuickForm_element $element
*/
protected function add_item_dependencies($item, $element) {
$allitems = $this->structure->get_items();
if ($item->dependitem && ($this->mode == self::MODE_EDIT || $this->mode == self::MODE_VIEW_TEMPLATE)) {
if (isset($allitems[$item->dependitem])) {
$dependitem = $allitems[$item->dependitem];
$name = $element->getLabel();
$name .= html_writer::span(' ('.format_string($dependitem->label).'-&gt;'.$item->dependvalue.')',
'feedback_depend');
$element->setLabel($name);
}
}
}
/**
* Returns the CSS id attribute that will be assigned by moodleform later to this element
* @param stdClass $item
* @param HTML_QuickForm_element $element
*/
protected function guess_element_id($item, $element) {
if (!$id = $element->getAttribute('id')) {
$attributes = $element->getAttributes();
$id = $attributes['id'] = 'feedback_item_' . $item->id;
$element->setAttributes($attributes);
}
if ($element->getType() === 'group') {
return 'fgroup_' . $id;
}
return 'fitem_' . $id;
}
/**
* Adds editing actions to the question name in the edit mode
* @param stdClass $item
* @param HTML_QuickForm_element $element
*/
protected function enhance_name_for_edit($item, $element) {
global $OUTPUT;
$menu = new action_menu();
$menu->set_owner_selector('#' . $this->guess_element_id($item, $element));
$menu->set_constraint('.feedback_form');
$menu->set_alignment(action_menu::TR, action_menu::BR);
$menu->set_menu_trigger(get_string('edit'));
$menu->do_not_enhance();
$menu->prioritise = true;
$itemobj = feedback_get_item_class($item->typ);
$actions = $itemobj->edit_actions($item, $this->get_feedback(), $this->get_cm());
foreach ($actions as $action) {
$menu->add($action);
}
$editmenu = $OUTPUT->render($menu);
$name = $element->getLabel();
$name = html_writer::span('', 'itemdd', array('id' => 'feedback_item_box_' . $item->id)) .
html_writer::span($name, 'itemname') .
html_writer::span($editmenu, 'itemactions');
$element->setLabel(html_writer::span($name, 'itemtitle'));
}
/**
* Sets the default value for form element - alias to $this->_form->setDefault()
* @param HTML_QuickForm_element|string $element
* @param mixed $defaultvalue
*/
public function set_element_default($element, $defaultvalue) {
if ($element instanceof HTML_QuickForm_element) {
$element = $element->getName();
}
$this->_form->setDefault($element, $defaultvalue);
}
/**
* Sets the default value for form element - wrapper to $this->_form->setType()
* @param HTML_QuickForm_element|string $element
* @param int $type
*/
public function set_element_type($element, $type) {
if ($element instanceof HTML_QuickForm_element) {
$element = $element->getName();
}
$this->_form->setType($element, $type);
}
/**
* Adds a validation rule for the given field - wrapper for $this->_form->addRule()
*
* Do not use for 'required' rule!
* Required * will be added automatically, if additional validation is needed
* use method {@link self::add_validation_rule()}
*
* @param string $element Form element name
* @param string $message Message to display for invalid data
* @param string $type Rule type, use getRegisteredRules() to get types
* @param string $format (optional)Required for extra rule data
* @param string $validation (optional)Where to perform validation: "server", "client"
* @param bool $reset Client-side validation: reset the form element to its original value if there is an error?
* @param bool $force Force the rule to be applied, even if the target form element does not exist
*/
public function add_element_rule($element, $message, $type, $format = null, $validation = 'server',
$reset = false, $force = false) {
if ($element instanceof HTML_QuickForm_element) {
$element = $element->getName();
}
$this->_form->addRule($element, $message, $type, $format, $validation, $reset, $force);
}
/**
* Adds a validation rule to the form
*
* @param callable $callback with arguments ($values, $files)
*/
public function add_validation_rule(callable $callback) {
if ($this->mode == self::MODE_COMPLETE) {
$this->_form->addFormRule($callback);
}
}
/**
* Returns a reference to the element - wrapper for function $this->_form->getElement()
*
* @param string $elementname Element name
* @return HTML_QuickForm_element reference to element
*/
public function get_form_element($elementname) {
return $this->_form->getElement($elementname);
}
/**
* Displays the form
*/
public function display() {
global $OUTPUT;
// Finalize the form definition if not yet done.
if (!$this->_definition_finalized) {
$this->_definition_finalized = true;
$this->definition_after_data();
}
$mform = $this->_form;
// Add "This form has required fields" text in the bottom of the form.
if (($mform->_required || $this->hasrequired) &&
($this->mode == self::MODE_COMPLETE || $this->mode == self::MODE_PRINT || $this->mode == self::MODE_VIEW_TEMPLATE)) {
$element = $mform->addElement('static', 'requiredfields', '',
get_string('somefieldsrequired', 'form',
'<img alt="'.get_string('requiredelement', 'form').'" src="'.$OUTPUT->pix_url('req') .'" />'));
$element->setAttributes($element->getAttributes() + ['class' => 'requirednote']);
}
// Reset _required array so the default red * are not displayed.
$mform->_required = array();
// Move buttons to the end of the form.
if ($this->mode == self::MODE_COMPLETE) {
$mform->addElement('hidden', '__dummyelement');
$buttons = $mform->removeElement('buttonar', false);
$mform->insertElementBefore($buttons, '__dummyelement');
$mform->removeElement('__dummyelement');
}
$this->_form->display();
}
}
+582
View File
@@ -0,0 +1,582 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Contains class mod_feedback_completion
*
* @package mod_feedback
* @copyright 2016 Marina Glancy
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
/**
* Collects information and methods about feedback completion (either complete.php or show_entries.php)
*
* @package mod_feedback
* @copyright 2016 Marina Glancy
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class mod_feedback_completion extends mod_feedback_structure {
/** @var stdClass */
protected $completed;
/** @var stdClass */
protected $completedtmp = null;
/** @var stdClass[] */
protected $valuestmp = null;
/** @var stdClass[] */
protected $values = null;
/** @var bool */
protected $iscompleted = false;
/**
* Constructor
*
* @param stdClass $feedback feedback object, in case of the template
* this is the current feedback the template is accessed from
* @param cm_info $cm course module object corresponding to the $feedback
* @param int $courseid current course (for site feedbacks only)
* @param bool $iscompleted has feedback been already completed? If yes either completedid or userid must be specified.
* @param int $completedid id in the table feedback_completed, may be omitted if userid is specified
* but it is highly recommended because the same user may have multiple responses to the same feedback
* for different courses
* @param int $userid id of the user - if specified only non-anonymous replies will be returned. If not
* specified only anonymous replies will be returned and the $completedid is mandatory.
*/
public function __construct($feedback, $cm, $courseid, $iscompleted = false, $completedid = null, $userid = null) {
global $DB;
// Make sure courseid is always set for site feedback and never for course feedback.
if ($feedback->course == SITEID) {
$courseid = $courseid ?: SITEID;
} else {
$courseid = 0;
}
parent::__construct($feedback, $cm, $courseid, 0);
if ($iscompleted) {
// Retrieve information about the completion.
$this->iscompleted = true;
$params = array('feedback' => $feedback->id);
if (!$userid && !$completedid) {
throw new coding_exception('Either $completedid or $userid must be specified for completed feedbacks');
}
if ($completedid) {
$params['id'] = $completedid;
}
if ($userid) {
// We must respect the anonymousity of the reply that the user saw when they were completing the feedback,
// not the current state that may have been changed later by the teacher.
$params['anonymous_response'] = FEEDBACK_ANONYMOUS_NO;
$params['userid'] = $userid;
}
$this->completed = $DB->get_record('feedback_completed', $params, '*', MUST_EXIST);
$this->courseid = $this->completed->courseid;
}
}
/**
* Returns a record from 'feedback_completed' table
* @return stdClass
*/
public function get_completed() {
return $this->completed;
}
/**
* Returns the temporary completion record for the current user or guest session
*
* @return stdClass|false record from feedback_completedtmp or false if not found
*/
protected function get_current_completed_tmp() {
global $USER, $DB;
if ($this->completedtmp === null) {
$params = array('feedback' => $this->get_feedback()->id);
if ($courseid = $this->get_courseid()) {
$params['courseid'] = $courseid;
}
if (isloggedin() && !isguestuser()) {
$params['userid'] = $USER->id;
} else {
$params['guestid'] = sesskey();
}
$this->completedtmp = $DB->get_record('feedback_completedtmp', $params);
}
return $this->completedtmp;
}
/**
* Can the current user see the item, if dependency is met?
*
* @param stdClass $item
* @return bool whether user can see item or not,
* null if dependency is broken or dependent question is not answered.
*/
protected function can_see_item($item) {
if (empty($item->dependitem)) {
return true;
}
if ($this->dependency_has_error($item)) {
return null;
}
$allitems = $this->get_items();
$ditem = $allitems[$item->dependitem];
$itemobj = feedback_get_item_class($ditem->typ);
if ($this->iscompleted) {
$value = $this->get_values($ditem);
} else {
$value = $this->get_values_tmp($ditem);
}
if ($value === null) {
return null;
}
return $itemobj->compare_value($ditem, $value, $item->dependvalue) ? true : false;
}
/**
* Dependency condition has an error
* @param stdClass $item
* @return bool
*/
protected function dependency_has_error($item) {
if (empty($item->dependitem)) {
// No dependency - no error.
return false;
}
$allitems = $this->get_items();
if (!array_key_exists($item->dependitem, $allitems)) {
// Looks like dependent item has been removed.
return true;
}
$itemids = array_keys($allitems);
$index1 = array_search($item->dependitem, $itemids);
$index2 = array_search($item->id, $itemids);
if ($index1 >= $index2) {
// Dependent item is after the current item in the feedback.
return true;
}
for ($i = $index1 + 1; $i < $index2; $i++) {
if ($allitems[$itemids[$i]]->typ === 'pagebreak') {
return false;
}
}
// There are no page breaks between dependent items.
return true;
}
/**
* Returns a value stored for this item in the feedback (temporary or not, depending on the mode)
* @param stdClass $item
* @return string
*/
public function get_item_value($item) {
if ($this->iscompleted) {
return $this->get_values($item);
} else {
return $this->get_values_tmp($item);
}
}
/**
* Returns all temporary values for this feedback or just a value for an item
* @param stdClass $item
* @return array
*/
protected function get_values_tmp($item = null) {
global $DB;
if ($this->valuestmp === null) {
$completedtmp = $this->get_current_completed_tmp();
if ($completedtmp) {
$this->valuestmp = $DB->get_records_menu('feedback_valuetmp',
['completed' => $completedtmp->id], '', 'item, value');
} else {
$this->valuestmp = array();
}
}
if ($item) {
return array_key_exists($item->id, $this->valuestmp) ? $this->valuestmp[$item->id] : null;
}
return $this->valuestmp;
}
/**
* Returns all completed values for this feedback or just a value for an item
* @param stdClass $item
* @return array
*/
protected function get_values($item = null) {
global $DB;
if ($this->values === null) {
if ($this->completed) {
$this->values = $DB->get_records_menu('feedback_value',
['completed' => $this->completed->id], '', 'item, value');
} else {
$this->values = array();
}
}
if ($item) {
return array_key_exists($item->id, $this->values) ? $this->values[$item->id] : null;
}
return $this->values;
}
/**
* Splits the feedback items into pages
*
* Items that we definitely know at this stage as not applicable are excluded.
* Items that are dependent on something that has not yet been answered are
* still present, as well as items with broken dependencies.
*
* @return array array of arrays of items
*/
public function get_pages() {
$pages = [[]]; // The first page always exists.
$items = $this->get_items();
foreach ($items as $item) {
if ($item->typ === 'pagebreak') {
$pages[] = [];
} else if ($this->can_see_item($item) !== false) {
$pages[count($pages) - 1][] = $item;
}
}
return $pages;
}
/**
* Returns the last page that has items with the value (i.e. not label) which have been answered
* as well as the first page that has items with the values that have not been answered.
*
* Either of the two return values may be null if there are no answered page or there are no
* unanswered pages left respectively.
*
* Two pages may not be directly following each other because there may be empty pages
* or pages with information texts only between them
*
* @return array array of two elements [$lastcompleted, $firstincompleted]
*/
protected function get_last_completed_page() {
$completed = [];
$incompleted = [];
$pages = $this->get_pages();
foreach ($pages as $pageidx => $pageitems) {
foreach ($pageitems as $item) {
if ($item->hasvalue) {
if ($this->get_values_tmp($item) !== null) {
$completed[$pageidx] = true;
} else {
$incompleted[$pageidx] = true;
}
}
}
}
$completed = array_keys($completed);
$incompleted = array_keys($incompleted);
// If some page has both completed and incompleted items it is considered incompleted.
$completed = array_diff($completed, $incompleted);
// If the completed page follows an incompleted page, it does not count.
$firstincompleted = $incompleted ? min($incompleted) : null;
if ($firstincompleted !== null) {
$completed = array_filter($completed, function($a) use ($firstincompleted) {
return $a < $firstincompleted;
});
}
$lastcompleted = $completed ? max($completed) : null;
return [$lastcompleted, $firstincompleted];
}
/**
* Get the next page for the feedback
*
* This is normally $gopage+1 but may be bigger if there are empty pages or
* pages without visible questions.
*
* This method can only be called when questions on the current page are
* already answered, otherwise it may be inaccurate.
*
* @param int $gopage current page
* @param bool $strictcheck when gopage is the user-input value, make sure we do not jump over unanswered questions
* @return int|null the index of the next page or null if this is the last page
*/
public function get_next_page($gopage, $strictcheck = true) {
if ($strictcheck) {
list($lastcompleted, $firstincompleted) = $this->get_last_completed_page();
if ($firstincompleted !== null && $firstincompleted <= $gopage) {
return $firstincompleted;
}
}
$pages = $this->get_pages();
for ($pageidx = $gopage + 1; $pageidx < count($pages); $pageidx++) {
if (!empty($pages[$pageidx])) {
return $pageidx;
}
}
// No further pages in the feedback have any visible items.
return null;
}
/**
* Get the previous page for the feedback
*
* This is normally $gopage-1 but may be smaller if there are empty pages or
* pages without visible questions.
*
* @param int $gopage current page
* @param bool $strictcheck when gopage is the user-input value, make sure we do not jump over unanswered questions
* @return int|null the index of the next page or null if this is the first page with items
*/
public function get_previous_page($gopage, $strictcheck = true) {
if (!$gopage) {
// If we are already on the first (0) page, there is definitely no previous page.
return null;
}
$pages = $this->get_pages();
$rv = null;
// Iterate through previous pages and find the closest one that has any items on it.
for ($pageidx = $gopage - 1; $pageidx >= 0; $pageidx--) {
if (!empty($pages[$pageidx])) {
$rv = $pageidx;
break;
}
}
if ($rv === null) {
// We are on the very first page that has items.
return null;
}
if ($rv > 0 && $strictcheck) {
// Check if this page is actually not past than first incompleted page.
list($lastcompleted, $firstincompleted) = $this->get_last_completed_page();
if ($firstincompleted !== null && $firstincompleted < $rv) {
return $firstincompleted;
}
}
return $rv;
}
/**
* Page index to resume the feedback
*
* When user abandones answering feedback and then comes back to it we should send him
* to the first page after the last page he fully completed.
* @return int
*/
public function get_resume_page() {
list($lastcompleted, $firstincompleted) = $this->get_last_completed_page();
return $lastcompleted === null ? 0 : $this->get_next_page($lastcompleted, false);
}
/**
* Creates a new record in the 'feedback_completedtmp' table for the current user/guest session
*
* @return stdClass record from feedback_completedtmp or false if not found
*/
protected function create_current_completed_tmp() {
global $USER, $DB;
$record = (object)['feedback' => $this->feedback->id];
if ($this->get_courseid()) {
$record->courseid = $this->get_courseid();
}
if (isloggedin() && !isguestuser()) {
$record->userid = $USER->id;
} else {
$record->guestid = sesskey();
}
$record->timemodified = time();
$record->anonymous_response = $this->feedback->anonymous;
$id = $DB->insert_record('feedback_completedtmp', $record);
$this->completedtmp = $DB->get_record('feedback_completedtmp', ['id' => $id]);
$this->valuestmp = null;
return $this->completedtmp;
}
/**
* Saves unfinished response to the temporary table
*
* This is called when user proceeds to the next/previous page in the complete form
* and also right after the form submit.
* After the form submit the {@link save_response()} is called to
* move response from temporary table to completion table.
*
* @param stdClass $data data from the form mod_feedback_complete_form
*/
public function save_response_tmp($data) {
global $DB;
if (!$completedtmp = $this->get_current_completed_tmp()) {
$completedtmp = $this->create_current_completed_tmp();
} else {
$currentime = time();
$DB->update_record('feedback_completedtmp',
['id' => $completedtmp->id, 'timemodified' => $currentime]);
$completedtmp->timemodified = $currentime;
}
// Find all existing values.
$existingvalues = $DB->get_records_menu('feedback_valuetmp',
['completed' => $completedtmp->id], '', 'item, id');
// Loop through all feedback items and save the ones that are present in $data.
$allitems = $this->get_items();
foreach ($allitems as $item) {
if (!$item->hasvalue) {
continue;
}
$keyname = $item->typ . '_' . $item->id;
if (!isset($data->$keyname)) {
// This item is either on another page or dependency was not met - nothing to save.
continue;
}
$newvalue = ['item' => $item->id, 'completed' => $completedtmp->id, 'course_id' => $completedtmp->courseid];
// Convert the value to string that can be stored in 'feedback_valuetmp' or 'feedback_value'.
$itemobj = feedback_get_item_class($item->typ);
$newvalue['value'] = $itemobj->create_value($data->$keyname);
// Update or insert the value in the 'feedback_valuetmp' table.
if (array_key_exists($item->id, $existingvalues)) {
$newvalue['id'] = $existingvalues[$item->id];
$DB->update_record('feedback_valuetmp', $newvalue);
} else {
$DB->insert_record('feedback_valuetmp', $newvalue);
}
}
// Reset valuestmp cache.
$this->valuestmp = null;
}
/**
* Saves the response
*
* The form data has already been stored in the temporary table in
* {@link save_response_tmp()}. This function copies the values
* from the temporary table to the completion table.
* It is also responsible for sending email notifications when applicable.
*/
public function save_response() {
global $USER, $SESSION, $DB;
$feedbackcompleted = $this->find_last_completed();
$feedbackcompletedtmp = $this->get_current_completed_tmp();
if (feedback_check_is_switchrole()) {
// We do not actually save anything if the role is switched, just delete temporary values.
$this->delete_completedtmp();
return;
}
// Save values.
$completedid = feedback_save_tmp_values($feedbackcompletedtmp, $feedbackcompleted);
$this->completed = $DB->get_record('feedback_completed', array('id' => $completedid));
// Send email.
if ($this->feedback->anonymous == FEEDBACK_ANONYMOUS_NO) {
feedback_send_email($this->cm, $this->feedback, $this->cm->get_course(), $USER);
} else {
feedback_send_email_anonym($this->cm, $this->feedback, $this->cm->get_course());
}
unset($SESSION->feedback->is_started);
// Update completion state.
$completion = new completion_info($this->cm->get_course());
if (isloggedin() && !isguestuser() && $completion->is_enabled($this->cm) && $this->feedback->completionsubmit) {
$completion->update_state($this->cm, COMPLETION_COMPLETE);
}
}
/**
* Deletes the temporary completed and all related temporary values
*/
protected function delete_completedtmp() {
global $DB;
if ($completedtmp = $this->get_current_completed_tmp()) {
$DB->delete_records('feedback_valuetmp', ['completed' => $completedtmp->id]);
$DB->delete_records('feedback_completedtmp', ['id' => $completedtmp->id]);
$this->completedtmp = null;
}
}
/**
* Retrieves the last completion record for the current user
*
* @return stdClass record from feedback_completed or false if not found
*/
protected function find_last_completed() {
global $USER, $DB;
if (isloggedin() || isguestuser()) {
// Not possible to retrieve completed feedback for guests.
return false;
}
if ($this->is_anonymous()) {
// Not possible to retrieve completed anonymous feedback.
return false;
}
$params = array('feedback' => $this->feedback->id, 'userid' => $USER->id);
if ($this->get_courseid()) {
$params['courseid'] = $this->get_courseid();
}
$this->completed = $DB->get_record('feedback_completed', $params);
return $this->completed;
}
/**
* Checks if current user has capability to submit the feedback
*
* There is an exception for fully anonymous feedbacks when guests can complete
* feedback without the proper capability.
*
* This should be followed by checking {@link can_submit()} because even if
* user has capablity to complete, they may have already submitted feedback
* and can not re-submit
*
* @return bool
*/
public function can_complete() {
global $CFG;
$context = context_module::instance($this->cm->id);
if (has_capability('mod/feedback:complete', $context)) {
return true;
}
if (!empty($CFG->feedback_allowfullanonymous)
AND $this->feedback->course == SITEID
AND $this->feedback->anonymous == FEEDBACK_ANONYMOUS_YES
AND (!isloggedin() OR isguestuser())) {
// Guests are allowed to complete fully anonymous feedback without having 'mod/feedback:complete' capability.
return true;
}
return false;
}
/**
* Checks if user is prevented from re-submission.
*
* This must be called after {@link can_complete()}
*
* @return bool
*/
public function can_submit() {
if ($this->get_feedback()->multiple_submit == 0 ) {
if ($this->is_already_submitted()) {
return false;
}
}
return true;
}
}
@@ -50,6 +50,29 @@ class course_module_viewed extends \core\event\course_module_viewed {
$this->data['objecttable'] = 'feedback';
}
/**
* Creates an instance from feedback record
*
* @param stdClass $feedback
* @param cm_info|stdClass $cm
* @param stdClass $course
* @return course_module_viewed
*/
public static function create_from_record($feedback, $cm, $course) {
$event = self::create(array(
'objectid' => $feedback->id,
'context' => \context_module::instance($cm->id),
'anonymous' => ($feedback->anonymous == FEEDBACK_ANONYMOUS_YES),
'other' => array(
'anonymous' => $feedback->anonymous // Deprecated.
)
));
$event->add_record_snapshot('course_modules', $cm);
$event->add_record_snapshot('course', $course);
$event->add_record_snapshot('feedback', $feedback);
return $event;
}
/**
* Define whether a user can view the event or not. Make sure no one except admin can see details of an anonymous response.
*
@@ -54,6 +54,32 @@ class response_deleted extends \core\event\base {
$this->data['edulevel'] = self::LEVEL_PARTICIPATING;
}
/**
* Creates an instance from the record from db table feedback_completed
*
* @param stdClass $completed
* @param stdClass|cm_info $cm
* @param stdClass $feedback
* @return self
*/
public static function create_from_record($completed, $cm, $feedback) {
$event = self::create(array(
'relateduserid' => $completed->userid,
'objectid' => $completed->id,
'courseid' => $cm->course,
'context' => \context_module::instance($cm->id),
'anonymous' => ($completed->anonymous_response == FEEDBACK_ANONYMOUS_YES),
'other' => array(
'cmid' => $cm->id,
'instanceid' => $feedback->id,
'anonymous' => $completed->anonymous_response) // Deprecated.
));
$event->add_record_snapshot('feedback_completed', $completed);
$event->add_record_snapshot('feedback', $feedback);
return $event;
}
/**
* Returns localised general event name.
*
@@ -57,6 +57,29 @@ class response_submitted extends \core\event\base {
$this->data['edulevel'] = self::LEVEL_PARTICIPATING;
}
/**
* Creates an instance from the record from db table feedback_completed
*
* @param stdClass $completed
* @param stdClass|cm_info $cm
* @return self
*/
public static function create_from_record($completed, $cm) {
$event = self::create(array(
'relateduserid' => $completed->userid,
'objectid' => $completed->id,
'context' => \context_module::instance($cm->id),
'anonymous' => ($completed->anonymous_response == FEEDBACK_ANONYMOUS_YES),
'other' => array(
'cmid' => $cm->id,
'instanceid' => $completed->feedback,
'anonymous' => $completed->anonymous_response // Deprecated.
)
));
$event->add_record_snapshot('feedback_completed', $completed);
return $event;
}
/**
* Returns localised general event name.
*
+13
View File
@@ -206,6 +206,19 @@ class mod_feedback_responses_table extends table_sql {
return $this->grandtotal;
}
/**
* Defines columns
* @param array $columns an array of identifying names for columns. If
* columns are sorted then column names must correspond to a field in sql.
*/
function define_columns($columns) {
parent::define_columns($columns);
foreach ($this->columns as $column => $column) {
// Automatically assign classes to columns.
$this->column_class[$column] = ' ' . $column;
}
}
/**
* Displays the table
*/
+329
View File
@@ -0,0 +1,329 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Contains class mod_feedback_structure
*
* @package mod_feedback
* @copyright 2016 Marina Glancy
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
/**
* Stores and manipulates the structure of the feedback or template (items, pages, etc.)
*
* @package mod_feedback
* @copyright 2016 Marina Glancy
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class mod_feedback_structure {
/** @var stdClass */
protected $feedback;
/** @var cm_info */
protected $cm;
/** @var int */
protected $courseid = 0;
/** @var int */
protected $templateid;
/** @var array */
protected $allitems;
/** @var array */
protected $allcourses;
/**
* Constructor
*
* @param stdClass $feedback feedback object, in case of the template
* this is the current feedback the template is accessed from
* @param cm_info $cm course module object corresponding to the $feedback
* @param int $courseid current course (for site feedbacks only)
* @param int $templateid template id if this class represents the template structure
*/
public function __construct($feedback, $cm, $courseid = 0, $templateid = null) {
$this->feedback = $feedback;
$this->cm = $cm;
$this->courseid = ($feedback->course == SITEID) ? $courseid : 0;
$this->templateid = $templateid;
}
/**
* Current feedback
* @return stdClass
*/
public function get_feedback() {
return $this->feedback;
}
/**
* Current course module
* @return stdClass
*/
public function get_cm() {
return $this->cm;
}
/**
* Id of the current course (for site feedbacks only)
* @return stdClass
*/
public function get_courseid() {
return $this->courseid;
}
/**
* Template id
* @return int
*/
public function get_templateid() {
return $this->templateid;
}
/**
* Is this feedback open (check timeopen and timeclose)
* @return bool
*/
public function is_open() {
$checktime = time();
return (!$this->feedback->timeopen || $this->feedback->timeopen <= $checktime) &&
(!$this->feedback->timeclose || $this->feedback->timeclose >= $checktime);
}
/**
* Get all items in this feedback or this template
* @param bool $hasvalueonly only count items with a value.
* @return array of objects from feedback_item with an additional attribute 'itemnr'
*/
public function get_items($hasvalueonly = false) {
global $DB;
if ($this->allitems === null) {
if ($this->templateid) {
$this->allitems = $DB->get_records('feedback_item', ['template' => $this->templateid], 'position');
} else {
$this->allitems = $DB->get_records('feedback_item', ['feedback' => $this->feedback->id], 'position');
}
$idx = 1;
foreach ($this->allitems as $id => $item) {
$this->allitems[$id]->itemnr = $item->hasvalue ? ($idx++) : null;
}
}
if ($hasvalueonly && $this->allitems) {
return array_filter($this->allitems, function($item) {
return $item->hasvalue;
});
}
return $this->allitems;
}
/**
* Is the items list empty?
* @return bool
*/
public function is_empty() {
$items = $this->get_items();
$displayeditems = array_filter($items, function($item) {
return $item->typ !== 'pagebreak';
});
return !$displayeditems;
}
/**
* Is this feedback anonymous?
* @return bool
*/
public function is_anonymous() {
return $this->feedback->anonymous == FEEDBACK_ANONYMOUS_YES;
}
/**
* Returns the formatted text of the page after submit or null if it is not set
*
* @return string|null
*/
public function page_after_submit() {
global $CFG;
require_once($CFG->libdir . '/filelib.php');
$pageaftersubmit = $this->get_feedback()->page_after_submit;
if (empty($pageaftersubmit)) {
return null;
}
$pageaftersubmitformat = $this->get_feedback()->page_after_submitformat;
$context = context_module::instance($this->get_cm()->id);
$output = file_rewrite_pluginfile_urls($pageaftersubmit,
'pluginfile.php', $context->id, 'mod_feedback', 'page_after_submit', 0);
return format_text($output, $pageaftersubmitformat, array('overflowdiv' => true));
}
/**
* Checks if current user is able to view feedback on this course.
*
* @return bool
*/
public function can_view_analysis() {
$context = context_module::instance($this->cm->id);
if (has_capability('mod/feedback:viewreports', $context)) {
return true;
}
if (intval($this->feedback->publish_stats) != 1 ||
!has_capability('mod/feedback:viewanalysepage', $context)) {
return false;
}
if (!isloggedin() || isguestuser()) {
// There is no tracking for the guests, assume that they can view analysis if condition above is satisfied.
return $this->feedback->course == SITEID;
}
return $this->is_already_submitted(true);
}
/**
* check for multiple_submit = false.
* if the feedback is global so the courseid must be given
*
* @param bool $anycourseid if true checks if this feedback was submitted in any course, otherwise checks $this->courseid .
* Applicable to frontpage feedbacks only
* @return bool true if the feedback already is submitted otherwise false
*/
public function is_already_submitted($anycourseid = false) {
global $USER, $DB;
if (!isloggedin() || isguestuser()) {
return false;
}
$params = array('userid' => $USER->id, 'feedback' => $this->feedback->id);
if (!$anycourseid && $this->courseid) {
$params['courseid'] = $this->courseid;
}
return $DB->record_exists('feedback_completed', $params);
}
/**
* Check whether the feedback is mapped to the given courseid.
*/
public function check_course_is_mapped() {
global $DB;
if ($this->feedback->course != SITEID) {
return true;
}
if ($DB->get_records('feedback_sitecourse_map', array('feedbackid' => $this->feedback->id))) {
$params = array('feedbackid' => $this->feedback->id, 'courseid' => $this->courseid);
if (!$DB->get_record('feedback_sitecourse_map', $params)) {
return false;
}
}
// No mapping means any course is mapped.
return true;
}
/**
* If there are any new responses to the anonymous feedback, re-shuffle all
* responses and assign response number to each of them.
*/
public function shuffle_anonym_responses() {
global $DB;
$params = array('feedback' => $this->feedback->id,
'random_response' => 0,
'anonymous_response' => FEEDBACK_ANONYMOUS_YES);
if ($DB->count_records('feedback_completed', $params, 'random_response')) {
// Get all of the anonymous records, go through them and assign a response id.
unset($params['random_response']);
$feedbackcompleteds = $DB->get_records('feedback_completed', $params, 'id');
shuffle($feedbackcompleteds);
$num = 1;
foreach ($feedbackcompleteds as $compl) {
$compl->random_response = $num++;
$DB->update_record('feedback_completed', $compl);
}
}
}
/**
* Counts records from {feedback_completed} table for a given feedback
*
* If $groupid or $this->courseid is set, the records are filtered by the group/course
*
* @param int $groupid
* @return mixed array of found completeds otherwise false
*/
public function count_completed_responses($groupid = 0) {
global $DB;
if (intval($groupid) > 0) {
$query = "SELECT COUNT(DISTINCT fbc.id)
FROM {feedback_completed} fbc, {groups_members} gm
WHERE fbc.feedback = :feedback
AND gm.groupid = :groupid
AND fbc.userid = gm.userid";
} else if ($this->courseid) {
$query = "SELECT COUNT(fbc.id)
FROM {feedback_completed} fbc
WHERE fbc.feedback = :feedback
AND fbc.courseid = :courseid";
} else {
$query = "SELECT COUNT(fbc.id) FROM {feedback_completed} fbc WHERE fbc.feedback = :feedback";
}
$params = ['feedback' => $this->feedback->id, 'groupid' => $groupid, 'courseid' => $this->courseid];
return $DB->get_field_sql($query, $params);
}
/**
* For the frontpage feedback returns the list of courses with at least one completed feedback
*
* @return array id=>name pairs of courses
*/
public function get_completed_courses() {
global $DB;
if ($this->get_feedback()->course != SITEID) {
return [];
}
if ($this->allcourses !== null) {
return $this->allcourses;
}
$courseselect = "SELECT fbc.courseid
FROM {feedback_completed} fbc
WHERE fbc.feedback = :feedbackid";
$ctxselect = context_helper::get_preload_record_columns_sql('ctx');
$sql = 'SELECT c.id, c.shortname, c.fullname, c.idnumber, c.visible, '. $ctxselect. '
FROM {course} c
JOIN {context} ctx ON c.id = ctx.instanceid AND ctx.contextlevel = :contextcourse
WHERE c.id IN ('. $courseselect.') ORDER BY c.sortorder';
$list = $DB->get_records_sql($sql, ['contextcourse' => CONTEXT_COURSE, 'feedbackid' => $this->get_feedback()->id]);
$this->allcourses = array();
foreach ($list as $course) {
context_helper::preload_from_record($course);
if (!$course->visible && !has_capability('moodle/course:viewhiddencourses', context_course::instance($course->id))) {
// Do not return courses that current user can not see.
continue;
}
$label = get_course_display_name_for_list($course);
$this->allcourses[$course->id] = $label;
}
return $this->allcourses;
}
}
+78 -468
View File
@@ -29,527 +29,137 @@ require_once($CFG->libdir . '/completionlib.php');
feedback_init_feedback_session();
$id = required_param('id', PARAM_INT);
$completedid = optional_param('completedid', false, PARAM_INT);
$preservevalues = optional_param('preservevalues', 0, PARAM_INT);
$courseid = optional_param('courseid', false, PARAM_INT);
$gopage = optional_param('gopage', -1, PARAM_INT);
$lastpage = optional_param('lastpage', false, PARAM_INT);
$startitempos = optional_param('startitempos', 0, PARAM_INT);
$lastitempos = optional_param('lastitempos', 0, PARAM_INT);
$anonymous_response = optional_param('anonymous_response', 0, PARAM_INT); //arb
$highlightrequired = false;
if (($formdata = data_submitted()) AND !confirm_sesskey()) {
print_error('invalidsesskey');
}
//if the use hit enter into a textfield so the form should not submit
if (isset($formdata->sesskey) AND
!isset($formdata->savevalues) AND
!isset($formdata->gonextpage) AND
!isset($formdata->gopreviouspage)) {
$gopage = $formdata->lastpage;
}
if (isset($formdata->savevalues)) {
$savevalues = true;
} else {
$savevalues = false;
}
if ($gopage < 0 AND !$savevalues) {
if (isset($formdata->gonextpage)) {
$gopage = $lastpage + 1;
$gonextpage = true;
$gopreviouspage = false;
} else if (isset($formdata->gopreviouspage)) {
$gopage = $lastpage - 1;
$gonextpage = false;
$gopreviouspage = true;
} else {
print_error('missingparameter');
}
} else {
$gonextpage = $gopreviouspage = false;
}
$courseid = optional_param('courseid', null, PARAM_INT);
$gopage = optional_param('gopage', 0, PARAM_INT);
list($course, $cm) = get_course_and_cm_from_cmid($id, 'feedback');
$feedback = $DB->get_record("feedback", array("id" => $cm->instance), '*', MUST_EXIST);
$context = context_module::instance($cm->id);
$feedback_complete_cap = false;
if (has_capability('mod/feedback:complete', $context)) {
$feedback_complete_cap = true;
}
if (!empty($CFG->feedback_allowfullanonymous)
AND $course->id == SITEID
AND $feedback->anonymous == FEEDBACK_ANONYMOUS_YES
AND (!isloggedin() OR isguestuser())) {
// Guests are allowed to complete fully anonymous feedback without having 'mod/feedback:complete' capability.
$feedback_complete_cap = true;
}
//check whether the feedback is located and! started from the mainsite
if ($course->id == SITEID AND !$courseid) {
$courseid = SITEID;
}
//check whether the feedback is mapped to the given courseid
if ($course->id == SITEID AND !has_capability('mod/feedback:edititems', $context)) {
if ($DB->get_records('feedback_sitecourse_map', array('feedbackid'=>$feedback->id))) {
$params = array('feedbackid'=>$feedback->id, 'courseid'=>$courseid);
if (!$DB->get_record('feedback_sitecourse_map', $params)) {
print_error('notavailable', 'feedback');
}
}
}
$urlparams = array('id' => $cm->id, 'gopage' => $gopage, 'courseid' => $courseid);
$PAGE->set_url('/mod/feedback/complete.php', $urlparams);
require_course_login($course, true, $cm);
$PAGE->set_activity_record($feedback);
//check whether the given courseid exists
if ($courseid AND $courseid != SITEID) {
if ($course2 = $DB->get_record('course', array('id'=>$courseid))) {
require_course_login($course2); //this overwrites the object $course :-(
$course = $DB->get_record("course", array("id"=>$cm->course)); // the workaround
} else {
print_error('invalidcourseid');
}
$context = context_module::instance($cm->id);
$feedbackcompletion = new mod_feedback_completion($feedback, $cm, $courseid);
$courseid = $feedbackcompletion->get_courseid();
// Check whether the feedback is mapped to the given courseid.
if (!has_capability('mod/feedback:edititems', $context) &&
!$feedbackcompletion->check_course_is_mapped()) {
echo $OUTPUT->header();
echo $OUTPUT->notification(get_string('cannotaccess', 'mod_feedback'));
echo $OUTPUT->footer();
exit;
}
if (!$feedback_complete_cap) {
//check whether the given courseid exists
if ($courseid AND $courseid != SITEID) {
require_course_login(get_course($courseid)); // This overwrites the object $COURSE .
}
if (!$feedbackcompletion->can_complete()) {
print_error('error');
}
// Mark activity viewed for completion-tracking
$completion = new completion_info($course);
if (isloggedin() && !isguestuser()) {
$completion->set_module_viewed($cm);
}
/// Print the page header
$strfeedbacks = get_string("modulenameplural", "feedback");
$strfeedback = get_string("modulename", "feedback");
if ($course->id == SITEID) {
$PAGE->set_cm($cm, $course); // set's up global $COURSE
$PAGE->set_pagelayout('incourse');
}
$PAGE->navbar->add(get_string('feedback:complete', 'feedback'));
$urlparams = array('id'=>$cm->id, 'gopage'=>$gopage, 'courseid'=>$course->id);
$PAGE->set_url('/mod/feedback/complete.php', $urlparams);
$PAGE->set_heading($course->fullname);
$PAGE->set_title($feedback->name);
echo $OUTPUT->header();
$PAGE->set_pagelayout('incourse');
//check, if the feedback is open (timeopen, timeclose)
$checktime = time();
$feedback_is_closed = ($feedback->timeopen > $checktime) ||
($feedback->timeclose < $checktime &&
$feedback->timeclose > 0);
if ($feedback_is_closed) {
// Check if the feedback is open (timeopen, timeclose).
if (!$feedbackcompletion->is_open()) {
echo $OUTPUT->header();
echo $OUTPUT->heading(format_string($feedback->name));
echo $OUTPUT->box_start('generalbox boxaligncenter');
echo $OUTPUT->notification(get_string('feedback_is_not_open', 'feedback'));
echo $OUTPUT->continue_button($CFG->wwwroot.'/course/view.php?id='.$course->id);
echo $OUTPUT->continue_button(course_get_url($courseid ?: $feedback->course));
echo $OUTPUT->box_end();
echo $OUTPUT->footer();
exit;
}
//additional check for multiple-submit (prevent browsers back-button).
//the main-check is in view.php
$feedback_can_submit = true;
if ($feedback->multiple_submit == 0 ) {
if (feedback_is_already_submitted($feedback->id, $courseid)) {
$feedback_can_submit = false;
}
// Mark activity viewed for completion-tracking.
$completion = new completion_info($course);
if (isloggedin() && !isguestuser()) {
$completion->set_module_viewed($cm);
}
if ($feedback_can_submit) {
//preserving the items
if ($preservevalues == 1) {
// Check if user is prevented from re-submission.
$cansubmit = $feedbackcompletion->can_submit();
// Initialise the form processing feedback completion.
if (!$feedbackcompletion->is_empty() && $cansubmit) {
$form = new mod_feedback_complete_form(mod_feedback_complete_form::MODE_COMPLETE,
$feedbackcompletion, 'feedback_complete_form', array('gopage' => $gopage));
if ($form->is_cancelled()) {
// Form was cancelled - return to the course page.
redirect(course_get_url($courseid ?: $course));
} else if ($form->is_submitted() &&
($form->is_validated() || optional_param('gopreviouspage', null, PARAM_RAW))) {
// Form was submitted (skip validation for "Previous page" button).
$data = $form->get_submitted_data();
if (!isset($SESSION->feedback->is_started) OR !$SESSION->feedback->is_started == true) {
print_error('error', '', $CFG->wwwroot.'/course/view.php?id='.$course->id);
}
// Check if all required items have a value.
if (feedback_check_values($startitempos, $lastitempos)) {
$userid = $USER->id; //arb
if (isloggedin() && !isguestuser()) {
$completedid = feedback_save_values($USER->id, true);
$feedbackcompletion->save_response_tmp($data);
if (!empty($data->savevalues) || !empty($data->gonextpage)) {
if (($nextpage = $feedbackcompletion->get_next_page($gopage)) !== null) {
redirect(new moodle_url($PAGE->url, array('gopage' => $nextpage)));
} else {
$completedid = feedback_save_guest_values(sesskey());
}
if ($completedid) {
if (!$gonextpage AND !$gopreviouspage) {
$preservevalues = false;// It can be stored.
}
} else {
$savereturn = 'failed';
if (isset($lastpage)) {
$gopage = $lastpage;
} else {
print_error('missingparameter');
$feedbackcompletion->save_response();
if (!$feedback->page_after_submit) {
\core\notification::success(get_string('entries_saved', 'feedback'));
}
}
} else {
$savereturn = 'missing';
$highlightrequired = true;
if (isset($lastpage)) {
$gopage = $lastpage;
} else {
print_error('missingparameter');
}
} else if (!empty($data->gopreviouspage)) {
$prevpage = $feedbackcompletion->get_previous_page($gopage);
redirect(new moodle_url($PAGE->url, array('gopage' => intval($prevpage))));
}
}
}
//saving the items
if ($savevalues AND !$preservevalues) {
//exists there any pagebreak, so there are values in the feedback_valuetmp
$userid = $USER->id; //arb
// Print the page header.
$strfeedbacks = get_string("modulenameplural", "feedback");
$strfeedback = get_string("modulename", "feedback");
if ($feedback->anonymous == FEEDBACK_ANONYMOUS_NO) {
$feedbackcompleted = feedback_get_current_completed($feedback->id, false, $courseid);
} else {
$feedbackcompleted = false;
}
$params = array('id' => $completedid);
$feedbackcompletedtmp = $DB->get_record('feedback_completedtmp', $params);
//fake saving for switchrole
$is_switchrole = feedback_check_is_switchrole();
if ($is_switchrole) {
$savereturn = 'saved';
feedback_delete_completedtmp($completedid);
} else {
$new_completed_id = feedback_save_tmp_values($feedbackcompletedtmp,
$feedbackcompleted,
$userid);
if ($new_completed_id) {
$savereturn = 'saved';
if ($feedback->anonymous == FEEDBACK_ANONYMOUS_NO) {
feedback_send_email($cm, $feedback, $course, $userid);
} else {
feedback_send_email_anonym($cm, $feedback, $course, $userid);
}
if (isloggedin() && !isguestuser()) {
// Tracking the submit.
$tracking = new stdClass();
$tracking->userid = $USER->id;
$tracking->feedback = $feedback->id;
$tracking->completed = $new_completed_id;
$DB->insert_record('feedback_tracking', $tracking);
}
unset($SESSION->feedback->is_started);
echo $OUTPUT->header();
echo $OUTPUT->heading(format_string($feedback->name));
// Update completion state
$completion = new completion_info($course);
if (isloggedin() && !isguestuser() && $completion->is_enabled($cm) && $feedback->completionsubmit) {
$completion->update_state($cm, COMPLETION_COMPLETE);
}
} else {
$savereturn = 'failed';
}
}
}
if ($allbreaks = feedback_get_all_break_positions($feedback->id)) {
if ($gopage <= 0) {
$startposition = 0;
} else {
if (!isset($allbreaks[$gopage - 1])) {
$gopage = count($allbreaks);
}
$startposition = $allbreaks[$gopage - 1];
}
$ispagebreak = true;
} else {
$startposition = 0;
$newpage = 0;
$ispagebreak = false;
}
//get the feedbackitems after the last shown pagebreak
$select = 'feedback = ? AND position > ?';
$params = array($feedback->id, $startposition);
$feedbackitems = $DB->get_records_select('feedback_item', $select, $params, 'position');
//get the first pagebreak
$params = array('feedback' => $feedback->id, 'typ' => 'pagebreak');
if ($pagebreaks = $DB->get_records('feedback_item', $params, 'position')) {
$pagebreaks = array_values($pagebreaks);
$firstpagebreak = $pagebreaks[0];
} else {
$firstpagebreak = false;
}
$maxitemcount = $DB->count_records('feedback_item', array('feedback'=>$feedback->id));
//get the values of completeds before done. Anonymous user can not get these values.
if ((!isset($SESSION->feedback->is_started)) AND
(!isset($savereturn)) AND
($feedback->anonymous == FEEDBACK_ANONYMOUS_NO)) {
$feedbackcompletedtmp = feedback_get_current_completed($feedback->id, true, $courseid);
if (!$feedbackcompletedtmp) {
$feedbackcompleted = feedback_get_current_completed($feedback->id, false, $courseid);
if ($feedbackcompleted) {
//copy the values to feedback_valuetmp create a completedtmp
$feedbackcompletedtmp = feedback_set_tmp_values($feedbackcompleted);
}
}
} else if (isloggedin() && !isguestuser()) {
$feedbackcompletedtmp = feedback_get_current_completed($feedback->id, true, $courseid);
} else {
$feedbackcompletedtmp = feedback_get_current_completed($feedback->id, true, $courseid, sesskey());
}
/// Print the main part of the page
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
$analysisurl = new moodle_url('/mod/feedback/analysis.php', array('id'=>$id));
if ($courseid > 0) {
$analysisurl->param('courseid', $courseid);
}
echo $OUTPUT->heading(format_string($feedback->name));
if (isset($savereturn) && $savereturn == 'saved') {
if ($feedbackcompletion->is_empty()) {
\core\notification::error(get_string('no_items_available_yet', 'feedback'));
} else if ($cansubmit) {
if (!empty($data->savevalues) || !empty($data->gonextpage)) {
// Display information after the submit.
if ($feedback->page_after_submit) {
require_once($CFG->libdir . '/filelib.php');
$page_after_submit_output = file_rewrite_pluginfile_urls($feedback->page_after_submit,
'pluginfile.php',
$context->id,
'mod_feedback',
'page_after_submit',
0);
echo $OUTPUT->box_start('generalbox boxaligncenter boxwidthwide');
echo format_text($page_after_submit_output,
$feedback->page_after_submitformat,
array('overflowdiv' => true));
echo $OUTPUT->box_end();
} else {
echo '<p align="center">';
echo '<b><font color="green">';
echo get_string('entries_saved', 'feedback');
echo '</font></b>';
echo '</p>';
echo $OUTPUT->box($feedbackcompletion->page_after_submit(),
'generalbox boxaligncenter');
}
if (feedback_can_view_analysis($feedback, $context, $courseid)) {
echo '<p align="center"><a href="'.$analysisurl->out().'">';
echo get_string('completed_feedbacks', 'feedback').'</a>';
if ($feedbackcompletion->can_view_analysis()) {
echo '<p align="center">';
$analysisurl = new moodle_url('/mod/feedback/analysis.php', array('id' => $cm->id, 'courseid' => $courseid));
echo html_writer::link($analysisurl, get_string('completed_feedbacks', 'feedback'));
echo '</p>';
}
if ($feedback->site_after_submit) {
$url = feedback_encode_target_url($feedback->site_after_submit);
} else {
if ($courseid) {
if ($courseid == SITEID) {
$url = $CFG->wwwroot;
} else {
$url = $CFG->wwwroot.'/course/view.php?id='.$courseid;
}
} else {
if ($course->id == SITEID) {
$url = $CFG->wwwroot;
} else {
$url = $CFG->wwwroot.'/course/view.php?id='.$course->id;
}
}
$url = course_get_url($courseid ?: $course->id);
}
echo $OUTPUT->continue_button($url);
} else {
if (isset($savereturn) && $savereturn == 'failed') {
echo $OUTPUT->box_start('mform');
echo '<span class="error">'.get_string('saving_failed', 'feedback').'</span>';
echo $OUTPUT->box_end();
}
if (isset($savereturn) && $savereturn == 'missing') {
echo $OUTPUT->box_start('mform');
echo '<span class="error">'.get_string('saving_failed_because_missing_or_false_values', 'feedback').'</span>';
echo $OUTPUT->box_end();
}
//print the items
if (is_array($feedbackitems)) {
echo $OUTPUT->box_start('feedback_form');
echo '<form action="complete.php" class="feedback_complete" method="post">';
echo '<input type="hidden" name="sesskey" value="'.sesskey().'" />';
$anonymousmodeinfo = '';
switch ($feedback->anonymous) {
case FEEDBACK_ANONYMOUS_YES:
echo '<input type="hidden" name="anonymous" value="1" />';
$inputvalue = 'value="'.FEEDBACK_ANONYMOUS_YES.'"';
echo '<input type="hidden" name="anonymous_response" '.$inputvalue.' />';
$anonymousmodeinfo = get_string('anonymous', 'feedback');
break;
case FEEDBACK_ANONYMOUS_NO:
echo '<input type="hidden" name="anonymous" value="0" />';
$inputvalue = 'value="'.FEEDBACK_ANONYMOUS_NO.'"';
echo '<input type="hidden" name="anonymous_response" '.$inputvalue.' />';
$anonymousmodeinfo = get_string('non_anonymous', 'feedback');
break;
}
if (isloggedin() && !isguestuser()) {
echo $OUTPUT->box(get_string('mode', 'feedback') . ': ' . $anonymousmodeinfo, 'feedback_anonymousinfo');
}
//check, if there exists required-elements
$params = array('feedback' => $feedback->id, 'required' => 1);
$countreq = $DB->count_records('feedback_item', $params);
if ($countreq > 0) {
echo '<span class="fdescription required">';
echo get_string('somefieldsrequired', 'form', '<img alt="'.get_string('requiredelement', 'form').
'" src="'.$OUTPUT->pix_url('req') .'" class="req" />');
echo '</span>';
}
echo $OUTPUT->box_start('feedback_items');
unset($startitem);
$select = 'feedback = ? AND hasvalue = 1 AND position < ?';
$params = array($feedback->id, $startposition);
$itemnr = $DB->count_records_select('feedback_item', $select, $params);
$lastbreakposition = 0;
$align = right_to_left() ? 'right' : 'left';
foreach ($feedbackitems as $feedbackitem) {
if (!isset($startitem)) {
//avoid showing double pagebreaks
if ($feedbackitem->typ == 'pagebreak') {
continue;
}
$startitem = $feedbackitem;
}
if ($feedbackitem->dependitem > 0) {
//chech if the conditions are ok
$fb_compare_value = feedback_compare_item_value($feedbackcompletedtmp->id,
$feedbackitem->dependitem,
$feedbackitem->dependvalue,
true);
if (!isset($feedbackcompletedtmp->id) OR !$fb_compare_value) {
$lastitem = $feedbackitem;
$lastbreakposition = $feedbackitem->position;
continue;
}
}
if ($feedbackitem->dependitem > 0) {
$dependstyle = ' feedback_complete_depend';
} else {
$dependstyle = '';
}
echo $OUTPUT->box_start('feedback_item_box_'.$align.$dependstyle);
$value = '';
//get the value
$frmvaluename = $feedbackitem->typ . '_'. $feedbackitem->id;
if (isset($savereturn)) {
$value = isset($formdata->{$frmvaluename}) ? $formdata->{$frmvaluename} : null;
$value = feedback_clean_input_value($feedbackitem, $value);
} else {
if (isset($feedbackcompletedtmp->id)) {
$value = feedback_get_item_value($feedbackcompletedtmp->id,
$feedbackitem->id,
true);
}
}
if ($feedbackitem->hasvalue == 1 AND $feedback->autonumbering) {
$itemnr++;
echo $OUTPUT->box_start('feedback_item_number_'.$align);
echo $itemnr;
echo $OUTPUT->box_end();
}
if ($feedbackitem->typ != 'pagebreak') {
echo $OUTPUT->box_start('box generalbox boxalign_'.$align);
feedback_print_item_complete($feedbackitem, $value, $highlightrequired);
echo $OUTPUT->box_end();
}
echo $OUTPUT->box_end();
$lastbreakposition = $feedbackitem->position; //last item-pos (item or pagebreak)
if ($feedbackitem->typ == 'pagebreak') {
break;
} else {
$lastitem = $feedbackitem;
}
}
echo $OUTPUT->box_end();
echo '<input type="hidden" name="id" value="'.$id.'" />';
echo '<input type="hidden" name="feedbackid" value="'.$feedback->id.'" />';
echo '<input type="hidden" name="lastpage" value="'.$gopage.'" />';
if (isset($feedbackcompletedtmp->id)) {
$inputvalue = 'value="'.$feedbackcompletedtmp->id.'"';
} else {
$inputvalue = 'value=""';
}
echo '<input type="hidden" name="completedid" '.$inputvalue.' />';
echo '<input type="hidden" name="courseid" value="'. $courseid . '" />';
echo '<input type="hidden" name="preservevalues" value="1" />';
if (isset($startitem)) {
echo '<input type="hidden" name="startitempos" value="'.$startitem->position.'" />';
echo '<input type="hidden" name="lastitempos" value="'.$lastitem->position.'" />';
}
if ( $ispagebreak AND $lastbreakposition > $firstpagebreak->position) {
$inputvalue = 'value="'.get_string('previous_page', 'feedback').'"';
echo '<input name="gopreviouspage" type="submit" '.$inputvalue.' />';
}
if ($lastbreakposition < $maxitemcount) {
$inputvalue = 'value="'.get_string('next_page', 'feedback').'"';
echo '<input name="gonextpage" type="submit" '.$inputvalue.' />';
}
if ($lastbreakposition >= $maxitemcount) { //last page
$inputvalue = 'value="'.get_string('save_entries', 'feedback').'"';
echo '<input name="savevalues" type="submit" '.$inputvalue.' />';
}
echo '</form>';
echo $OUTPUT->box_end();
echo $OUTPUT->box_start('feedback_complete_cancel');
if ($courseid) {
$action = 'action="'.$CFG->wwwroot.'/course/view.php?id='.$courseid.'"';
} else {
if ($course->id == SITEID) {
$action = 'action="'.$CFG->wwwroot.'"';
} else {
$action = 'action="'.$CFG->wwwroot.'/course/view.php?id='.$course->id.'"';
}
}
echo '<form '.$action.' method="post" onsubmit=" ">';
echo '<input type="hidden" name="sesskey" value="'.sesskey().'" />';
echo '<input type="hidden" name="courseid" value="'. $courseid . '" />';
echo '<button type="submit">'.get_string('cancel').'</button>';
echo '</form>';
echo $OUTPUT->box_end();
$SESSION->feedback->is_started = true;
}
// Print the items.
$SESSION->feedback->is_started = true;
$form->display();
}
} else {
echo $OUTPUT->heading(format_string($feedback->name));
echo $OUTPUT->box_start('generalbox boxaligncenter');
echo $OUTPUT->notification(get_string('this_feedback_is_already_submitted', 'feedback'));
echo $OUTPUT->continue_button($CFG->wwwroot.'/course/view.php?id='.$course->id);
echo $OUTPUT->continue_button(course_get_url($courseid ?: $course->id));
echo $OUTPUT->box_end();
}
/// Finish the page
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
echo $OUTPUT->footer();
+12 -35
View File
@@ -24,48 +24,26 @@
require_once("../../config.php");
require_once("lib.php");
require_once('delete_item_form.php');
$id = required_param('id', PARAM_INT);
$deleteitem = required_param('deleteitem', PARAM_INT);
$item = $DB->get_record('feedback_item', array('id' => $deleteitem), '*', MUST_EXIST);
list($course, $cm) = get_course_and_cm_from_instance($item->feedback, 'feedback');
$PAGE->set_url('/mod/feedback/delete_item.php', array('id'=>$id, 'deleteitem'=>$deleteitem));
if (! $cm = get_coursemodule_from_id('feedback', $id)) {
print_error('invalidcoursemodule');
}
if (! $course = $DB->get_record("course", array("id"=>$cm->course))) {
print_error('coursemisconf');
}
if (! $feedback = $DB->get_record("feedback", array("id"=>$cm->instance))) {
print_error('invalidcoursemodule');
}
$PAGE->set_url('/mod/feedback/delete_item.php', array('deleteitem' => $deleteitem));
require_login($course, false, $cm);
$context = context_module::instance($cm->id);
require_login($course, true, $cm);
require_capability('mod/feedback:edititems', $context);
$feedback = $PAGE->activityrecord;
$mform = new mod_feedback_delete_item_form();
$newformdata = array('id'=>$id,
'deleteitem'=>$deleteitem,
'confirmdelete'=>'1');
$mform->set_data($newformdata);
$formdata = $mform->get_data();
$editurl = new moodle_url('/mod/feedback/edit.php', array('id' => $cm->id));
if ($mform->is_cancelled()) {
redirect('edit.php?id='.$id);
// Process item deletion.
if (optional_param('confirm', 0, PARAM_BOOL) && confirm_sesskey()) {
feedback_delete_item($deleteitem);
redirect($editurl);
}
if (isset($formdata->confirmdelete) AND $formdata->confirmdelete == 1) {
feedback_delete_item($formdata->deleteitem);
redirect('edit.php?id=' . $id);
}
/// Print the page header
$strfeedbacks = get_string("modulenameplural", "feedback");
$strfeedback = get_string("modulename", "feedback");
@@ -81,9 +59,8 @@ echo $OUTPUT->header();
///////////////////////////////////////////////////////////////////////////
echo $OUTPUT->heading(format_string($feedback->name));
echo $OUTPUT->box_start('generalbox errorboxcontent boxaligncenter boxwidthnormal');
echo html_writer::tag('p', get_string('confirmdeleteitem', 'feedback'), array('class' => 'bold'));
print_string('relateditemsdeleted', 'feedback');
$mform->display();
$continueurl = new moodle_url($PAGE->url, array('confirm' => 1, 'sesskey' => sesskey()));
echo $OUTPUT->confirm(get_string('confirmdeleteitem', 'feedback'), $continueurl, $editurl);
echo $OUTPUT->box_end();
echo $OUTPUT->footer();
-50
View File
@@ -1,50 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* prints the form to confirm delete a completed
*
* @author Andreas Grabs
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
* @package mod_feedback
*/
//It must be included from a Moodle page
if (!defined('MOODLE_INTERNAL')) {
die('Direct access to this script is forbidden.');
}
require_once($CFG->libdir.'/formslib.php');
class mod_feedback_delete_item_form extends moodleform {
public function definition() {
$mform =& $this->_form;
// hidden elements
$mform->addElement('hidden', 'id');
$mform->setType('id', PARAM_INT);
$mform->addElement('hidden', 'deleteitem');
$mform->setType('deleteitem', PARAM_INT);
$mform->addElement('hidden', 'confirmdelete');
$mform->setType('confirmdelete', PARAM_INT);
//-------------------------------------------------------------------------------
// buttons
$this->add_action_buttons(true, get_string('yes'));
}
}
+16 -255
View File
@@ -35,57 +35,19 @@ if (($formdata = data_submitted()) AND !confirm_sesskey()) {
}
$do_show = optional_param('do_show', 'edit', PARAM_ALPHA);
$moveupitem = optional_param('moveupitem', false, PARAM_INT);
$movedownitem = optional_param('movedownitem', false, PARAM_INT);
$moveitem = optional_param('moveitem', false, PARAM_INT);
$movehere = optional_param('movehere', false, PARAM_INT);
$switchitemrequired = optional_param('switchitemrequired', false, PARAM_INT);
$current_tab = $do_show;
$url = new moodle_url('/mod/feedback/edit.php', array('id'=>$id, 'do_show'=>$do_show));
if (! $cm = get_coursemodule_from_id('feedback', $id)) {
print_error('invalidcoursemodule');
}
if (! $course = $DB->get_record('course', array('id'=>$cm->course))) {
print_error('coursemisconf');
}
if (! $feedback = $DB->get_record('feedback', array('id'=>$cm->instance))) {
print_error('invalidcoursemodule');
}
list($course, $cm) = get_course_and_cm_from_cmid($id, 'feedback');
$context = context_module::instance($cm->id);
require_login($course, true, $cm);
require_login($course, false, $cm);
require_capability('mod/feedback:edititems', $context);
//Move up/down items
if ($moveupitem) {
$item = $DB->get_record('feedback_item', array('id'=>$moveupitem));
feedback_moveup_item($item);
}
if ($movedownitem) {
$item = $DB->get_record('feedback_item', array('id'=>$movedownitem));
feedback_movedown_item($item);
}
//Moving of items
if ($movehere && isset($SESSION->feedback->moving->movingitem)) {
$item = $DB->get_record('feedback_item', array('id'=>$SESSION->feedback->moving->movingitem));
feedback_move_item($item, intval($movehere));
$moveitem = false;
}
if ($moveitem) {
$item = $DB->get_record('feedback_item', array('id'=>$moveitem));
$SESSION->feedback->moving->shouldmoving = 1;
$SESSION->feedback->moving->movingitem = $moveitem;
} else {
unset($SESSION->feedback->moving);
}
$feedback = $PAGE->activityrecord;
$feedbackstructure = new mod_feedback_structure($feedback, $cm);
if ($switchitemrequired) {
$item = $DB->get_record('feedback_item', array('id'=>$switchitemrequired));
@@ -156,15 +118,10 @@ echo $OUTPUT->heading(format_string($feedback->name));
/// print the tabs
require('tabs.php');
/// Print the main part of the page.
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
// Print the main part of the page.
///////////////////////////////////////////////////////////////////////////
///Print the template-section.
///////////////////////////////////////////////////////////////////////////
if ($do_show == 'templates') {
// Print the template-section.
$use_template_form->display();
if ($cancreatetemplates) {
@@ -187,218 +144,22 @@ if ($do_show == 'templates') {
</p>';
}
}
///////////////////////////////////////////////////////////////////////////
///Print the Item-Edit-section.
///////////////////////////////////////////////////////////////////////////
if ($do_show == 'edit') {
$select = new single_select(new moodle_url('/mod/feedback/edit_item.php', array('cmid' => $id, 'position' => $lastposition)),
if ($do_show == 'edit') {
// Print the Item-Edit-section.
$select = new single_select(new moodle_url('/mod/feedback/edit_item.php',
array('cmid' => $id, 'position' => $lastposition, 'sesskey' => sesskey())),
'typ', feedback_load_feedback_items_options());
$select->label = get_string('add_item', 'mod_feedback');
echo $OUTPUT->render($select);
if (is_array($feedbackitems)) {
$itemnr = 0;
$align = right_to_left() ? 'right' : 'left';
$helpbutton = $OUTPUT->help_icon('preview', 'feedback');
echo $OUTPUT->heading(get_string('preview', 'feedback').$helpbutton, 3);
if (isset($SESSION->feedback->moving) AND $SESSION->feedback->moving->shouldmoving == 1) {
$anker = '<a href="edit.php?id='.$id.'">';
$anker .= get_string('cancel_moving', 'feedback');
$anker .= '</a>';
echo $OUTPUT->heading($anker);
}
//Check, if there exists required-elements.
$params = array('feedback' => $feedback->id, 'required' => 1);
$countreq = $DB->count_records('feedback_item', $params);
if ($countreq > 0) {
echo '<div class="fdescription required">';
echo get_string('somefieldsrequired', 'form', '<img alt="'.get_string('requiredelement', 'form').
'" src="'.$OUTPUT->pix_url('req') .'" class="req" />');
echo '</div>';
}
//Use list instead a table
echo $OUTPUT->box_start('feedback_items');
if (isset($SESSION->feedback->moving) AND $SESSION->feedback->moving->shouldmoving == 1) {
$moveposition = 1;
$movehereurl = new moodle_url($url, array('movehere'=>$moveposition));
//Only shown if shouldmoving = 1
echo $OUTPUT->box_start('feedback_item_box_'.$align.' clipboard');
$buttonlink = $movehereurl->out();
$strbutton = get_string('move_here', 'feedback');
$src = $OUTPUT->pix_url('movehere');
echo '<a title="'.$strbutton.'" href="'.$buttonlink.'">
<img class="movetarget" alt="'.$strbutton.'" src="'.$src.'" />
</a>';
echo $OUTPUT->box_end();
}
//Print the inserted items
$itempos = 0;
echo '<div id="feedback_dragarea">'; //The container for the dragging area
echo '<ul id="feedback_draglist">'; //The list what includes the draggable items
foreach ($feedbackitems as $feedbackitem) {
$itempos++;
//Hiding the item to move
if (isset($SESSION->feedback->moving)) {
if ($SESSION->feedback->moving->movingitem == $feedbackitem->id) {
continue;
}
}
//Here come the draggable items, each one in a single li-element.
echo '<li class="feedback_itemlist generalbox" id="feedback_item_'.$feedbackitem->id.'">';
echo '<span class="spinnertest"> </span>';
if ($feedbackitem->dependitem > 0) {
$dependstyle = ' feedback_depend';
} else {
$dependstyle = '';
}
echo $OUTPUT->box_start('feedback_item_box_'.$align.$dependstyle,
'feedback_item_box_'.$feedbackitem->id);
//Items without value only are labels
if ($feedbackitem->hasvalue == 1 AND $feedback->autonumbering) {
$itemnr++;
echo $OUTPUT->box_start('feedback_item_number_'.$align);
echo $itemnr;
echo $OUTPUT->box_end();
}
echo $OUTPUT->box_start('box boxalign_'.$align);
echo $OUTPUT->box_start('feedback_item_commands_'.$align);
echo '<span class="feedback_item_commands position">';
echo '('.get_string('position', 'feedback').':'.$itempos .')';
echo '</span>';
//Print the moveup-button
if ($feedbackitem->position > 1) {
echo '<span class="feedback_item_command_moveup">';
$moveupurl = new moodle_url($url, array('moveupitem'=>$feedbackitem->id));
$buttonlink = $moveupurl->out();
$strbutton = get_string('moveup_item', 'feedback');
echo '<a class="icon up" title="'.$strbutton.'" href="'.$buttonlink.'">
<img alt="'.$strbutton.'" src="'.$OUTPUT->pix_url('t/up') . '" />
</a>';
echo '</span>';
}
//Print the movedown-button
if ($feedbackitem->position < $lastposition - 1) {
echo '<span class="feedback_item_command_movedown">';
$urlparams = array('movedownitem'=>$feedbackitem->id);
$movedownurl = new moodle_url($url, $urlparams);
$buttonlink = $movedownurl->out();
$strbutton = get_string('movedown_item', 'feedback');
echo '<a class="icon down" title="'.$strbutton.'" href="'.$buttonlink.'">
<img alt="'.$strbutton.'" src="'.$OUTPUT->pix_url('t/down') . '" />
</a>';
echo '</span>';
}
//Print the move-button
if (count($feedbackitems) > 1) {
echo '<span class="feedback_item_command_move">';
$moveurl = new moodle_url($url, array('moveitem'=>$feedbackitem->id));
$buttonlink = $moveurl->out();
$strbutton = get_string('move_item', 'feedback');
echo '<a class="editing_move" title="'.$strbutton.'" href="'.$buttonlink.'">
<img alt="'.$strbutton.'" src="'.$OUTPUT->pix_url('t/move') . '" />
</a>';
echo '</span>';
}
//Print the button to edit the item
if ($feedbackitem->typ != 'pagebreak') {
echo '<span class="feedback_item_command_edit">';
$editurl = new moodle_url('/mod/feedback/edit_item.php');
$editurl->params(array('do_show'=>$do_show,
'cmid'=>$id,
'id'=>$feedbackitem->id,
'typ'=>$feedbackitem->typ));
// In edit_item.php the param id is used for the itemid
// and the cmid is the id to get the module.
$buttonlink = $editurl->out();
$strbutton = get_string('edit_item', 'feedback');
echo '<a class="editing_update" title="'.$strbutton.'" href="'.$buttonlink.'">
<img alt="'.$strbutton.'" src="'.$OUTPUT->pix_url('t/edit') . '" />
</a>';
echo '</span>';
}
//Print the toggle-button to switch required yes/no
if ($feedbackitem->hasvalue == 1) {
echo '<span class="feedback_item_command_toggle">';
if ($feedbackitem->required == 1) {
$buttontitle = get_string('switch_item_to_not_required', 'feedback');
$buttonimg = $OUTPUT->pix_url('required', 'feedback');
} else {
$buttontitle = get_string('switch_item_to_required', 'feedback');
$buttonimg = $OUTPUT->pix_url('notrequired', 'feedback');
}
$urlparams = array('switchitemrequired'=>$feedbackitem->id);
$requiredurl = new moodle_url($url, $urlparams);
$buttonlink = $requiredurl->out();
echo '<a class="icon '.
'feedback_switchrequired" '.
'title="'.$buttontitle.'" '.
'href="'.$buttonlink.'">'.
'<img alt="'.$buttontitle.'" src="'.$buttonimg.'" />'.
'</a>';
echo '</span>';
}
//Print the delete-button
echo '<span class="feedback_item_command_toggle">';
$deleteitemurl = new moodle_url('/mod/feedback/delete_item.php');
$deleteitemurl->params(array('id'=>$id,
'do_show'=>$do_show,
'deleteitem'=>$feedbackitem->id));
$buttonlink = $deleteitemurl->out();
$strbutton = get_string('delete_item', 'feedback');
$src = $OUTPUT->pix_url('t/delete');
echo '<a class="icon delete" title="'.$strbutton.'" href="'.$buttonlink.'">
<img alt="'.$strbutton.'" src="'.$src.'" />
</a>';
echo '</span>';
echo $OUTPUT->box_end();
if ($feedbackitem->typ != 'pagebreak') {
feedback_print_item_preview($feedbackitem);
} else {
echo $OUTPUT->box_start('feedback_pagebreak');
echo get_string('pagebreak', 'feedback').'<hr class="feedback_pagebreak" />';
echo $OUTPUT->box_end();
}
echo $OUTPUT->box_end();
echo $OUTPUT->box_end();
echo '<div class="clearer">&nbsp;</div>';
echo '</li>';
//Print out the target box if we ar moving an item
if (isset($SESSION->feedback->moving) AND $SESSION->feedback->moving->shouldmoving == 1) {
echo '<li>';
$moveposition++;
$movehereurl->param('movehere', $moveposition);
echo $OUTPUT->box_start('clipboard'); //Only shown if shouldmoving = 1
$buttonlink = $movehereurl->out();
$strbutton = get_string('move_here', 'feedback');
$src = $OUTPUT->pix_url('movehere');
echo '<a title="'.$strbutton.'" href="'.$buttonlink.'">
<img class="movetarget" alt="'.$strbutton.'" src="'.$src.'" />
</a>';
echo $OUTPUT->box_end();
echo '</li>';
}
}
echo $OUTPUT->box_end();
echo '</ul>';
echo '</div>';
} else {
echo $OUTPUT->box(get_string('no_items_available_yet', 'feedback'),
'generalbox boxaligncenter');
}
$form = new mod_feedback_complete_form(mod_feedback_complete_form::MODE_EDIT,
$feedbackstructure, 'feedback_edit_form');
echo '<div id="feedback_dragarea">'; // The container for the dragging area.
$form->display();
echo '</div>';
}
/// Finish the page
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
echo $OUTPUT->footer();
+31 -53
View File
@@ -27,53 +27,36 @@ require_once("lib.php");
feedback_init_feedback_session();
$cmid = required_param('cmid', PARAM_INT);
$typ = optional_param('typ', false, PARAM_ALPHA);
$id = optional_param('id', false, PARAM_INT);
$action = optional_param('action', false, PARAM_ALPHA);
$editurl = new moodle_url('/mod/feedback/edit.php', array('id'=>$cmid));
if (!$typ) {
redirect($editurl->out(false));
$itemid = optional_param('id', false, PARAM_INT);
if (!$itemid) {
$cmid = required_param('cmid', PARAM_INT);
$typ = required_param('typ', PARAM_ALPHA);
}
$url = new moodle_url('/mod/feedback/edit_item.php', array('cmid'=>$cmid));
if ($typ !== false) {
$url->param('typ', $typ);
if ($itemid) {
$item = $DB->get_record('feedback_item', array('id' => $itemid), '*', MUST_EXIST);
list($course, $cm) = get_course_and_cm_from_instance($item->feedback, 'feedback');
$url = new moodle_url('/mod/feedback/edit_item.php', array('id' => $itemid));
$typ = $item->typ;
} else {
$item = null;
list($course, $cm) = get_course_and_cm_from_cmid($cmid, 'feedback');
$url = new moodle_url('/mod/feedback/edit_item.php', array('cmid' => $cm->id, 'typ' => $typ));
$item = (object)['id' => null, 'position' => -1, 'typ' => $typ, 'options' => ''];
}
if ($id !== false) {
$url->param('id', $id);
}
$PAGE->set_url($url);
// set up some general variables
if (($formdata = data_submitted()) AND !confirm_sesskey()) {
print_error('invalidsesskey');
}
if (! $cm = get_coursemodule_from_id('feedback', $cmid)) {
print_error('invalidcoursemodule');
}
if (! $course = $DB->get_record("course", array("id"=>$cm->course))) {
print_error('coursemisconf');
}
if (! $feedback = $DB->get_record("feedback", array("id"=>$cm->instance))) {
print_error('invalidcoursemodule');
}
$context = context_module::instance($cm->id);
require_login($course, true, $cm);
$context = context_module::instance($cm->id);
require_capability('mod/feedback:edititems', $context);
$feedback = $PAGE->activityrecord;
//if the typ is pagebreak so the item will be saved directly
if ($typ == 'pagebreak') {
$editurl = new moodle_url('/mod/feedback/edit.php', array('id' => $cm->id));
$PAGE->set_url($url);
// If the typ is pagebreak so the item will be saved directly.
if (!$item->id && $typ === 'pagebreak') {
require_sesskey();
feedback_create_pagebreak($feedback->id);
redirect($editurl->out(false));
exit;
@@ -81,17 +64,8 @@ if ($typ == 'pagebreak') {
//get the existing item or create it
// $formdata->itemid = isset($formdata->itemid) ? $formdata->itemid : NULL;
if ($id and $item = $DB->get_record('feedback_item', array('id'=>$id))) {
$typ = $item->typ;
} else {
$item = new stdClass();
$item->id = null;
$item->position = -1;
if (!$typ) {
print_error('typemissing', 'feedback', $editurl->out(false));
}
$item->typ = $typ;
$item->options = '';
if (!$typ || !file_exists($CFG->dirroot.'/mod/feedback/item/'.$typ.'/lib.php')) {
print_error('typemissing', 'feedback', $editurl->out(false));
}
require_once($CFG->dirroot.'/mod/feedback/item/'.$typ.'/lib.php');
@@ -101,13 +75,13 @@ $itemobj = feedback_get_item_class($typ);
$itemobj->build_editform($item, $feedback, $cm);
if ($itemobj->is_cancelled()) {
redirect($editurl->out(false));
redirect($editurl);
exit;
}
if ($itemobj->get_data()) {
if ($item = $itemobj->save_item()) {
feedback_move_item($item, $item->position);
redirect($editurl->out(false));
redirect($editurl);
}
}
@@ -116,6 +90,8 @@ if ($itemobj->get_data()) {
$strfeedbacks = get_string("modulenameplural", "feedback");
$strfeedback = get_string("modulename", "feedback");
navigation_node::override_active_url(new moodle_url('/mod/feedback/edit.php',
array('id' => $cm->id, 'do_show' => 'edit')));
if ($item->id) {
$PAGE->navbar->add(get_string('edit_item', 'feedback'));
} else {
@@ -129,6 +105,8 @@ echo $OUTPUT->header();
echo $OUTPUT->heading(format_string($feedback->name));
/// print the tabs
$current_tab = 'edit';
$id = $cm->id;
require('tabs.php');
//print errormsg
+26
View File
@@ -1,2 +1,28 @@
cancel_moving,mod_feedback
cannotunmap,mod_feedback
cannotmapfeedback,mod_feedback
completed,mod_feedback
line_values,mod_feedback
mapcourses_help,mod_feedback
max_args_exceeded,mod_feedback
movedown_item,mod_feedback
move_here,mod_feedback
moveup_item,mod_feedback
notavailable,mod_feedback
not_completed_yet,mod_feedback
parameters_missing,mod_feedback
picture,mod_feedback
picture_file_list,mod_feedback
picture_values,mod_feedback
preview,mod_feedback
preview_help,mod_feedback
radiorated,mod_feedback
radiobutton,mod_feedback
radiobutton_rated,mod_feedback
relateditemsdeleted,mod_feedback
separator_decimal,mod_feedback
separator_thousand,mod_feedback
saving_failed_because_missing_or_false_values,mod_feedback
switch_group,mod_feedback
viewcompleted,mod_feedback
viewcompleted_help,mod_feedback
+32 -30
View File
@@ -37,11 +37,8 @@ $string['autonumbering'] = 'Auto number questions';
$string['autonumbering_help'] = 'Enables or disables automated numbers for each question';
$string['average'] = 'Average';
$string['bold'] = 'Bold';
$string['cancel_moving'] = 'Cancel moving';
$string['cannotaccess'] = 'You can only access this feedback from a course';
$string['cannotmapfeedback'] = 'Database problem, unable to map feedback to course';
$string['cannotsavetempl'] = 'saving templates is not allowed';
$string['cannotunmap'] = 'Database problem, unable to unmap';
$string['captcha'] = 'Captcha';
$string['captchanotset'] = 'Captcha hasn\'t been set.';
$string['completed_feedbacks'] = 'Submitted answers';
@@ -59,6 +56,7 @@ $string['creating_templates'] = 'Save these questions as a new template';
$string['delete_entry'] = 'Delete entry';
$string['delete_item'] = 'Delete question';
$string['delete_old_items'] = 'Delete old items';
$string['delete_pagebreak'] = 'Delete page break';
$string['delete_template'] = 'Delete template';
$string['delete_templates'] = 'Delete template...';
$string['depending'] = 'Dependencies';
@@ -145,7 +143,6 @@ $string['item_label'] = 'Label';
$string['item_name'] = 'Question';
$string['label'] = 'Label';
$string['labelcontents'] = 'Contents';
$string['line_values'] = 'Rating';
$string['mapcourseinfo'] = 'This is a site-wide feedback that is available to all courses using the feedback block. You can however limit the courses to which it will appear by mapping them. Search the course and map it to this feedback.';
$string['mapcoursenone'] = 'No courses mapped. Feedback available to all courses';
$string['mapcourse'] = 'Map feedback to courses';
@@ -154,7 +151,6 @@ and will appear in all courses using the feedback block. You can force the feedb
$string['mapcourses'] = 'Map feedback to courses';
$string['mappedcourses'] = 'Mapped courses';
$string['mappingchanged'] = 'Course mapping has been changed';
$string['max_args_exceeded'] = 'Max 6 arguments can be handled, too many arguments for';
$string['minimal'] = 'minimum';
$string['maximal'] = 'maximum';
$string['messageprovider:message'] = 'Feedback reminder';
@@ -173,10 +169,7 @@ Feedback activities may be used
* For anti-bullying surveys in which students can report incidents anonymously';
$string['modulename_link'] = 'mod/feedback/view';
$string['modulenameplural'] = 'Feedback';
$string['movedown_item'] = 'Move this question down';
$string['move_here'] = 'Move here';
$string['move_item'] = 'Move this question';
$string['moveup_item'] = 'Move this question up';
$string['multichoice'] = 'Multiple choice';
$string['multichoicerated'] = 'Multiple choice (rated)';
$string['multichoicetype'] = 'Multiple choice type';
@@ -193,11 +186,10 @@ $string['no_items_available_yet'] = 'No questions have been set up yet';
$string['non_anonymous'] = 'User\'s name will be logged and shown with answers';
$string['non_anonymous_entries'] = 'Non anonymous entries ({$a})';
$string['non_respondents_students'] = 'Non respondents students ({$a})';
$string['notavailable'] = 'this feedback is not available';
$string['not_completed_yet'] = 'Not completed yet';
$string['not_started'] = 'not started';
$string['no_templates_available_yet'] = 'No templates available yet';
$string['not_selected'] = 'Not selected';
$string['numberoutofrange'] = 'Number out of range';
$string['numeric'] = 'Numeric answer';
$string['numeric_range_from'] = 'Range from';
$string['numeric_range_to'] = 'Range to';
@@ -210,27 +202,17 @@ $string['page'] = 'Page';
$string['page-mod-feedback-x'] = 'Any feedback module page';
$string['page_after_submit'] = 'Completion message';
$string['pagebreak'] = 'Page break';
$string['parameters_missing'] = 'Parameters missing from';
$string['picture'] = 'Picture';
$string['picture_file_list'] = 'List of pictures';
$string['picture_values'] = 'Choose one or more<br />picture files from the list:';
$string['pluginadministration'] = 'Feedback administration';
$string['pluginname'] = 'Feedback';
$string['position'] = 'Position';
$string['preview'] = 'Preview';
$string['preview_help'] = 'In the preview you can change the order of questions.';
$string['previous_page'] = 'Previous page';
$string['public'] = 'Public';
$string['question'] = 'Question';
$string['questionandsubmission'] = 'Question and submission settings';
$string['questions'] = 'Questions';
$string['radio'] = 'Multiple choice - single answer';
$string['radiobutton'] = 'Multiple choice - single answer allowed (radio buttons)';
$string['radiobutton_rated'] = 'Radiobutton (rated)';
$string['radiorated'] = 'Radiobutton (rated)';
$string['radio_values'] = 'Responses';
$string['ready_feedbacks'] = 'Ready feedbacks';
$string['relateditemsdeleted'] = 'All your user\'s responses for this question will also be deleted';
$string['required'] = 'Required';
$string['resetting_data'] = 'Reset feedback responses';
$string['resetting_feedbacks'] = 'Resetting feedbacks';
@@ -242,7 +224,6 @@ $string['save_as_new_template'] = 'Save as new template';
$string['save_entries'] = 'Submit your answers';
$string['save_item'] = 'Save question';
$string['saving_failed'] = 'Saving failed';
$string['saving_failed_because_missing_or_false_values'] = 'Saving failed because missing or false values';
$string['search:activity'] = 'Feedback activities';
$string['search_course'] = 'Search course';
$string['searchcourses'] = 'Search courses';
@@ -250,8 +231,6 @@ $string['searchcourses_help'] = 'Search for the code or name of the course(s) th
$string['selected_dump'] = 'Selected indexes of $SESSION variable are dumped below:';
$string['send'] = 'send';
$string['send_message'] = 'send message';
$string['separator_decimal'] = '.';
$string['separator_thousand'] = ',';
$string['show_all'] = 'Show all';
$string['show_analysepage_after_submit'] = 'Show analysis page';
$string['show_entries'] = 'Show responses';
@@ -263,9 +242,8 @@ $string['start'] = 'Start';
$string['started'] = 'started';
$string['stop'] = 'End';
$string['subject'] = 'Subject';
$string['switch_group'] = 'Switch group';
$string['switch_item_to_not_required'] = 'switch to: answer not required';
$string['switch_item_to_required'] = 'switch to: answer required';
$string['switch_item_to_not_required'] = 'Set as not required';
$string['switch_item_to_required'] = 'Set as required';
$string['template'] = 'Template';
$string['templates'] = 'Templates';
$string['template_deleted'] = 'Template deleted';
@@ -282,15 +260,39 @@ $string['typemissing'] = 'missing value "type"';
$string['update_item'] = 'Save changes to question';
$string['url_for_continue'] = 'Link to next activity';
$string['url_for_continue_help'] = 'After submitting the feedback, a continue button is displayed, which links to the course page. Alternatively, it may link to the next activity if the URL of the activity is entered here.';
$string['use_one_line_for_each_value'] = '<br />Use one line for each answer!';
$string['use_one_line_for_each_value'] = 'Use one line for each answer!';
$string['use_this_template'] = 'Use this template';
$string['using_templates'] = 'Use a template';
$string['vertical'] = 'vertical';
$string['viewcompleted'] = 'completed feedbacks';
$string['viewcompleted_help'] = 'You may view completed feedback forms, searchable by course and/or by question.
Feedback responses may be exported to Excel.';
// Deprecated since Moodle 3.0.
$string['completed'] = 'completed';
// Deprecated since Moodle 3.1.
$string['cannotmapfeedback'] = 'Database problem, unable to map feedback to course';
$string['line_values'] = 'Rating';
$string['mapcourses_help'] = 'Once you have selected the relevant course(s) from your search,
you can associate them with this feedback using map course(s). Multiple courses may be selected by holding down the Apple or Ctrl key whilst clicking on the course names. A course may be disassociated from a feedback at any time.';
$string['max_args_exceeded'] = 'Max 6 arguments can be handled, too many arguments for';
$string['cancel_moving'] = 'Cancel moving';
$string['movedown_item'] = 'Move this question down';
$string['move_here'] = 'Move here';
$string['moveup_item'] = 'Move this question up';
$string['not_completed_yet'] = 'Not completed yet';
$string['notavailable'] = 'this feedback is not available';
$string['saving_failed_because_missing_or_false_values'] = 'Saving failed because missing or false values';
$string['cannotunmap'] = 'Database problem, unable to unmap';
$string['viewcompleted'] = 'completed feedbacks';
$string['viewcompleted_help'] = 'You may view completed feedback forms, searchable by course and/or by question.
Feedback responses may be exported to Excel.';
$string['parameters_missing'] = 'Parameters missing from';
$string['picture'] = 'Picture';
$string['picture_file_list'] = 'List of pictures';
$string['picture_values'] = 'Choose one or more<br />picture files from the list:';
$string['preview'] = 'Preview';
$string['preview_help'] = 'In the preview you can change the order of questions.';
$string['switch_group'] = 'Switch group';
$string['separator_decimal'] = '.';
$string['separator_thousand'] = ',';
$string['relateditemsdeleted'] = 'All your user\'s responses for this question will also be deleted';
$string['radiorated'] = 'Radiobutton (rated)';
$string['radiobutton'] = 'Multiple choice - single answer allowed (radio buttons)';
$string['radiobutton_rated'] = 'Radiobutton (rated)';
+143 -226
View File
@@ -301,9 +301,6 @@ function feedback_delete_instance($id) {
}
}
//deleting the referenced tracking data
$DB->delete_records('feedback_tracking', array('feedback'=>$id));
//deleting the completeds
$DB->delete_records("feedback_completed", array("feedback"=>$id));
@@ -525,7 +522,7 @@ function feedback_get_completion_state($course, $cm, $userid, $type) {
// If completion option is enabled, evaluate it and return true/false
if ($feedback->completionsubmit) {
$params = array('userid'=>$userid, 'feedback'=>$feedback->id);
return $DB->record_exists('feedback_tracking', $params);
return $DB->record_exists('feedback_completed', $params);
} else {
// Completion option is not enabled so just return $type
return $type;
@@ -645,7 +642,7 @@ function feedback_reset_userdata($data) {
//reset the selected feedbacks
foreach ($resetfeedbacks as $id) {
$feedback = $DB->get_record('feedback', array('id'=>$id));
feedback_delete_all_completeds($id);
feedback_delete_all_completeds($feedback);
$status[] = array('component'=>$componentstr.':'.$feedback->name,
'item'=>get_string('resetting_data', 'feedback'),
'error'=>false);
@@ -826,11 +823,14 @@ function feedback_delete_course_module($id) {
/**
* returns the context-id related to the given coursemodule-id
*
* @deprecated since 3.1
* @staticvar object $context
* @param int $cmid the coursemodule-id
* @return object $context
*/
function feedback_get_context($cmid) {
debugging('Function feedback_get_context() is deprecated because it was not used.',
DEBUG_DEVELOPER);
static $context;
if (isset($context)) {
@@ -1024,31 +1024,6 @@ function feedback_get_complete_users($cm,
return $DB->get_records_sql($sql, $params, $startpage, $pagecount);
}
/**
* If there are any new responses to the anonymous feedback, re-shuffle all
* responses and assign response number to each of them.
*
* @param stdClass $feedback
*/
function feedback_shuffle_anonym_responses($feedback) {
global $DB;
$params = array('feedback' => $feedback->id,
'random_response' => 0,
'anonymous_response' => FEEDBACK_ANONYMOUS_YES);
if ($DB->count_records('feedback_completed', $params, 'random_response')) {
// Get all of the anonymous records, go through them and assign a response id.
unset($params['random_response']);
$feedbackcompleteds = $DB->get_records('feedback_completed', $params, 'id');
shuffle($feedbackcompleteds);
$num = 1;
foreach ($feedbackcompleteds as $compl) {
$compl->random_response = $num++;
$DB->update_record('feedback_completed', $compl);
}
}
}
/**
* get users which have the viewreports-capability
*
@@ -1277,8 +1252,6 @@ function feedback_items_from_template($feedback, $templateid, $deleteold = false
foreach ($feedbackitems as $item) {
feedback_delete_item($item->id, false);
}
//delete tracking-data
$DB->delete_records('feedback_tracking', array('feedback'=>$feedback->id));
$params = array('feedback'=>$feedback->id);
if ($completeds = $DB->get_records('feedback_completed', $params)) {
@@ -1386,9 +1359,8 @@ function feedback_get_template_list($course, $onlyownorpublic = '') {
/**
* load the lib.php from item-plugin-dir and returns the instance of the itemclass
*
* @global object
* @param object $item
* @return object the instanz of itemclass
* @param string $typ
* @return feedback_item_base the instance of itemclass
*/
function feedback_get_item_class($typ) {
global $CFG;
@@ -1485,11 +1457,13 @@ function feedback_get_depend_candidates_for_item($feedback, $item) {
/**
* creates a new item-record
*
* @global object
* @deprecated since 3.1
* @param object $data the data from edit_item_form
* @return int the new itemid
*/
function feedback_create_item($data) {
debugging('Function feedback_create_item() is deprecated because it was not used.',
DEBUG_DEVELOPER);
global $DB;
$item = new stdClass();
@@ -1799,57 +1773,43 @@ function feedback_move_item($moveitem, $pos) {
* prints the given item as a preview.
* each item-class has an own print_item_preview function implemented.
*
* @deprecated since Moodle 3.1
* @global object
* @param object $item the item what we want to print out
* @return void
*/
function feedback_print_item_preview($item) {
global $CFG;
if ($item->typ == 'pagebreak') {
return;
}
//get the instance of the item-class
$itemobj = feedback_get_item_class($item->typ);
$itemobj->print_item_preview($item);
debugging('Function feedback_print_item_preview() is deprecated and does nothing. '
. 'Items must implement complete_form_element()', DEBUG_DEVELOPER);
}
/**
* prints the given item in the completion form.
* each item-class has an own print_item_complete function implemented.
*
* @deprecated since Moodle 3.1
* @param object $item the item what we want to print out
* @param mixed $value the value
* @param boolean $highlightrequire if this set true and the value are false on completing so the item will be highlighted
* @return void
*/
function feedback_print_item_complete($item, $value = false, $highlightrequire = false) {
global $CFG;
if ($item->typ == 'pagebreak') {
return;
}
//get the instance of the item-class
$itemobj = feedback_get_item_class($item->typ);
$itemobj->print_item_complete($item, $value, $highlightrequire);
debugging('Function feedback_print_item_complete() is deprecated and does nothing. '
. 'Items must implement complete_form_element()', DEBUG_DEVELOPER);
}
/**
* prints the given item in the show entries page.
* each item-class has an own print_item_show_value function implemented.
*
* @deprecated since Moodle 3.1
* @param object $item the item what we want to print out
* @param mixed $value
* @return void
*/
function feedback_print_item_show_value($item, $value = false) {
global $CFG;
if ($item->typ == 'pagebreak') {
return;
}
//get the instance of the item-class
$itemobj = feedback_get_item_class($item->typ);
$itemobj->print_item_show_value($item, $value);
debugging('Function feedback_print_item_show_value() is deprecated and does nothing. '
. 'Items must implement complete_form_element()', DEBUG_DEVELOPER);
}
/**
@@ -1862,6 +1822,8 @@ function feedback_print_item_show_value($item, $value = false) {
*/
function feedback_set_tmp_values($feedbackcompleted) {
global $DB;
debugging('Function feedback_set_tmp_values() is deprecated and since it is '
. 'no longer used in mod_feedback', DEBUG_DEVELOPER);
//first we create a completedtmp
$tmpcpl = new stdClass();
@@ -1889,10 +1851,9 @@ function feedback_set_tmp_values($feedbackcompleted) {
* @global object
* @param object $feedbackcompletedtmp the temporary completed
* @param object $feedbackcompleted the target completed
* @param int $userid
* @return int the id of the completed
*/
function feedback_save_tmp_values($feedbackcompletedtmp, $feedbackcompleted, $userid) {
function feedback_save_tmp_values($feedbackcompletedtmp, $feedbackcompleted) {
global $DB;
$tmpcplid = $feedbackcompletedtmp->id;
@@ -1905,23 +1866,22 @@ function feedback_save_tmp_values($feedbackcompletedtmp, $feedbackcompleted, $us
} else {
$feedbackcompleted = clone($feedbackcompletedtmp);
$feedbackcompleted->id = '';
$feedbackcompleted->userid = $userid;
$feedbackcompleted->timemodified = time();
$feedbackcompleted->id = $DB->insert_record('feedback_completed', $feedbackcompleted);
}
$allitems = $DB->get_records('feedback_item', array('feedback' => $feedbackcompleted->feedback));
//save all the new values from feedback_valuetmp
//get all values of tmp-completed
$params = array('completed'=>$feedbackcompletedtmp->id);
if (!$values = $DB->get_records('feedback_valuetmp', $params)) {
return false;
}
$values = $DB->get_records('feedback_valuetmp', $params);
foreach ($values as $value) {
//check if there are depend items
$item = $DB->get_record('feedback_item', array('id'=>$value->item));
if ($item->dependitem > 0) {
if ($item->dependitem > 0 && isset($allitems[$item->dependitem])) {
$check = feedback_compare_item_value($tmpcplid,
$item->dependitem,
$allitems[$item->dependitem],
$item->dependvalue,
true);
} else {
@@ -1939,20 +1899,7 @@ function feedback_save_tmp_values($feedbackcompletedtmp, $feedbackcompleted, $us
// Trigger event for the delete action we performed.
$cm = get_coursemodule_from_instance('feedback', $feedbackcompleted->feedback);
$event = \mod_feedback\event\response_submitted::create(array(
'relateduserid' => $userid,
'objectid' => $feedbackcompleted->id,
'context' => context_module::instance($cm->id),
'anonymous' => ($feedbackcompleted->anonymous_response == FEEDBACK_ANONYMOUS_YES),
'other' => array(
'cmid' => $cm->id,
'instanceid' => $feedbackcompleted->feedback,
'anonymous' => $feedbackcompleted->anonymous_response // Deprecated.
)
));
$event->add_record_snapshot('feedback_completed', $feedbackcompleted);
$event = \mod_feedback\event\response_submitted::create_from_record($feedbackcompleted, $cm);
$event->trigger();
return $feedbackcompleted->id;
@@ -1961,13 +1908,17 @@ function feedback_save_tmp_values($feedbackcompletedtmp, $feedbackcompleted, $us
/**
* deletes the given temporary completed and all related temporary values
*
* @global object
* @deprecated since Moodle 3.1
*
* @param int $tmpcplid
* @return void
*/
function feedback_delete_completedtmp($tmpcplid) {
global $DB;
debugging('Function feedback_delete_completedtmp() is deprecated because it is no longer used',
DEBUG_DEVELOPER);
$DB->delete_records('feedback_valuetmp', array('completed'=>$tmpcplid));
$DB->delete_records('feedback_completedtmp', array('id'=>$tmpcplid));
}
@@ -2047,6 +1998,7 @@ function feedback_get_last_break_position($feedbackid) {
/**
* this returns the position where the user can continue the completing.
*
* @deprecated since Moodle 3.1
* @global object
* @global object
* @global object
@@ -2058,6 +2010,9 @@ function feedback_get_last_break_position($feedbackid) {
function feedback_get_page_to_continue($feedbackid, $courseid = false, $guestid = false) {
global $CFG, $USER, $DB;
debugging('Function feedback_get_page_to_continue() is deprecated and since it is '
. 'no longer used in mod_feedback', DEBUG_DEVELOPER);
//is there any break?
if (!$allbreaks = feedback_get_all_break_positions($feedbackid)) {
@@ -2112,12 +2067,13 @@ function feedback_get_page_to_continue($feedbackid, $courseid = false, $guestid
/**
* cleans the userinput while submitting the form.
*
* @deprecated since Moodle 3.1
* @param mixed $value
* @return mixed
*/
function feedback_clean_input_value($item, $value) {
$itemobj = feedback_get_item_class($item->typ);
return $itemobj->clean_input_value($value);
debugging('Function feedback_clean_input_value() is deprecated and does nothing. '
. 'Items must implement complete_form_element()', DEBUG_DEVELOPER);
}
/**
@@ -2126,16 +2082,20 @@ function feedback_clean_input_value($item, $value) {
* if there is already a completed and the userid is set so the values are updated.
* on all other things new value records will be created.
*
* @global object
* @param int $userid
* @deprecated since Moodle 3.1
*
* @param int $usrid
* @param boolean $tmp
* @return mixed false on error or the completeid
*/
function feedback_save_values($usrid, $tmp = false) {
global $DB;
$completedid = optional_param('completedid', 0, PARAM_INT);
debugging('Function feedback_save_values() was deprecated because it did not have '.
'enough arguments, was not suitable for non-temporary table and was taking '.
'data directly from input', DEBUG_DEVELOPER);
$completedid = optional_param('completedid', 0, PARAM_INT);
$tmpstr = $tmp ? 'tmp' : '';
$time = time();
$timemodified = mktime(0, 0, 0, date('m', $time), date('d', $time), date('Y', $time));
@@ -2155,13 +2115,18 @@ function feedback_save_values($usrid, $tmp = false) {
/**
* this saves the values from anonymous user such as guest on the main-site
*
* @global object
* @deprecated since Moodle 3.1
*
* @param string $guestid the unique guestidentifier
* @return mixed false on error or the completeid
*/
function feedback_save_guest_values($guestid) {
global $DB;
debugging('Function feedback_save_guest_values() was deprecated because it did not have '.
'enough arguments, was not suitable for non-temporary table and was taking '.
'data directly from input', DEBUG_DEVELOPER);
$completedid = optional_param('completedid', false, PARAM_INT);
$timemodified = time();
@@ -2196,23 +2161,21 @@ function feedback_get_item_value($completedid, $itemid, $tmp = false) {
* this is used if a depend item is set.
* the value can come as temporary or as permanently value. the deciding is done by $tmp.
*
* @global object
* @global object
* @param int $completeid
* @param int $itemid
* @param int $completedid
* @param stdClass|int $item
* @param mixed $dependvalue
* @param boolean $tmp
* @param bool $tmp
* @return bool
*/
function feedback_compare_item_value($completedid, $itemid, $dependvalue, $tmp = false) {
global $DB, $CFG;
function feedback_compare_item_value($completedid, $item, $dependvalue, $tmp = false) {
global $DB;
$dbvalue = feedback_get_item_value($completedid, $itemid, $tmp);
if (is_int($item)) {
$item = $DB->get_record('feedback_item', array('id' => $item));
}
//get the class of the given item-typ
$item = $DB->get_record('feedback_item', array('id'=>$itemid));
$dbvalue = feedback_get_item_value($completedid, $item->id, $tmp);
//get the instance of the item-class
$itemobj = feedback_get_item_class($item->typ);
return $itemobj->compare_value($item, $dbvalue, $dependvalue); //true or false
}
@@ -2229,66 +2192,8 @@ function feedback_compare_item_value($completedid, $itemid, $dependvalue, $tmp =
* @return boolean
*/
function feedback_check_values($firstitem, $lastitem) {
global $DB, $CFG;
$feedbackid = optional_param('feedbackid', 0, PARAM_INT);
//get all items between the first- and lastitem
$select = "feedback = ?
AND position >= ?
AND position <= ?
AND hasvalue = 1";
$params = array($feedbackid, $firstitem, $lastitem);
if (!$feedbackitems = $DB->get_records_select('feedback_item', $select, $params)) {
//if no values are given so no values can be wrong ;-)
return true;
}
foreach ($feedbackitems as $item) {
//get the instance of the item-class
$itemobj = feedback_get_item_class($item->typ);
//the name of the input field of the completeform is given in a special form:
//<item-typ>_<item-id> eg. numeric_234
//this is the key to get the value for the correct item
$formvalname = $item->typ . '_' . $item->id;
if ($itemobj->value_is_array()) {
//get the raw value here. It is cleaned after that by the object itself
$value = optional_param_array($formvalname, null, PARAM_RAW);
} else {
//get the raw value here. It is cleaned after that by the object itself
$value = optional_param($formvalname, null, PARAM_RAW);
}
$value = $itemobj->clean_input_value($value);
// If the item is not visible due to its dependency so it shouldn't be required.
// Many thanks to Pau Ferrer Ocaña.
if ($item->dependitem > 0 AND $item->required == 1) {
$comparevalue = false;
if ($feedbackcompletedtmp = feedback_get_current_completed($item->feedback, true)) {
$comparevalue = feedback_compare_item_value($feedbackcompletedtmp->id,
$item->dependitem,
$item->dependvalue,
true);
}
if (!$comparevalue) {
$item->required = 0; // Override the required property.
}
}
//check if the value is set
if (is_null($value) AND $item->required == 1) {
return false;
}
//now we let check the value by the item-class
if (!$itemobj->check_value($value, $item)) {
return false;
}
}
//if no wrong values so we can return true
debugging('Function feedback_check_values() is deprecated and does nothing. '
. 'Items must implement complete_form_element()', DEBUG_DEVELOPER);
return true;
}
@@ -2296,7 +2201,8 @@ function feedback_check_values($firstitem, $lastitem) {
* this function create a complete-record and the related value-records.
* depending on the $tmp (true/false) the values are saved temporary or permanently
*
* @global object
* @deprecated since Moodle 3.1
*
* @param int $userid
* @param int $timemodified
* @param boolean $tmp
@@ -2306,9 +2212,9 @@ function feedback_check_values($firstitem, $lastitem) {
function feedback_create_values($usrid, $timemodified, $tmp = false, $guestid = false) {
global $DB;
$feedbackid = optional_param('feedbackid', false, PARAM_INT);
$anonymous_response = optional_param('anonymous_response', false, PARAM_INT);
$courseid = optional_param('courseid', false, PARAM_INT);
debugging('Function feedback_create_values() was deprecated because it did not have '.
'enough arguments, was not suitable for non-temporary table and was taking '.
'data directly from input', DEBUG_DEVELOPER);
$tmpstr = $tmp ? 'tmp' : '';
//first we create a new completed record
@@ -2339,10 +2245,10 @@ function feedback_create_values($usrid, $timemodified, $tmp = false, $guestid =
$keyname = $item->typ.'_'.$item->id;
if ($itemobj->value_is_array()) {
$itemvalue = optional_param_array($keyname, null, $itemobj->value_type());
if ($item->typ === 'multichoice') {
$itemvalue = optional_param_array($keyname, null, PARAM_INT);
} else {
$itemvalue = optional_param($keyname, null, $itemobj->value_type());
$itemvalue = optional_param($keyname, null, PARAM_NOTAGS);
}
if (is_null($itemvalue)) {
@@ -2374,6 +2280,10 @@ function feedback_create_values($usrid, $timemodified, $tmp = false, $guestid =
function feedback_update_values($completed, $tmp = false) {
global $DB;
debugging('Function feedback_update_values() was deprecated because it did not have '.
'enough arguments, was not suitable for non-temporary table and was taking '.
'data directly from input', DEBUG_DEVELOPER);
$courseid = optional_param('courseid', false, PARAM_INT);
$tmpstr = $tmp ? 'tmp' : '';
@@ -2394,10 +2304,10 @@ function feedback_update_values($completed, $tmp = false) {
$keyname = $item->typ.'_'.$item->id;
if ($itemobj->value_is_array()) {
$itemvalue = optional_param_array($keyname, null, $itemobj->value_type());
if ($item->typ === 'multichoice') {
$itemvalue = optional_param_array($keyname, null, PARAM_INT);
} else {
$itemvalue = optional_param($keyname, null, $itemobj->value_type());
$itemvalue = optional_param($keyname, null, PARAM_NOTAGS);
}
//is the itemvalue set (could be a subset of items because pagebreak)?
@@ -2516,19 +2426,15 @@ function feedback_get_group_values($item,
function feedback_is_already_submitted($feedbackid, $courseid = false) {
global $USER, $DB;
$params = array('userid'=>$USER->id, 'feedback'=>$feedbackid);
if (!$trackings = $DB->get_records_menu('feedback_tracking', $params, '', 'id, completed')) {
if (!isloggedin() || isguestuser()) {
return false;
}
$params = array('userid' => $USER->id, 'feedback' => $feedbackid);
if ($courseid) {
$select = 'completed IN ('.implode(',', $trackings).') AND course_id = ?';
if (!$values = $DB->get_records_select('feedback_value', $select, array($courseid))) {
return false;
}
$params['courseid'] = $courseid;
}
return true;
return $DB->record_exists('feedback_completed', $params);
}
/**
@@ -2536,9 +2442,7 @@ function feedback_is_already_submitted($feedbackid, $courseid = false) {
* by pagebreak or by multiple submit so the complete must be found.
* if the param $tmp is set true so all things are related to temporary completeds
*
* @global object
* @global object
* @global object
* @deprecated since Moodle 3.1
* @param int $feedbackid
* @param boolean $tmp
* @param int $courseid
@@ -2550,6 +2454,10 @@ function feedback_get_current_completed($feedbackid,
$courseid = false,
$guestid = false) {
debugging('Function feedback_get_current_completed() is deprecated. Please use either '.
'feedback_get_current_completed_tmp() or feedback_get_last_completed()',
DEBUG_DEVELOPER);
global $USER, $CFG, $DB;
$tmpstr = $tmp ? 'tmp' : '';
@@ -2674,18 +2582,32 @@ function feedback_get_completeds_group_count($feedback, $groupid = false, $cours
* deletes all completed-recordsets from a feedback.
* all related data such as values also will be deleted
*
* @global object
* @param int $feedbackid
* @param stdClass|int $feedback
* @param stdClass|cm_info $cm
* @param stdClass $course
* @return void
*/
function feedback_delete_all_completeds($feedbackid) {
function feedback_delete_all_completeds($feedback, $cm = null, $course = null) {
global $DB;
if (!$completeds = $DB->get_records('feedback_completed', array('feedback'=>$feedbackid))) {
if (is_int($feedback)) {
$feedback = $DB->get_record('feedback', array('id' => $feedback));
}
if (!$completeds = $DB->get_records('feedback_completed', array('feedback' => $feedback->id))) {
return;
}
if (!$course && !($course = $DB->get_record('course', array('id' => $feedback->course)))) {
return false;
}
if (!$cm && !($cm = get_coursemodule_from_instance('feedback', $feedback->id))) {
return false;
}
foreach ($completeds as $completed) {
feedback_delete_completed($completed->id);
feedback_delete_completed($completed, $feedback, $cm, $course);
}
}
@@ -2693,38 +2615,36 @@ function feedback_delete_all_completeds($feedbackid) {
* deletes a completed given by completedid.
* all related data such values or tracking data also will be deleted
*
* @global object
* @param int $completedid
* @param int|stdClass $completed
* @param stdClass $feedback
* @param stdClass|cm_info $cm
* @param stdClass $course
* @return boolean
*/
function feedback_delete_completed($completedid) {
function feedback_delete_completed($completed, $feedback = null, $cm = null, $course = null) {
global $DB, $CFG;
require_once($CFG->libdir.'/completionlib.php');
if (!$completed = $DB->get_record('feedback_completed', array('id'=>$completedid))) {
if (!isset($completed->id)) {
if (!$completed = $DB->get_record('feedback_completed', array('id' => $completed))) {
return false;
}
}
if (!$feedback && !($feedback = $DB->get_record('feedback', array('id' => $completed->feedback)))) {
return false;
}
if (!$feedback = $DB->get_record('feedback', array('id'=>$completed->feedback))) {
if (!$course && !($course = $DB->get_record('course', array('id' => $feedback->course)))) {
return false;
}
if (!$course = $DB->get_record('course', array('id'=>$feedback->course))) {
return false;
}
if (!$cm = get_coursemodule_from_instance('feedback', $feedback->id)) {
if (!$cm && !($cm = get_coursemodule_from_instance('feedback', $feedback->id))) {
return false;
}
//first we delete all related values
$DB->delete_records('feedback_value', array('completed'=>$completed->id));
//now we delete all tracking data
$params = array('completed'=>$completed->id, 'feedback'=>$completed->feedback);
if ($tracking = $DB->get_record('feedback_tracking', $params)) {
$DB->delete_records('feedback_tracking', array('completed'=>$completed->id));
}
$DB->delete_records('feedback_value', array('completed' => $completed->id));
// Update completion state
$completion = new completion_info($course);
@@ -2732,25 +2652,10 @@ function feedback_delete_completed($completedid) {
$completion->update_state($cm, COMPLETION_INCOMPLETE, $completed->userid);
}
// Last we delete the completed-record.
$return = $DB->delete_records('feedback_completed', array('id'=>$completed->id));
$return = $DB->delete_records('feedback_completed', array('id' => $completed->id));
// Trigger event for the delete action we performed.
$event = \mod_feedback\event\response_deleted::create(array(
'relateduserid' => $completed->userid,
'objectid' => $completedid,
'courseid' => $course->id,
'context' => context_module::instance($cm->id),
'anonymous' => ($completed->anonymous_response == FEEDBACK_ANONYMOUS_YES),
'other' => array(
'cmid' => $cm->id,
'instanceid' => $feedback->id,
'anonymous' => $completed->anonymous_response) // Deprecated.
));
$event->add_record_snapshot('feedback_completed', $completed);
$event->add_record_snapshot('course', $course);
$event->add_record_snapshot('feedback', $feedback);
$event = \mod_feedback\event\response_deleted::create_from_record($completed, $cm, $feedback);
$event->trigger();
return $return;
@@ -2765,12 +2670,14 @@ function feedback_delete_completed($completedid) {
/**
* checks if the course and the feedback is in the table feedback_sitecourse_map.
*
* @global object
* @deprecated since 3.1
* @param int $feedbackid
* @param int $courseid
* @return int the count of records
*/
function feedback_is_course_in_sitecourse_map($feedbackid, $courseid) {
debugging('Function feedback_is_course_in_sitecourse_map() is deprecated because it was not used.',
DEBUG_DEVELOPER);
global $DB;
$params = array('feedbackid'=>$feedbackid, 'courseid'=>$courseid);
return $DB->count_records('feedback_sitecourse_map', $params);
@@ -2779,11 +2686,13 @@ function feedback_is_course_in_sitecourse_map($feedbackid, $courseid) {
/**
* checks if the feedback is in the table feedback_sitecourse_map.
*
* @global object
* @deprecated since 3.1
* @param int $feedbackid
* @return boolean
*/
function feedback_is_feedback_in_sitecourse_map($feedbackid) {
debugging('Function feedback_is_feedback_in_sitecourse_map() is deprecated because it was not used.',
DEBUG_DEVELOPER);
global $DB;
return $DB->record_exists('feedback_sitecourse_map', array('feedbackid'=>$feedbackid));
}
@@ -2895,11 +2804,14 @@ function feedback_update_sitecourse_map($feedback, $courses) {
* it shouldn't be called all too often
* a good place for it could be the mapcourse.php or unmapcourse.php
*
* @deprecated since 3.1
* @global object
* @return void
*/
function feedback_clean_up_sitecourse_map() {
global $DB;
debugging('Function feedback_clean_up_sitecourse_map() is deprecated because it was not used.',
DEBUG_DEVELOPER);
$maps = $DB->get_records('feedback_sitecourse_map');
foreach ($maps as $map) {
@@ -2925,6 +2837,7 @@ function feedback_clean_up_sitecourse_map() {
/**
* prints the option items of a selection-input item (dropdownlist).
* @deprecated since 3.1
* @param int $startval the first value of the list
* @param int $endval the last value of the list
* @param int $selectval which item should be selected
@@ -2932,6 +2845,8 @@ function feedback_clean_up_sitecourse_map() {
* @return void
*/
function feedback_print_numeric_option_list($startval, $endval, $selectval = '', $interval = 1) {
debugging('Function feedback_print_numeric_option_list() is deprecated because it was not used.',
DEBUG_DEVELOPER);
for ($i = $startval; $i <= $endval; $i += $interval) {
if ($selectval == ($i)) {
$selected = 'selected="selected"';
@@ -2952,17 +2867,19 @@ function feedback_print_numeric_option_list($startval, $endval, $selectval = '',
* @param object $cm the coursemodule-record
* @param object $feedback
* @param object $course
* @param int $userid
* @param stdClass|int $user
* @return void
*/
function feedback_send_email($cm, $feedback, $course, $userid) {
function feedback_send_email($cm, $feedback, $course, $user) {
global $CFG, $DB;
if ($feedback->email_notification == 0) { // No need to do anything
return;
}
$user = $DB->get_record('user', array('id'=>$userid));
if (is_int($user)) {
$user = $DB->get_record('user', array('id' => $user));
}
if (isset($cm->groupmode) && empty($course->groupmodeforce)) {
$groupmode = $cm->groupmode;
@@ -2976,7 +2893,7 @@ function feedback_send_email($cm, $feedback, $course, $userid) {
WHERE g.courseid = ?
AND g.id = m.groupid
AND m.userid = ?
ORDER BY name ASC", array($course->id, $userid));
ORDER BY name ASC", array($course->id, $user->id));
$groups = array_values($groups);
$teachers = feedback_get_receivemail_users($cm->id, $groups);
@@ -3001,7 +2918,7 @@ function feedback_send_email($cm, $feedback, $course, $userid) {
$info->feedback = format_string($feedback->name, true);
$info->url = $CFG->wwwroot.'/mod/feedback/show_entries.php?'.
'id='.$cm->id.'&'.
'userid=' . $userid;
'userid=' . $user->id;
$a = array('username' => $info->username, 'feedbackname' => $feedback->name);
+9 -56
View File
@@ -34,10 +34,11 @@ list($course, $cm) = get_course_and_cm_from_cmid($id, 'feedback');
require_course_login($course, true, $cm);
$feedback = $PAGE->activityrecord;
$feedbackstructure = new mod_feedback_structure($feedback, $cm, $courseid);
$PAGE->set_pagelayout('embedded');
$PAGE->set_pagelayout('popup');
/// Print the page header
// Print the page header.
$strfeedbacks = get_string("modulenameplural", "feedback");
$strfeedback = get_string("modulename", "feedback");
@@ -49,68 +50,20 @@ $PAGE->set_title($feedback->name);
$PAGE->set_heading($course->fullname);
echo $OUTPUT->header();
/// Print the main part of the page
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
echo $OUTPUT->heading(format_text($feedback->name));
// Print the main part of the page.
echo $OUTPUT->heading(format_string($feedback->name));
$continueurl = new moodle_url('/mod/feedback/view.php', array('id' => $id));
if ($courseid) {
$continueurl->param('courseid', $courseid);
}
$feedbackitems = $DB->get_records('feedback_item', array('feedback'=>$feedback->id), 'position');
echo $OUTPUT->box_start('generalbox boxaligncenter boxwidthwide');
$form = new mod_feedback_complete_form(mod_feedback_complete_form::MODE_PRINT,
$feedbackstructure, 'feedback_print_form');
echo $OUTPUT->continue_button($continueurl);
if (is_array($feedbackitems)) {
$itemnr = 0;
$align = right_to_left() ? 'right' : 'left';
echo $OUTPUT->box_start('feedback_items printview');
//check, if there exists required-elements
$params = array('feedback'=>$feedback->id, 'required'=>1);
$countreq = $DB->count_records('feedback_item', $params);
if ($countreq > 0) {
echo '<div class="fdescription required">';
echo get_string('somefieldsrequired', 'form', '<img alt="'.get_string('requiredelement', 'form').
'" src="'.$OUTPUT->pix_url('req') .'" class="req" />');
echo '</div>';
}
//print the inserted items
$itempos = 0;
foreach ($feedbackitems as $feedbackitem) {
echo $OUTPUT->box_start('feedback_item_box_'.$align);
$itempos++;
//Items without value only are labels
if ($feedbackitem->hasvalue == 1 AND $feedback->autonumbering) {
$itemnr++;
echo $OUTPUT->box_start('feedback_item_number_'.$align);
echo $itemnr;
echo $OUTPUT->box_end();
}
echo $OUTPUT->box_start('box generalbox boxalign_'.$align);
if ($feedbackitem->typ != 'pagebreak') {
feedback_print_item_complete($feedbackitem, false, false);
} else {
echo $OUTPUT->box_start('feedback_pagebreak');
echo '<hr class="feedback_pagebreak" />';
echo $OUTPUT->box_end();
}
echo $OUTPUT->box_end();
echo $OUTPUT->box_end();
}
echo $OUTPUT->box_end();
} else {
echo $OUTPUT->box(get_string('no_items_available_yet', 'feedback'),
'generalbox boxaligncenter boxwidthwide');
}
$form->display();
echo $OUTPUT->continue_button($continueurl);
echo $OUTPUT->box_end();
/// Finish the page
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
// Finish the page.
echo $OUTPUT->footer();
+51 -93
View File
@@ -24,7 +24,6 @@
require_once("../../config.php");
require_once("lib.php");
require_once($CFG->libdir.'/tablelib.php');
////////////////////////////////////////////////////////
//get the params
@@ -51,18 +50,24 @@ $feedback = $PAGE->activityrecord;
require_capability('mod/feedback:viewreports', $context);
// Process delete template result.
if ($deleteid && optional_param('confirm', 0, PARAM_BOOL) && confirm_sesskey()) {
if ($deleteid) {
// This is a request to delete a reponse.
require_capability('mod/feedback:deletesubmissions', $context);
$completed = $DB->get_record('feedback_completed', array('id' => $deleteid), '*', MUST_EXIST);
feedback_delete_completed($deleteid);
redirect($baseurl);
$feedbackstructure = new mod_feedback_completion($feedback, $cm, 0, true, $deleteid);
if (optional_param('confirm', 0, PARAM_BOOL) && confirm_sesskey()) {
// Process delete template result.
feedback_delete_completed($feedbackstructure->get_completed(), $feedback, $cm);
redirect($baseurl);
}
} else if ($showcompleted || $userid) {
// Viewing individual response.
$feedbackstructure = new mod_feedback_completion($feedback, $cm, 0, true, $showcompleted, $userid);
} else {
// Viewing list of reponses.
$feedbackstructure = new mod_feedback_structure($feedback, $cm);
}
/// Print the page header
$strfeedbacks = get_string("modulenameplural", "feedback");
$strfeedback = get_string("modulename", "feedback");
// Print the page header.
navigation_node::override_active_url($baseurl);
$PAGE->set_heading($course->fullname);
$PAGE->set_title($feedback->name);
@@ -77,109 +82,62 @@ require('tabs.php');
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
// Print the list of responses.
if (!$showcompleted && !$deleteid && !$userid) {
// Show non-anonymous responses.
$responsestable = new mod_feedback_responses_table($cm);
$totalrows = $responsestable->get_total_responses_count();
if ($feedback->anonymous == FEEDBACK_ANONYMOUS_NO || $totalrows) {
echo $OUTPUT->heading(get_string('non_anonymous_entries', 'feedback', $totalrows), 4);
$responsestable->display();
}
// Show anonymous responses.
feedback_shuffle_anonym_responses($feedback);
$anonresponsestable = new mod_feedback_responses_anon_table($cm);
$totalrows = $anonresponsestable->get_total_responses_count();
if ($feedback->anonymous == FEEDBACK_ANONYMOUS_YES || $totalrows) {
echo $OUTPUT->heading(get_string('anonymous_entries', 'feedback', $totalrows), 4);
$anonresponsestable->display();
}
}
// Print the response of the given user.
if ($userid || $showcompleted) {
//get the feedbackitems
$feedbackitems = $DB->get_records('feedback_item', array('feedback' => $feedback->id), 'position');
if ($deleteid) {
// Print confirmation form to delete a response.
$continueurl = new moodle_url($baseurl, array('delete' => $deleteid, 'confirm' => 1, 'sesskey' => sesskey()));
echo $OUTPUT->confirm(get_string('confirmdeleteentry', 'feedback'), $continueurl, $baseurl);
} else if ($userid || $showcompleted) {
// Print the response of the given user.
$completedrecord = $feedbackstructure->get_completed();
if ($userid) {
$user = $DB->get_record('user', array('id' => $userid, 'deleted' => 0), '*', MUST_EXIST);
$params = ['feedback' => $feedback->id, 'userid' => $userid, 'anonymous_response' => FEEDBACK_ANONYMOUS_NO];
if ($showcompleted) {
$params['id'] = $showcompleted;
}
$feedbackcompleted = $DB->get_record('feedback_completed', $params);
$responsetitle = userdate($feedbackcompleted->timemodified) . ' (' . fullname($user) . ')';
} else if ($showcompleted) {
$feedbackcompleted = $DB->get_record('feedback_completed',
array('feedback' => $feedback->id, 'id' => $showcompleted,
'anonymous_response' => FEEDBACK_ANONYMOUS_YES), '*', MUST_EXIST);
$usr = $DB->get_record('user', array('id' => $userid), '*', MUST_EXIST);
$responsetitle = userdate($completedrecord->timemodified) . ' (' . fullname($usr) . ')';
} else {
$responsetitle = get_string('response_nr', 'feedback') . ': ' .
$feedbackcompleted->random_response . ' (' . get_string('anonymous', 'feedback') . ')';
$completedrecord->random_response . ' (' . get_string('anonymous', 'feedback') . ')';
}
echo $OUTPUT->heading($responsetitle, 4);
// Print the items.
if (is_array($feedbackitems)) {
$align = right_to_left() ? 'right' : 'left';
$form = new mod_feedback_complete_form(mod_feedback_complete_form::MODE_VIEW_RESPONSE,
$feedbackstructure, 'feedback_viewresponse_form');
$form->display();
echo $OUTPUT->box_start('feedback_items');
$itemnr = 0;
foreach ($feedbackitems as $feedbackitem) {
//get the values
$params = array('completed'=>$feedbackcompleted->id, 'item'=>$feedbackitem->id);
$value = $DB->get_record('feedback_value', $params);
echo $OUTPUT->box_start('feedback_item_box_'.$align);
if ($feedbackitem->hasvalue == 1 AND $feedback->autonumbering) {
$itemnr++;
echo $OUTPUT->box_start('feedback_item_number_'.$align);
echo $itemnr;
echo $OUTPUT->box_end();
}
if ($feedbackitem->typ != 'pagebreak') {
echo $OUTPUT->box_start('box generalbox boxalign_'.$align);
if (isset($value->value)) {
feedback_print_item_show_value($feedbackitem, $value->value);
} else {
feedback_print_item_show_value($feedbackitem, false);
}
echo $OUTPUT->box_end();
}
echo $OUTPUT->box_end();
}
echo $OUTPUT->box_end();
}
// Show navigation to previous/next reponse.
if ($userid) {
$responsestable = new mod_feedback_responses_table($cm);
} else {
$responsestable = new mod_feedback_responses_anon_table($cm);
}
list($prevresponseurl, $returnurl, $nextresponseurl) = $responsestable->get_reponse_navigation_links($feedbackcompleted);
list($prevresponseurl, $returnurl, $nextresponseurl) = $responsestable->get_reponse_navigation_links($completedrecord);
echo html_writer::start_div('response_navigation');
echo $prevresponseurl ? html_writer::link($prevresponseurl, get_string('prev'), ['class' => 'prev_response']) : '';
echo html_writer::link($returnurl, get_string('back'), ['class' => 'back_to_list']);
echo $nextresponseurl ? html_writer::link($nextresponseurl, get_string('next'), ['class' => 'next_response']) : '';
echo html_writer::end_div();
} else {
// Print the list of responses.
// Show non-anonymous responses (always retrieve them even if current feedback is anonymous).
$responsestable = new mod_feedback_responses_table($cm);
$totalrows = $responsestable->get_total_responses_count();
if (!$feedbackstructure->is_anonymous() || $totalrows) {
echo $OUTPUT->heading(get_string('non_anonymous_entries', 'feedback', $totalrows), 4);
$responsestable->display();
}
// Show anonymous responses (always retrieve them even if current feedback is not anonymous).
$feedbackstructure->shuffle_anonym_responses();
$anonresponsestable = new mod_feedback_responses_anon_table($cm);
$totalrows = $anonresponsestable->get_total_responses_count();
if ($feedbackstructure->is_anonymous() || $totalrows) {
echo $OUTPUT->heading(get_string('anonymous_entries', 'feedback', $totalrows), 4);
$anonresponsestable->display();
}
}
// Print confirmation form to delete a response.
if ($deleteid) {
$continueurl = new moodle_url($baseurl, array('delete' => $deleteid, 'confirm' => 1, 'sesskey' => sesskey()));
echo $OUTPUT->confirm(get_string('confirmdeleteentry', 'feedback'), $continueurl, $baseurl);
}
/// Finish the page
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
// Finish the page.
echo $OUTPUT->footer();
+134 -102
View File
@@ -1,133 +1,165 @@
/* styles using by feedback */
.feedback_switchrequired img{
}
span.feedback_info {
.path-mod-feedback span.feedback_info {
font-weight:bold;
}
div.feedback_item_box_left, div.feedback_item_box_right {
}
div.feedback_item_box_left div.feedback_item_label_left, div.feedback_item_box_left div.feedback_item_presentation_left {
margin-left: 15px;
}
div.feedback_item_box_right div.feedback_item_label_right, div.feedback_item_box_right div.feedback_item_presentation_right {
margin-right: 15px;
}
div.feedback_depend {
.path-mod-feedback div.feedback_is_dependent {
background:#DDDDDD;
}
div.feedback_complete_depend {
background:#EEEEEE;
}
span.feedback_depend {
.path-mod-feedback span.feedback_depend {
color:#ff0000;
}
div.feedback_item_number_left, div.feedback_item_left {
float:left;
}
div.feedback_item_number_right, div.feedback_item_right {
float:right;
}
div.feedback_item_commands_left {
float:right;
text-align:right;
}
div.feedback_item_commands_right {
float:left;
text-align:left;
}
li.feedback_item_check_h_left,
li.feedback_item_check_h_right,
li.feedback_item_radio_h_left,
li.feedback_item_radio_h_right {
list-style-type:none;
display:inline;
}
div.feedback_item_select_h_left,
div.feedback_item_select_h_right {
display:block;
}
li.feedback_item_check_v_left,
li.feedback_item_check_v_right,
li.feedback_item_radio_v_left,
li.feedback_item_radio_v_right {
list-style-type:none;
display:block;
}
div.feedback_item_select_v_left,
div.feedback_item_select_v_right {
display:block;
}
div.feedback_items label{
display: inline;
}
div.feedback_item_captcha_text_left,
div.feedback_item_captcha_img_left {
display:inline;
margin: 5px;
}
div.feedback_item_captcha_text_right,
div.feedback_item_captcha_img_right {
display:inline;
margin: 5px;
}
hr.feedback_pagebreak {
height:8px;
.path-mod-feedback hr.feedback_pagebreak {
height:4px;
color:#aaaaaa;
background-color:#aaaaaa;
border:0px;
border: 0;
margin: 0;
}
.drag_target_active {
opacity: .25;
.path-mod-feedback .drag_target_active {
opacity: .25;
}
.drag_item_active {
opacity: .5;
.path-mod-feedback .drag_item_active {
opacity: .5;
}
ul#feedback_draglist {
list-style: none;
padding: 0;
margin: 0;
}
div#feedback_dragarea {
width:95%;
}
div img.feedback_bar_image {
.path-mod-feedback .feedback_bar_image {
height: 10px;
}
.path-mod-feedback input,
.path-mod-feedback textarea,
.path-mod-feedback .uneditable-input {
width: auto;
}
.path-mod-feedback #analysis-form label { display: inline; }
.path-mod-feedback .mform.feedback_form .fitem .fitemtitle {
display: block;
margin-top: 4px;
margin-bottom: 4px;
text-align: left;
width: 100%;
}
.path-mod-feedback .mform.feedback_form .fitem .felement {
margin-left: 0;
width: 100%;
float: left;
padding-left: 0;
padding-right: 0;
}
.path-mod-feedback .mform.feedback_form .fitem .fstatic:empty {
display: none;
}
.path-mod-feedback .mform.feedback_form .fitem .fcheckbox > span,
.path-mod-feedback .mform.feedback_form .fitem .fradio > span,
.path-mod-feedback .mform.feedback_form .fitem .fgroup > span {
margin-top: 4px;
}
body.path-mod-feedback #region-main .mform.feedback_form .femptylabel .fitemtitle {
display: inline-block;
width: auto;
margin-right: 0;
}
.path-mod-feedback .mform.feedback_form .femptylabel .felement {
display: inline-block;
margin-top: 4px;
padding-top: 5px;
width: auto;
}
body.path-mod-feedback #region-main .mform.feedback_form .feedback-item-pagebreak .felement {
width: 100%;
}
.path-mod-feedback .mform.feedback_form .fitem_fcheckbox .fitemtitle,
.path-mod-feedback .mform.feedback_form .fitem_fcheckbox .felement {
display: inline-block;
width: auto;
}
.path-mod-feedback .mform.feedback_form .fitem_fcheckbox .felement {
padding: 6px;
}
body.dir-rtl.path-mod-feedback #region-main .mform.feedback_form .femptylabel .fitemtitle {
margin-right: 0px;
margin-left: 0;
}
.dir-rtl.path-mod-feedback .mform.feedback_form .fitem .fitemtitle {
text-align: right;
}
.dir-rtl.path-mod-feedback .mform.feedback_form .fitem .felement {
margin-right: 0;
float: right;
padding-right: 0;
padding-left: 0;
}
.dir-rtl.path-mod-feedback .mform.feedback_form .fitem_fcheckbox .felement {
float: right;
}
.path-mod-feedback .mform.feedback_form#feedback_viewresponse_form .fitem.feedback_hasvalue:not(.feedback-item-captcha) .felement {
background: #FBFBF1;
min-height: 1em;
box-sizing: border-box;
padding: 3px;
border: 1px solid #ddd
}
.path-mod-feedback .mform.feedback_form .fitem.feedback_hasvalue .fstatic:empty {
display: inherit;
}
.path-mod-feedback .mform.feedback_form#feedback_edit_form .fitem:hover {
background: #f5f5f5;
}
.path-mod-feedback .mform.feedback_form#feedback_edit_form .fitem .fitemtitle label {
width: 100%;
}
.path-mod-feedback .mform.feedback_form#feedback_edit_form .fitem .fitemtitle .itemtitle {
position: relative;
width: 100%;
}
.path-mod-feedback .mform.feedback_form#feedback_edit_form .fitem .fitemtitle .itemtitle .itemdd,
.path-mod-feedback .mform.feedback_form#feedback_edit_form .fitem .fitemtitle .itemtitle .itemname {
float: left;
}
.path-mod-feedback .mform.feedback_form#feedback_edit_form .fitem .fitemtitle .itemtitle .itemactions {
float: right;
}
.path-mod-feedback table.analysis {
width: 100%;
}
.path-mod-feedback .templateslist td.cell.action,
.path-mod-feedback .templateslist th.header.action {
width: 10%;
}
.path-mod-feedback #showentrytable td.cell.completed_timemodified,
.path-mod-feedback #showentryanontable td.cell.random_response {
font-weight: bold;
}
.path-mod-feedback #showentrytable td.cell.userpic,
.path-mod-feedback #showentrytable td.cell.deleteentry,
.path-mod-feedback #showentryanontable td.cell.deleteentry {
width: 10px;
}
/* Responses navigation */
.path-mod-feedback .response_navigation {
margin: .5em 0;
+7 -6
View File
@@ -86,7 +86,7 @@ Feature: Testing multichoice questions in feedback
And I should not see "this is the third page of the feedback"
And I press "Next page"
# We are still on the second page because the field is required
And I should see "Saving failed because missing or false values" in the ".error" "css_element"
And I should see "Required" in the ".error" "css_element"
And I should see "this is the second page of the feedback"
And I set the field "option e" to "1"
And the following fields match these values:
@@ -155,7 +155,7 @@ Feature: Testing multichoice questions in feedback
And I should see "1 (100.00 %)" in the "option i:" "table_row"
# Change the settings so we don't analyse empty submits
And I follow "Edit questions"
And I click on "Edit question" "link" in the "//li[contains(@class, 'feedback_itemlist') and contains(.,'multichoice1')]" "xpath_element"
And I click on "Edit question" "link" in the "//div[contains(@class, 'feedback_itemlist') and contains(.,'multichoice1')]" "xpath_element"
And I set the field "Do not analyse empty submits" to "Yes"
And I press "Save changes to question"
And I follow "Analysis"
@@ -164,6 +164,7 @@ Feature: Testing multichoice questions in feedback
And I should not see "%" in the "option c:" "table_row"
And I log out
@javascript
Scenario: Non-rated multiple-answers multiple choice questions in feedback
# Create a feedback with three pages, required and dependent questions.
When I add a "Multiple choice" question to the feedback with:
@@ -223,7 +224,7 @@ Feature: Testing multichoice questions in feedback
And I should not see "this is the third page of the feedback"
And I press "Next page"
# We are still on the second page because the field is required
And I should see "Saving failed because missing or false values" in the ".error" "css_element"
And I should see "Required" in the ".error" "css_element"
And I should see "this is the second page of the feedback"
And I set the field "option e" to "1"
And I set the field "option f" to "1"
@@ -293,7 +294,7 @@ Feature: Testing multichoice questions in feedback
And I should see "1 (100.00 %)" in the "option i:" "table_row"
# Change the settings so we don't analyse empty submits
And I follow "Edit questions"
And I click on "Edit question" "link" in the "//li[contains(@class, 'feedback_itemlist') and contains(.,'multichoice1')]" "xpath_element"
And I click on "Edit question" "link" in the "//div[contains(@class, 'feedback_itemlist') and contains(.,'multichoice1')]" "xpath_element"
And I set the field "Do not analyse empty submits" to "Yes"
And I press "Save changes to question"
And I follow "Analysis"
@@ -353,7 +354,7 @@ Feature: Testing multichoice questions in feedback
And I should not see "this is the third page of the feedback"
And I press "Next page"
# We are still on the second page because the field is required
And I should see "Saving failed because missing or false values" in the ".error" "css_element"
And I should see "Required" in the ".error" "css_element"
And I should see "this is the second page of the feedback"
And I set the field "this is a multiple choice 2" to "option e"
And I press "Next page"
@@ -410,7 +411,7 @@ Feature: Testing multichoice questions in feedback
And I should see "1 (100.00 %)" in the "option i:" "table_row"
# Change the settings so we don't analyse empty submits
And I follow "Edit questions"
And I click on "Edit question" "link" in the "//li[contains(@class, 'feedback_itemlist') and contains(.,'multichoice1')]" "xpath_element"
And I click on "Edit question" "link" in the "//div[contains(@class, 'feedback_itemlist') and contains(.,'multichoice1')]" "xpath_element"
And I set the field "Do not analyse empty submits" to "Yes"
And I press "Save changes to question"
And I follow "Analysis"
@@ -116,10 +116,10 @@ Feature: Test creating different types of feedback questions
And I should not see "%" in the "option g:" "table_row"
And I should see "1 (50.00 %)" in the "option h:" "table_row"
And I should see "1 (50.00 %)" in the "option i:" "table_row"
And I should see "0" in the "option k (0):" "table_row"
And I should not see "%" in the "option k (0):" "table_row"
And I should see "1 (50.00 %)" in the "option l (1):" "table_row"
And I should see "1 (50.00 %)" in the "option m (5):" "table_row"
And I should see "0" in the "(0) option k" "table_row"
And I should not see "%" in the "(0) option k" "table_row"
And I should see "1 (50.00 %)" in the "(1) option l" "table_row"
And I should see "1 (50.00 %)" in the "(5) option m:" "table_row"
And I should see "Average: 3.00" in the "(multichoice4)" "table"
And I should see "35" in the "(numeric)" "table"
And I should see "71" in the "(numeric)" "table"
+3 -3
View File
@@ -218,7 +218,7 @@ class mod_feedback_events_testcase extends advanced_testcase {
// Save the feedback.
$sink = $this->redirectEvents();
$id = feedback_save_tmp_values($completed, false, $USER->id);
$id = feedback_save_tmp_values($completed, false);
$events = $sink->get_events();
$event = array_pop($events); // Response submitted feedback event.
$sink->close();
@@ -257,14 +257,14 @@ class mod_feedback_events_testcase extends advanced_testcase {
// Save the feedback.
$sink = $this->redirectEvents();
feedback_save_tmp_values($completed, false, $USER->id);
feedback_save_tmp_values($completed, false);
$events = $sink->get_events();
$event = array_pop($events); // Response submitted feedback event.
$sink->close();
// Test legacy data.
$arr = array($this->eventcourse->id, 'feedback', 'submit', 'view.php?id=' . $this->eventcm->id, $this->eventfeedback->id,
$this->eventcm->id, $USER->id);
$this->eventcm->id, $this->eventuser->id);
$this->assertEventLegacyLogData($arr, $event);
// Test can_view().
+24
View File
@@ -1,6 +1,30 @@
=== 3.1 ===
* feedback_get_courses_from_sitecourse_map() now returns course id as 'id' attribute
* Base class for feedback items - feedback_item_base - has been significantly changed, all item types now
must implement method complete_form_element() instead of print_item_preview(), print_item_complete(),
print_item_show_value(), check_values(), clean_input_value() and value_is_array(). Rendering the items
on complete form, feedback preview, feedback edit and when viewing response is done using moodleform.
* The following functions have been deprecated:
* feedback_print_item_preview()
* feedback_print_item_complete()
* feedback_print_item_show_value
* feedback_check_values()
* feedback_clean_input_value()
* feedback_get_context()
* feedback_create_item()
* feedback_set_tmp_values()
* feedback_delete_completedtmp()
* feedback_get_page_to_continue()
* feedback_save_values()
* feedback_save_guest_values()
* feedback_create_values()
* feedback_update_values()
* feedback_get_current_completed()
* feedback_is_course_in_sitecourse_map()
* feedback_is_feedback_in_sitecourse_map()
* feedback_clean_up_sitecourse_map()
* feedback_print_numeric_option_list()
=== 2.7 ===
+4 -34
View File
@@ -42,6 +42,7 @@ $context = context_module::instance($cm->id);
require_login($course, true, $cm);
$feedback = $PAGE->activityrecord;
$feedbackstructure = new mod_feedback_structure($feedback, $cm, 0, $templateid);
require_capability('mod/feedback:edititems', $context);
@@ -75,40 +76,9 @@ echo $OUTPUT->heading(get_string('confirmusetemplate', 'feedback'), 4);
$mform->display();
$templateitems = $DB->get_records('feedback_item', array('template'=>$templateid), 'position');
if (is_array($templateitems)) {
$templateitems = array_values($templateitems);
}
if (is_array($templateitems)) {
$itemnr = 0;
$align = right_to_left() ? 'right' : 'left';
echo $OUTPUT->box_start('feedback_items');
foreach ($templateitems as $templateitem) {
echo $OUTPUT->box_start('feedback_item_box_'.$align);
if ($templateitem->hasvalue == 1 AND $feedback->autonumbering) {
$itemnr++;
echo $OUTPUT->box_start('feedback_item_number_'.$align);
echo $itemnr;
echo $OUTPUT->box_end();
}
echo $OUTPUT->box_start('box generalbox boxalign_'.$align);
if ($templateitem->typ != 'pagebreak') {
// echo '<div class="feedback_item_'.$align.'">';
feedback_print_item_preview($templateitem);
} else {
echo $OUTPUT->box_start('feedback_pagebreak');
echo get_string('pagebreak', 'feedback').'<hr class="feedback_pagebreak" />';
echo $OUTPUT->box_end();
}
echo $OUTPUT->box_end();
echo $OUTPUT->box_end();
}
echo $OUTPUT->box_end();
} else {
echo $OUTPUT->box(get_string('no_items_available_at_this_template', 'feedback'),
'generalbox boxaligncenter boxwidthwide');
}
$form = new mod_feedback_complete_form(mod_feedback_complete_form::MODE_VIEW_TEMPLATE,
$feedbackstructure, 'feedback_preview_form', ['templateid' => $templateid]);
$form->display();
echo $OUTPUT->footer();
+39 -142
View File
@@ -21,102 +21,48 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
* @package mod_feedback
*/
require_once("../../config.php");
require_once("lib.php");
require_once(__DIR__ . '/../../config.php');
require_once($CFG->dirroot . '/mod/feedback/lib.php');
$id = required_param('id', PARAM_INT);
$courseid = optional_param('courseid', false, PARAM_INT);
$current_tab = 'view';
if (! $cm = get_coursemodule_from_id('feedback', $id)) {
print_error('invalidcoursemodule');
}
list($course, $cm) = get_course_and_cm_from_cmid($id, 'feedback');
require_course_login($course, true, $cm);
$feedback = $PAGE->activityrecord;
if (! $course = $DB->get_record("course", array("id"=>$cm->course))) {
print_error('coursemisconf');
}
if (! $feedback = $DB->get_record("feedback", array("id"=>$cm->instance))) {
print_error('invalidcoursemodule');
}
$feedbackcompletion = new mod_feedback_completion($feedback, $cm, $courseid);
$context = context_module::instance($cm->id);
$feedback_complete_cap = false;
if (has_capability('mod/feedback:complete', $context)) {
$feedback_complete_cap = true;
}
if (!empty($CFG->feedback_allowfullanonymous)
AND $course->id == SITEID
AND $feedback->anonymous == FEEDBACK_ANONYMOUS_YES
AND (!isloggedin() OR isguestuser())) {
// Guests are allowed to complete fully anonymous feedback without having 'mod/feedback:complete' capability.
$feedback_complete_cap = true;
}
//check whether the feedback is located and! started from the mainsite
if ($course->id == SITEID AND !$courseid) {
$courseid = SITEID;
}
require_course_login($course, true, $cm);
if ($course->id == SITEID) {
$PAGE->set_context($context);
$PAGE->set_cm($cm, $course);
$PAGE->set_pagelayout('incourse');
}
$PAGE->set_url('/mod/feedback/view.php', array('id' => $cm->id));
$PAGE->set_title($feedback->name);
$PAGE->set_heading($course->fullname);
// Check whether the feedback is mapped to the given courseid.
if ($course->id == SITEID AND !has_capability('mod/feedback:edititems', $context)) {
if ($DB->get_records('feedback_sitecourse_map', array('feedbackid' => $feedback->id))) {
$params = array('feedbackid' => $feedback->id, 'courseid' => $courseid);
if (!$DB->get_record('feedback_sitecourse_map', $params)) {
if ($courseid == SITEID) {
echo $OUTPUT->header();
echo $OUTPUT->notification(get_string('cannotaccess', 'mod_feedback'));
echo $OUTPUT->footer();
exit;
} else {
print_error('invalidcoursemodule');
}
}
}
// Check access to the given courseid.
if ($courseid AND $courseid != SITEID) {
require_course_login(get_course($courseid)); // This overwrites the object $COURSE .
}
//check whether the given courseid exists
if ($courseid AND $courseid != SITEID) {
if ($course2 = $DB->get_record('course', array('id'=>$courseid))) {
require_course_login($course2); //this overwrites the object $course :-(
$course = $DB->get_record("course", array("id"=>$cm->course)); // the workaround
} else {
print_error('invalidcourseid');
}
// Check whether the feedback is mapped to the given courseid.
if (!has_capability('mod/feedback:edititems', $context) &&
!$feedbackcompletion->check_course_is_mapped()) {
echo $OUTPUT->header();
echo $OUTPUT->notification(get_string('cannotaccess', 'mod_feedback'));
echo $OUTPUT->footer();
exit;
}
// Trigger module viewed event.
$event = \mod_feedback\event\course_module_viewed::create(array(
'objectid' => $feedback->id,
'context' => $context,
'anonymous' => ($feedback->anonymous == FEEDBACK_ANONYMOUS_YES),
'other' => array(
'anonymous' => $feedback->anonymous // Deprecated.
)
));
$event->add_record_snapshot('course_modules', $cm);
$event->add_record_snapshot('course', $course);
$event->add_record_snapshot('feedback', $feedback);
$event = \mod_feedback\event\course_module_viewed::create_from_record($feedback, $cm, $course);
$event->trigger();
/// Print the page header
$strfeedbacks = get_string("modulenameplural", "feedback");
$strfeedback = get_string("modulename", "feedback");
echo $OUTPUT->header();
/// Print the main part of the page
@@ -164,7 +110,7 @@ if (has_capability('mod/feedback:edititems', $context)) {
echo $OUTPUT->box_end();
$params = array('feedback'=>$feedback->id, 'hasvalue'=>1);
$itemscount = $DB->count_records('feedback_item', $params);
$itemscount = count($feedbackcompletion->get_items(true));
echo $OUTPUT->box_start('feedback_info');
echo '<span class="feedback_info">';
echo get_string('questions', 'feedback').': ';
@@ -195,36 +141,21 @@ if (has_capability('mod/feedback:edititems', $context)) {
echo $OUTPUT->box_end();
}
echo $OUTPUT->box_end();
}
if (has_capability('mod/feedback:edititems', $context)) {
require_once($CFG->libdir . '/filelib.php');
$page_after_submit_output = file_rewrite_pluginfile_urls($feedback->page_after_submit,
'pluginfile.php',
$context->id,
'mod_feedback',
'page_after_submit',
0);
echo $OUTPUT->heading(get_string("page_after_submit", "feedback"), 3);
echo $OUTPUT->box_start('generalbox feedback_after_submit');
echo format_text($page_after_submit_output,
$feedback->page_after_submitformat,
array('overflowdiv'=>true));
echo $OUTPUT->box_end();
if ($pageaftersubmit = $feedbackcompletion->page_after_submit()) {
echo $OUTPUT->heading(get_string("page_after_submit", "feedback"), 3);
echo $OUTPUT->box($pageaftersubmit, 'generalbox feedback_after_submit');
}
}
if (!has_capability('mod/feedback:viewreports', $context) &&
feedback_can_view_analysis($feedback, $context, $courseid)) {
$feedbackcompletion->can_view_analysis()) {
$analysisurl = new moodle_url('/mod/feedback/analysis.php', array('id' => $id));
echo '<div class="mdl-align"><a href="'.$analysisurl->out().'">';
echo get_string('completed_feedbacks', 'feedback').'</a>';
echo '</div>';
}
//####### mapcourse-start
if (has_capability('mod/feedback:mapcourse', $context) && $feedback->course == SITEID) {
echo $OUTPUT->box_start('generalbox feedback_mapped_courses');
echo $OUTPUT->heading(get_string("mappedcourses", "feedback"), 3);
@@ -233,65 +164,31 @@ if (has_capability('mod/feedback:mapcourse', $context) && $feedback->course == S
echo '<p class="mdl-align">' . html_writer::link($mapurl, get_string('mapcourses', 'feedback')) . '</p>';
echo $OUTPUT->box_end();
}
//####### mapcourse-end
//####### completed-start
if ($feedback_complete_cap) {
echo $OUTPUT->box_start('generalbox boxaligncenter boxwidthwide');
//check, whether the feedback is open (timeopen, timeclose)
$checktime = time();
if (($feedback->timeopen > $checktime) OR
($feedback->timeclose < $checktime AND $feedback->timeclose > 0)) {
if ($feedbackcompletion->can_complete()) {
echo $OUTPUT->box_start('generalbox boxaligncenter');
if (!$feedbackcompletion->is_open()) {
// Feedback is not yet open or is already closed.
echo $OUTPUT->notification(get_string('feedback_is_not_open', 'feedback'));
echo $OUTPUT->continue_button($CFG->wwwroot.'/course/view.php?id='.$course->id);
echo $OUTPUT->box_end();
echo $OUTPUT->footer();
exit;
}
//check multiple Submit
$feedback_can_submit = true;
if ($feedback->multiple_submit == 0 ) {
if (feedback_is_already_submitted($feedback->id, $courseid)) {
$feedback_can_submit = false;
}
}
if ($feedback_can_submit) {
//if the user is not known so we cannot save the values temporarly
if (!isloggedin() or isguestuser()) {
$guestid = sesskey();
echo $OUTPUT->continue_button(course_get_url($courseid ?: $course->id));
} else if ($feedbackcompletion->can_submit()) {
// Display a link to complete feedback or resume.
$completeurl = new moodle_url('/mod/feedback/complete.php',
['id' => $id, 'courseid' => $courseid]);
if ($startpage = $feedbackcompletion->get_resume_page()) {
$completeurl->param('gopage', $startpage);
$label = get_string('continue_the_form', 'feedback');
} else {
$guestid = false;
}
$url_params = array('id'=>$id, 'courseid'=>$courseid, 'gopage'=>0);
$completeurl = new moodle_url('/mod/feedback/complete.php', $url_params);
$feedbackcompletedtmp = feedback_get_current_completed($feedback->id, true, $courseid, $guestid);
if ($feedbackcompletedtmp) {
if ($startpage = feedback_get_page_to_continue($feedback->id, $courseid, $guestid)) {
$completeurl->param('gopage', $startpage);
}
echo '<a href="'.$completeurl->out().'">'.get_string('continue_the_form', 'feedback').'</a>';
} else {
echo '<a href="'.$completeurl->out().'">'.get_string('complete_the_form', 'feedback').'</a>';
$label = get_string('complete_the_form', 'feedback');
}
echo html_writer::div(html_writer::link($completeurl, $label), 'complete-feedback');
} else {
// Feedback was already submitted.
echo $OUTPUT->notification(get_string('this_feedback_is_already_submitted', 'feedback'));
if ($courseid) {
echo $OUTPUT->continue_button($CFG->wwwroot.'/course/view.php?id='.$courseid);
} else {
echo $OUTPUT->continue_button($CFG->wwwroot.'/course/view.php?id='.$course->id);
}
$OUTPUT->continue_button(course_get_url($courseid ?: $course->id));
}
echo $OUTPUT->box_end();
}
//####### completed-end
/// Finish the page
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
echo $OUTPUT->footer();
+10 -24
View File
@@ -1,13 +1,10 @@
YUI.add('moodle-mod_feedback-dragdrop', function(Y) {
var DRAGDROPNAME = 'mod_feedback_dragdrop';
var CSS = {
OLDMOVE : 'span.feedback_item_command_move',
OLDMOVEUP : 'span.feedback_item_command_moveup',
OLDMOVEDOWN : 'span.feedback_item_command_movedown',
DRAGAREA : '#feedback_dragarea',
DRAGITEM : 'li.feedback_itemlist',
DRAGLIST : '#feedback_dragarea ul#feedback_draglist',
POSITIONLABEL : '.feedback_item_commands.position',
DRAGITEMCLASS : 'feedback_itemlist',
DRAGITEM : 'div.feedback_itemlist',
DRAGLIST : '#feedback_dragarea form > fieldset > div',
ITEMBOX : '#feedback_item_box_',
DRAGHANDLE : 'itemhandle'
};
@@ -31,9 +28,9 @@ YUI.add('moodle-mod_feedback-dragdrop', function(Y) {
//Get the list of li's in the lists and add the drag handle.
basenode = Y.Node.one(CSS.DRAGLIST);
listitems = basenode.all(CSS.DRAGITEM).each(function(v) {
item_id = this.get_node_id(v.get('id')); //Get the id of the feedback item.
item_box = Y.Node.one(CSS.ITEMBOX + item_id); //Get the current item box so we can add the drag handle.
v.insert(this.mydraghandle.cloneNode(true), item_box); //Insert the new handle into the item box.
var item_id = this.get_node_id(v.get('id')); //Get the id of the feedback item.
var item_box = Y.Node.one(CSS.ITEMBOX + item_id); //Get the current item box so we can add the drag handle.
item_box.append(this.mydraghandle.cloneNode(true)); // Insert the new handle into the item box.
}, this);
//We use a delegate to make all items draggable
@@ -72,11 +69,6 @@ YUI.add('moodle-mod_feedback-dragdrop', function(Y) {
//Listen for all drag:dropmiss events
del.on('drag:dropmiss', this.drag_dropmiss_handler, this);
// Remove all legacy move icons.
Y.all(CSS.OLDMOVEUP).remove();
Y.all(CSS.OLDMOVEDOWN).remove();
Y.all(CSS.OLDMOVE).remove();
//Create targets for drop.
var droparea = Y.Node.one(CSS.DRAGLIST);
var tar = new Y.DD.Drop({
@@ -98,7 +90,7 @@ YUI.add('moodle-mod_feedback-dragdrop', function(Y) {
drop = e.drop.get('node');
//Are we dropping on an li node?
if (drop.get('tagName').toLowerCase() === 'li') {
if (drop.hasClass(CSS.DRAGITEMCLASS)) {
//Are we not going up?
if (!this.goingUp) {
drop = drop.get('nextSibling');
@@ -173,19 +165,13 @@ YUI.add('moodle-mod_feedback-dragdrop', function(Y) {
var drop = e.drop.get('node'),
drag = e.drag.get('node');
dragnode = Y.one(drag);
//If we are not on an li, we must have been dropped on a ul.
if (drop.get('tagName').toLowerCase() !== 'li') {
if (!drop.hasClass(CSS.DRAGITEMCLASS)) {
if (!drop.contains(drag)) {
drop.appendChild(drag);
}
myElements = '';
counter = 1;
drop.get('children').each(function(v) {
poslabeltext = '(' + M.util.get_string('position', 'feedback') + ':' + counter + ')';
poslabel = v.one(CSS.POSITIONLABEL);
poslabel.setHTML(poslabeltext);
drop.all(CSS.DRAGITEM).each(function(v) {
myElements = myElements + ',' + this.get_node_id(v.get('id'));
counter++;
}, this);
var spinner = M.util.add_spinner(Y, dragnode);
this.save_item_order(this.cmid, myElements, spinner);
@@ -245,7 +231,7 @@ YUI.add('moodle-mod_feedback-dragdrop', function(Y) {
* @return int
*/
get_node_id : function(id) {
return Number(id.replace(/feedback_item_/i, ''));
return Number(id.replace(/^.*feedback_item_/i, ''));
}
}, {
@@ -73,10 +73,6 @@ select {
}
}
.path-mod-feedback .feedback_bar_image {
height: 5px; // we should remove the bar height specification in core
}
.forumpost {
.well;
padding: 6px;
File diff suppressed because one or more lines are too long