Your IP : 216.73.216.95


Current Path : /var/www/ljmtc/cbt/mod/grouptool/
Upload File :
Current File : /var/www/ljmtc/cbt/mod/grouptool/mod_form.php

<?php
// This file is part of mod_grouptool for Moodle - http://moodle.org/
//
// It 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.
//
// It 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/>.

/**
 * Module instance settings form
 *
 * @package   mod_grouptool
 * @author    Philipp Hager
 * @author    Hannes Laimer
 * @copyright 2014 Academic Moodle Cooperation {@link http://www.academic-moodle-cooperation.org}
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */

defined('MOODLE_INTERNAL') || die();

require_once($CFG->dirroot.'/course/moodleform_mod.php');
require_once($CFG->dirroot.'/mod/grouptool/definitions.php');

/**
 * Module instance settings form
 *
 * @package   mod_grouptool
 * @author    Philipp Hager
 * @copyright 2014 Academic Moodle Cooperation {@link http://www.academic-moodle-cooperation.org}
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
class mod_grouptool_mod_form extends moodleform_mod {

    /**
     * Defines forms elements
     *
     * @throws coding_exception
     * @throws dml_exception
     */
    public function definition() {
        global $DB, $OUTPUT;

        $mform = $this->_form;
        $maxregs = 0;
        $queues = 0;
        if ($update = optional_param('update', 0, PARAM_INT)) {
            $cm = get_coursemodule_from_id('grouptool', $update);
            $sql = '
  SELECT MAX(regcnt)
    FROM (SELECT COUNT(reg.id) AS regcnt
            FROM {grouptool_registered} reg
            JOIN {grouptool_agrps} agrps ON reg.agrpid = agrps.id
           WHERE agrps.grouptoolid = :grouptoolid
                 AND reg.modified_by >= 0
        GROUP BY reg.userid) regcnts';
            $params = ['grouptoolid' => $cm->instance];
            $maxregs = $DB->get_field_sql($sql, $params);
            $sql = '
      SELECT COUNT(queue.id) AS queue
        FROM {grouptool_queued} queue
        JOIN {grouptool_agrps} agrps ON queue.agrpid = agrps.id
       WHERE agrps.grouptoolid = :grouptoolid
             AND agrps.active = 1';
            $params = ['grouptoolid' => $cm->instance];
            $queues = $DB->get_field_sql($sql, $params);
        }

        $mform->addElement('hidden', 'max_regs', $maxregs);
        $mform->setType('max_regs', PARAM_INT);
        /* -------------------------------------------------------------------------------
         * Adding the "general" fieldset, where all the common settings are showed
         */
        $mform->addElement('header', 'general', get_string('general', 'form'));

        // Adding the standard "name" field!
        $mform->addElement('text', 'name', get_string('grouptoolname', 'grouptool'), ['size' => '64']);
        $mform->setType('name', PARAM_TEXT);
        $mform->addRule('name', null, 'required', null, 'client');
        $mform->addRule('name', get_string('maximumchars', '', 255), 'maxlength', 255, 'client');
        $mform->addHelpButton('name', 'grouptoolname', 'grouptool');

        // Adding the standard "intro" and "introformat" fields!
        $this->standard_intro_elements(get_string('description', 'grouptool'));

        $mform->addElement('header', 'availability', get_string('availability', 'assign'));
        $mform->setExpanded('availability', true);

        $name = get_string('availabledate', 'grouptool');
        $options = ['optional' => true];
        $mform->addElement('date_time_selector', 'timeavailable', $name, $options);
        $mform->addHelpButton('timeavailable', 'availabledate', 'grouptool');
        $mform->setDefault('timeavailable', time());

        $name = get_string('duedate', 'grouptool');
        $mform->addElement('date_time_selector', 'timedue', $name, ['optional' => true]);
        $mform->addHelpButton('timedue', 'duedate', 'grouptool');
        $mform->setDefault('timedue', date('U', strtotime('+1week 23:55', time())));

        $name = get_string('alwaysshowdescription', 'grouptool');
        $mform->addElement('advcheckbox', 'alwaysshowdescription', $name);
        $mform->addHelpButton('alwaysshowdescription', 'alwaysshowdescription', 'grouptool');
        $mform->setDefault('alwaysshowdescription', 1);
        $mform->disabledIf('alwaysshowdescription', 'timeavailable[enabled]', 'notchecked');

        /*
         * ---------------------------------------------------------
         */

        /* -------------------------------------------------------------------------------
         * Adding the "grouptool" fieldset, where all individual-settings are made
         * (except of active-groups)
         */
        $mform->addElement('header', 'grouptoolfieldset', get_string('grouptoolfieldset',
                                                                     'grouptool'));
        $mform->setExpanded('grouptoolfieldset');

        $mform->addElement('selectyesno', 'allow_reg', get_string('allow_reg', 'grouptool'));
        $allowreg = get_config('mod_grouptool', 'allow_reg');
        if ($allowreg === false) {
            throw new coding_exception('invalid_param');
        }
        $mform->setDefault('allow_reg', (($allowreg !== false) ? $allowreg : 1));
        $mform->addHelpButton('allow_reg', 'allow_reg', 'grouptool');

        $options = [
                GROUPTOOL_HIDE_GROUPMEMBERS               => get_string('no'),
                GROUPTOOL_SHOW_GROUPMEMBERS_AFTER_DUE     => get_string('showafterdue', 'grouptool'),
                GROUPTOOL_SHOW_OWN_GROUPMEMBERS_AFTER_DUE => get_string('showownafterdue', 'grouptool'),
                GROUPTOOL_SHOW_OWN_GROUPMEMBERS_AFTER_REG => get_string('showownafterreg', 'grouptool'),
                GROUPTOOL_SHOW_GROUPMEMBERS               => get_string('yes')
        ];
        $mform->addElement('select', 'show_members', get_string('show_members', 'grouptool'), $options);
        $showmembers = get_config('mod_grouptool', 'show_members');
        if ($showmembers === false) {
            throw new coding_exception('invalid_param');
        }
        $mform->setDefault('show_members', $showmembers);
        $mform->addHelpButton('show_members', 'show_members', 'grouptool');

        $mform->addElement('selectyesno', 'immediate_reg', get_string('immediate_reg',
                                                                      'grouptool'));
        $immediatereg = get_config('mod_grouptool', 'immediate_reg');
        if ($immediatereg === false) {
            throw new coding_exception('invalid_param');
        }
        $mform->setDefault('immediate_reg', (($immediatereg !== false) ? $immediatereg : 0));
        $mform->addHelpButton('immediate_reg', 'immediate_reg', 'grouptool');
        $mform->hideIf ('immediate_reg', 'allow_reg', 'eq', 0);

        $mform->addElement('selectyesno', 'allow_unreg', get_string('allow_unreg', 'grouptool'));
        $allowunreg = get_config('mod_grouptool', 'allow_unreg');
        if ($allowunreg === false) {
            throw new coding_exception('invalid_param');
        }
        $mform->setDefault('allow_unreg', (($allowunreg !== false) ? $allowunreg : 0));
        $mform->addHelpButton('allow_unreg', 'allow_unreg', 'grouptool');
        $mform->hideIf ('allow_unreg', 'allow_reg', 'eq', 0);

        $size = [];
        $size[] = $mform->createElement('text', 'grpsize', get_string('size', 'grouptool'), ['size' => '5']);
        $size[] = $mform->createElement('checkbox', 'use_size', '', get_string('use_size', 'grouptool'));
        // We have to clean this params by ourselves afterwards otherwise we get problems with texts getting mapped to 0!
        $mform->setType('grpsize', PARAM_RAW);
        $grpsize = get_config('mod_grouptool', 'grpsize');
        if ($grpsize === false) {
            throw new coding_exception('invalid_param');
        }
        $mform->setDefault('grpsize', (($grpsize !== false) ? $grpsize : 3));
        $mform->setType('use_size', PARAM_BOOL);
        $usesize = get_config('mod_grouptool', 'use_size');
        if ($usesize === false) {
            throw new coding_exception('invalid_param');
        }
        $mform->setDefault('use_size', (($usesize !== false) ? $usesize : 0));
        $mform->addGroup($size, 'size_grp', get_string('size', 'grouptool'), ' ', false);
        $mform->addHelpButton('size_grp', 'size_grp', 'grouptool');
        $mform->disabledIf ('grpsize', 'use_size', 'notchecked');
        $mform->hideIf ('size_grp', 'allow_reg', 'eq', 0);

        /*
         * ---------------------------------------------------------------------
         */

        /* ---------------------------------------------------------------------
         * Adding the queue and multiple registrations fieldset,
         * where all settings related to queues and multiple registrations
         * are made (except of active-groups)
         */
        $mform->addElement('header', 'queue_and_multiple_reg',
                           get_string('queue_and_multiple_reg_title', 'grouptool'));

        $usequeueel = $mform->createElement('checkbox', 'use_queue', get_string('use_queue', 'grouptool'));
        if ($queues > 0) {
            $mform->addElement('html', $OUTPUT->notification(get_string('queuespresenterror', 'grouptool'), 'info'));
            $usequeueel->setPersistantFreeze(1);
            $usequeueel->setValue(1);
            $usequeueel->freeze();
        }
        $mform->addElement($usequeueel);
        $mform->setType('use_queue', PARAM_BOOL);
        $usequeue = get_config('mod_grouptool', 'use_queue');
        if ($usequeue === false) {
            throw new coding_exception('invalid_param');
        }
        $mform->setDefault('use_queue', (($usequeue !== false) ? $usequeue : 0));
        $mform->addHelpButton('use_queue', 'use_queue', 'grouptool');

        if ($queues <= 0) {
            $mform->disabledIf('use_queue', 'allow_reg', 'eq', 0);
            $mform->disabledIf('use_queue', 'use_size', 'notchecked');
        }
        $queue = [];
        $queue[] = $mform->createElement('text', 'users_queues_limit', '', ['size' => '3']);
        $queue[] = $mform->createElement('checkbox', 'limit_users_queues', '', get_string('limit', 'grouptool'));
        $mform->addGroup($queue, 'users_queues_grp', get_string('users_queues_limit', 'grouptool'), ' ', false);
        $mform->setType('users_queues_limit', PARAM_TEXT);
        $maxqueues = get_config('mod_grouptool', 'users_queues_limit');
        if ($maxqueues === false) {
            throw new coding_exception('invalid_param');
        }
        if (empty($maxqueues)) {
            $mform->setDefault('users_queues_limit', 0);
            $mform->setDefault('limit_users_queues', 0);
        } else {
            $mform->setDefault('users_queues_limit', $maxqueues);
            $mform->setDefault('limit_users_queues', 1);
        }
        $mform->addHelpButton('users_queues_grp', 'users_queues_limit', 'grouptool');
        if ($queues <= 0) {
            $mform->disabledIf('users_queues_limit', 'limit_users_queues', 'notchecked');
            $mform->hideIf('users_queues_grp', 'use_queue', 'notchecked');
        }
        $mform->hideIf('users_queues_grp', 'allow_reg', 'eq', 0);
        $mform->hideIf('users_queues_grp', 'use_size', 'notchecked');

        $queue = [];
        $queue[] = $mform->createElement('text', 'groups_queues_limit', '', ['size' => '3']);
        $queue[] = $mform->createElement('checkbox', 'limit_groups_queues', '', get_string('limit', 'grouptool'));
        $mform->addGroup($queue, 'groups_queues_grp', get_string('groups_queues_limit', 'grouptool'), ' ', false);
        $mform->setType('groups_queues_limit', PARAM_TEXT);
        $maxqueues = get_config('mod_grouptool', 'groups_queues_limit');
        if ($maxqueues === false) {
            throw new coding_exception('invalid_param');
        }
        if (empty($maxqueues)) {
            $mform->setDefault('groups_queues_limit', 0);
            $mform->setDefault('limit_groups_queues', 0);
        } else {
            $mform->setDefault('groups_queues_limit', $maxqueues);
            $mform->setDefault('limit_groups_queues', 1);
        }
        $mform->addHelpButton('groups_queues_grp', 'groups_queues_limit', 'grouptool');
        if ($queues <= 0) {
            $mform->hideIf('groups_queues_grp', 'use_queue', 'notchecked');
            $mform->disabledIf('groups_queues_limit', 'limit_groups_queues', 'notchecked');
        }
        $mform->hideIf('groups_queues_grp', 'allow_reg', 'eq', 0);
        $mform->hideIf('groups_queues_grp', 'use_size', 'notchecked');

        // Prevent user from unsetting if user is registered in multiple groups!
        $mform->addElement('checkbox', 'allow_multiple', get_string('allow_multiple', 'grouptool'));
        if ($maxregs > 1) {
            $mform->addElement('hidden', 'multreg', 1);
        } else {
            $mform->addElement('hidden', 'multreg', 0);
        }
        $mform->setType('multreg', PARAM_BOOL);
        $mform->setType('allow_multiple', PARAM_BOOL);
        $allowmultiple = get_config('mod_grouptool', 'allow_multiple');
        if ($allowmultiple === false) {
            throw new coding_exception('invalid_param');
        }
        $mform->setDefault('allow_multiple', (($allowmultiple !== false) ? $allowmultiple : 0));
        $mform->addHelpButton('allow_multiple', 'allow_multiple', 'grouptool');
        $mform->disabledIf ('allow_multiple', 'allow_reg', 'eq', 0);

        $mform->addElement('text', 'choose_min', get_string('choose_min', 'grouptool'),
                           ['size' => '3']);
        $mform->setType('choose_min', PARAM_TEXT);
        $choosemin = get_config('mod_grouptool', 'choose_min');
        if ($choosemin === false) {
            throw new coding_exception('invalid_param');
        }
        $mform->setDefault('choose_min', (($choosemin !== false) ? $choosemin : 1));
        $mform->hideIf ('choose_min', 'allow_reg', 'eq', 0);

        $mform->addElement('text', 'choose_max', get_string('choose_max', 'grouptool'),
                           ['size' => '3']);
        $mform->setType('choose_max', PARAM_TEXT);
        $choosemax = get_config('mod_grouptool', 'choose_max');
        if ($choosemax === false) {
            throw new coding_exception('invalid_param');
        }
        $mform->setDefault('choose_max', (($choosemax !== false) ? $choosemax : 1));
        $mform->hideIf ('choose_max', 'allow_reg', 'eq', 0);

        if ($maxregs > 1) {
            $mform->freeze('allow_multiple');
        } else {
            $mform->hideIf ('choose_max', 'allow_multiple', 'notchecked');
            $mform->hideIf ('choose_min', 'allow_multiple', 'notchecked');
        }
        /*
         * ---------------------------------------------------------
         */

        /* -------------------------------------------------------------------------------
         * Adding the "moodlesync" fieldset, where all settings influencing behaviour
         * if groups/groupmembers are added/deleted in moodle are made
         */
        $mform->addElement('header', 'moodlesync', get_string('moodlesync', 'grouptool'));
        $mform->addHelpButton('moodlesync', 'moodlesync', 'grouptool');

        $options = [
                GROUPTOOL_IGNORE => get_string('ignorechanges', 'grouptool'),
                GROUPTOOL_FOLLOW => get_string('followchanges', 'grouptool')
        ];

        $mform->addElement('select', 'ifmemberadded', get_string('ifmemberadded', 'grouptool'),
                           $options);
        $mform->setType('ifmemberadded', PARAM_INT);
        $mform->addHelpButton('ifmemberadded', 'ifmemberadded', 'grouptool');
        $ifmemberadded = get_config('mod_grouptool', 'ifmemberadded');
        if ($ifmemberadded === false) {
            throw new coding_exception('invalid_param');
        }
        $mform->setDefault('ifmemberadded', (($ifmemberadded !== false) ? $ifmemberadded : GROUPTOOL_IGNORE));

        $mform->addElement('select', 'ifmemberremoved', get_string('ifmemberremoved', 'grouptool'),
                           $options);
        $mform->setType('ifmemberremoved', PARAM_INT);
        $mform->addHelpButton('ifmemberremoved', 'ifmemberremoved', 'grouptool');
        $ifmemberremoved = get_config('mod_grouptool', 'ifmemberremoved');
        if ($ifmemberremoved === false) {
            throw new coding_exception('invalid_param');
        }
        $mform->setDefault('ifmemberremoved', (($ifmemberremoved !== false) ? $ifmemberremoved : GROUPTOOL_IGNORE));

        $options = [
                GROUPTOOL_RECREATE_GROUP => get_string('recreate_group', 'grouptool'),
                GROUPTOOL_DELETE_REF => get_string('delete_reference', 'grouptool')
        ];
        $mform->addElement('select', 'ifgroupdeleted', get_string('ifgroupdeleted', 'grouptool'),
                           $options);
        $mform->setType('ifgroupdeleted', PARAM_INT);
        $mform->addHelpButton('ifgroupdeleted', 'ifgroupdeleted', 'grouptool');
        $ifgroupdeleted = get_config('mod_grouptool', 'ifgroupdeleted');
        if ($ifgroupdeleted === false) {
            throw new coding_exception('invalid_param');
        }
        $mform->setDefault('ifgroupdeleted', (($ifgroupdeleted !== false) ? $ifgroupdeleted : GROUPTOOL_RECREATE_GROUP));

        /*
         * ---------------------------------------------------------
         */

        /* ------------------------------------------------------------------------------
         * add standard elements, common to all modules
         */
        $this->standard_coursemodule_elements();

        /* ------------------------------------------------------------------------------
         * add standard buttons, common to all modules
         */
        $this->add_action_buttons();
    }

    /**
     * Only available on moodleform_mod.
     *
     * @param array $defaultvalues passed by reference
     */
    public function data_preprocessing(&$defaultvalues) {
        if (array_key_exists('users_queues_limit', $defaultvalues) && ($defaultvalues['users_queues_limit'] > 0)) {
            $defaultvalues['limit_users_queues'] = 1;
        } else {
            $defaultvalues['limit_users_queues'] = 0;
        }
        if (array_key_exists('groups_queues_limit', $defaultvalues) && ($defaultvalues['groups_queues_limit'] > 0)) {
            $defaultvalues['limit_groups_queues'] = 1;
        } else {
            $defaultvalues['limit_groups_queues'] = 0;
        }

        parent::data_preprocessing($defaultvalues);
    }

    /**
     * Validation for mod_form
     * If there are errors return array of errors ("fieldname"=>"error message"),
     * otherwise true if ok.
     *
     * @param array $data array of ("fieldname"=>value) of submitted data
     * @param array $files array of uploaded files "element_name"=>tmp_file_path
     * @return array of "element_name"=>"error_description" if there are errors,
     *               or an empty array if everything is OK.
     * @throws coding_exception
     * @throws dml_exception
     */
    public function validation($data, $files) {
        global $DB;
        $parenterrors = parent::validation($data, $files);
        $errors = [];
        if (!empty($data['timedue']) && ($data['timedue'] <= $data['timeavailable'])) {
            $errors['timedue'] = get_string('determinismerror', 'grouptool');
        }

        if (!empty($data['use_size'])
            && (($data['grpsize'] <= 0) || !ctype_digit($data['grpsize']))
            ) {
            $errors['size_grp'] = get_string('grpsizezeroerror', 'grouptool');
        }
        if (!empty($data['instance'])) {
            $sql = '
     SELECT MAX(regcnt)
        FROM (
      SELECT COUNT(reg.id) AS regcnt
        FROM {grouptool_registered} reg
        JOIN {grouptool_agrps} agrps ON reg.agrpid = agrps.id
       WHERE agrps.grouptoolid = :grouptoolid
             AND reg.modified_by >= 0
    GROUP BY reg.agrpid) regcnts';
            $params = ['grouptoolid' => $data['instance']];
            $maxgrpregs = $DB->get_field_sql($sql, $params);
            $sql = '
      SELECT MAX(regcnt)
        FROM (SELECT COUNT(reg.id) AS regcnt
                FROM {grouptool_registered} reg
                JOIN {grouptool_agrps} agrps ON reg.agrpid = agrps.id
               WHERE agrps.grouptoolid = :grouptoolid
                     AND reg.modified_by >= 0
            GROUP BY reg.userid) regcnts';
            $params = ['grouptoolid' => $data['instance']];
            $maxuserregs = $DB->get_field_sql($sql, $params);
            $sql = '
      SELECT MIN(regcnt)
        FROM (SELECT COUNT(reg.id) AS regcnt
                FROM {grouptool_registered} reg
                JOIN {grouptool_agrps} agrps ON reg.agrpid = agrps.id
               WHERE agrps.grouptoolid = :grouptoolid
                     AND reg.modified_by >= 0
            GROUP BY reg.userid) regcnts
       WHERE regcnt > 0';
            $params = ['grouptoolid' => $data['instance']];
            $minuserregs = $DB->get_field_sql($sql, $params);
            $sql = '
      SELECT COUNT(queue.id) AS queue
        FROM {grouptool_queued} queue
        JOIN {grouptool_agrps} agrps ON queue.agrpid = agrps.id
       WHERE agrps.grouptoolid = :grouptoolid
             AND agrps.active = 1';
            $params = ['grouptoolid' => $data['instance']];
            $queues = $DB->get_field_sql($sql, $params);
        } else {
            $maxgrpregs = 0;
            $maxuserregs = 0;
            $minuserregs = 0;
            $queues = 0;
        }
        if (!empty($data['use_size']) && ($data['grpsize'] < $maxgrpregs)
            ) {
            if (empty($errors['size_grp'])) {
                $errors['size_grp'] = get_string('toomanyregs', 'grouptool');
            } else {
                $errors['size_grp'] .= get_string('toomanyregs', 'grouptool');
            }
        }

        if (!empty($data['use_queue']) && !empty($data['limit_groups_queues']) && ($data['groups_queues_limit'] <= 0)) {
            $errors['groups_queues_grp'] = get_string('queuesizeerror', 'grouptool');
        }

        if (!empty($data['use_queue']) && !empty($data['limit_users_queues']) && ($data['users_queues_limit'] <= 0)) {
            $errors['users_queues_grp'] = get_string('queuesizeerror', 'grouptool');
        }

        if (array_key_exists('use_queue', $data) && empty($data['use_queue']) && ($queues > 0)) {
            $errors['queue_grp'] = get_string('queuespresenterror', 'grouptool');
        }

        if (!empty($data['allow_multiple']) && ($data['choose_min'] < 0)) {
            $errors['choose_min'] = get_string('mustbegtoeqmin', 'grouptool');
        }

        if (!empty($data['allow_multiple']) && ($data['choose_max'] <= 0)) {
            $errors['choose_max'] = get_string('mustbeposint', 'grouptool');
        }

        if (!empty($data['allow_multiple']) && ($data['choose_min'] > $data['choose_max'])) {
            if (isset($errors['choose_max'])) {
                $errors['choose_max'] .= html_writer::empty_tag('br').
                                         get_string('mustbegtoeqmin', 'grouptool');
            } else {
                $errors['choose_max'] = get_string('mustbegtoeqmin', 'grouptool');
            }
        }

        if (!empty($data['allow_multiple']) && ($data['choose_max'] < $maxuserregs)) {
            if (isset($errors['choose_max'])) {
                $errors['choose_max'] .= html_writer::empty_tag('br').
                                         get_string('toomanyregspresent', 'grouptool',
                                                    $maxuserregs);
            } else {
                $errors['choose_max'] = get_string('toomanyregspresent', 'grouptool',
                                                   $maxuserregs);
            }
        }

        if (!empty($data['allow_multiple']) && !empty($minuserregs)
            && ($data['choose_min'] > $minuserregs)) {
            if (isset($errors['choose_min'])) {
                $errors['choose_min'] .= html_writer::empty_tag('br').
                                         get_string('toolessregspresent', 'grouptool',
                                                    $minuserregs);
            } else {
                $errors['choose_min'] = get_string('toolessregspresent', 'grouptool',
                                                   $minuserregs);
            }
        }

        if (!empty($data['allow_multiple']) && preg_match('/[0-9]+/', $data['choose_min']) == 0) {
            $errors['choose_min'] = get_string('mustbegt0', 'grouptool');
        }
        return array_merge($parenterrors, $errors);
    }
}