/** * Get the filters defined by the user. * * @return array Of filter data from the DB, though properties is already json_decoded. */ public function get_user_filters() { global $DB; $results = $DB->get_recordset('block_xp_filters', array('courseid' => $this->manager->get_courseid()), 'sortorder ASC, id ASC'); $filters = array(); foreach ($results as $key => $filter) { $filters[$filter->id] = block_xp_filter::load_from_data($filter); } $results->close(); return $filters; }
$filtermanager = $manager->get_filter_manager(); $userfilters = $filtermanager->get_user_filters(); // Check for $add. if ($add !== preg_replace('/[^a-z0-9_\\\\]/', '', $add)) { // Invalid event. $add = null; } $form = new block_xp_rules_form($url, array('filters' => $userfilters, 'staticfilters' => block_xp_filter_manager::get_static_filters(), 'add' => $add)); if ($data = $form->get_data()) { // New rules. foreach ($data->newfilter as $key => $values) { if (empty($values['value'])) { continue; } $rule = new block_xp_rule_property($values['compare'], $values['value'], $values['property']); $filter = block_xp_filter::load_from_data(array('rule' => $rule, 'courseid' => $manager->get_courseid(), 'points' => $values['f_points'], 'sortorder' => 0)); $filter->save(); } // Existing rules. if (isset($data->filter)) { foreach ($data->filter as $id => $values) { if ($id < 1 || !isset($userfilters[$id])) { continue; } $filter = $userfilters[$id]; if (empty($values['value']) && !is_numeric($values['value'])) { $filter->delete(); } else { $rule = new block_xp_rule_property($values['compare'], $values['value'], $values['property']); $filter->set_rule($rule); $filter->set_points($values['f_points']);
/** * Definintion. * * @return void */ public function definition() { $mform = $this->_form; $filters = $this->_customdata['filters']; $staticfilters = $this->_customdata['staticfilters']; // Add empty rule. $mform->addElement('header', 'newhdr', 'Add new rules'); $mform->addElement('static', '', '', get_string('addrulesformhelp', 'block_xp')); if ($this->_customdata['add']) { $filteradd = block_xp_filter::load_from_data(array('rule' => new block_xp_rule_property(block_xp_rule_base::EQ, $this->_customdata['add'], 'eventname'))); $this->create_group(null, $filteradd); } else { $this->create_group(); } $this->create_group(); $this->create_group(); // Add existing filters. if ($filters) { $mform->addElement('header', 'existhdr', 'Existing rules'); $mform->setExpanded('existhdr', true); $mform->addElement('static', '', '', get_string('existingruleformhelp', 'block_xp')); foreach ($filters as $filter) { $this->create_group($filter); } } $mform->addElement('header', 'defaulthdr', 'Default rules'); $mform->addElement('static', '', '', get_string('defaultrulesformhelp', 'block_xp')); foreach ($staticfilters as $filter) { $this->create_group($filter); } $this->add_action_buttons(); }
public function test_custom_filters() { $this->resetAfterTest(true); $course = $this->getDataGenerator()->create_course(); $manager = block_xp_manager::get($course->id); $fm = $manager->get_filter_manager(); // Define some custom rules, the sortorder and IDs are mixed here. $rule = new block_xp_rule_property(block_xp_rule_base::EQ, 'c', 'crud'); $data = array('courseid' => $course->id, 'sortorder' => 1, 'points' => 100, 'rule' => $rule); block_xp_filter::load_from_data($data)->save(); $rule = new block_xp_ruleset(array(new block_xp_rule_property(block_xp_rule_base::EQ, 2, 'objectid'), new block_xp_rule_property(block_xp_rule_base::EQ, 'u', 'crud')), block_xp_ruleset::ANY); $data = array('courseid' => $course->id, 'sortorder' => 2, 'points' => 120, 'rule' => $rule); block_xp_filter::load_from_data($data)->save(); $rule = new block_xp_ruleset(array(new block_xp_rule_property(block_xp_rule_base::GTE, 100, 'objectid'), new block_xp_rule_property(block_xp_rule_base::EQ, 'r', 'crud')), block_xp_ruleset::ALL); $data = array('courseid' => $course->id, 'sortorder' => 0, 'points' => 130, 'rule' => $rule); block_xp_filter::load_from_data($data)->save(); // We can override default filters. $e = \block_xp\event\something_happened::mock(array('crud' => 'c', 'objectid' => 2)); $this->assertSame(100, $fm->get_points_for_event($e)); // We can still fallback on default filters. $e = \block_xp\event\something_happened::mock(array('crud' => 'd')); $this->assertSame(0, $fm->get_points_for_event($e)); // Sort order is respected. $e = \block_xp\event\something_happened::mock(array('crud' => 'u', 'objectid' => 2)); $this->assertSame(120, $fm->get_points_for_event($e)); $e = \block_xp\event\something_happened::mock(array('crud' => 'r')); $this->assertSame(9, $fm->get_points_for_event($e)); $e = \block_xp\event\something_happened::mock(array('crud' => 'r', 'objectid' => 100)); $this->assertSame(130, $fm->get_points_for_event($e)); // This filter will catch everything before the default rules. $rule = new block_xp_rule_property(block_xp_rule_base::CT, 'something', 'eventname'); $data = array('courseid' => $course->id, 'sortorder' => 3, 'points' => 110, 'rule' => $rule); block_xp_filter::load_from_data($data)->save(); $e = \block_xp\event\something_happened::mock(array('crud' => 'd')); $this->assertSame(110, $fm->get_points_for_event($e)); $e = \block_xp\event\something_happened::mock(array('crud' => 'r')); $this->assertSame(110, $fm->get_points_for_event($e)); // This filter will catch everything. $rule = new block_xp_rule_property(block_xp_rule_base::CT, 'something', 'eventname'); $data = array('courseid' => $course->id, 'sortorder' => -1, 'points' => -10, 'rule' => $rule); block_xp_filter::load_from_data($data)->save(); $e = \block_xp\event\something_happened::mock(array('crud' => 'u', 'objectid' => 2)); $this->assertSame(-10, $fm->get_points_for_event($e)); $e = \block_xp\event\something_happened::mock(array('crud' => 'r', 'objectid' => 100)); $this->assertSame(-10, $fm->get_points_for_event($e)); $e = \block_xp\event\something_happened::mock(array('crud' => 'd')); $this->assertSame(-10, $fm->get_points_for_event($e)); $e = \block_xp\event\something_happened::mock(array('crud' => 'r')); $this->assertSame(-10, $fm->get_points_for_event($e)); }
} $filter->save(); $filterids[$filter->get_id()] = true; } // Check for filters to be deleted. foreach ($userfilters as $filterid => $filter) { if (!array_key_exists($filterid, $filterids)) { $filter->delete(); } } $filtermanager->invalidate_filters_cache(); redirect($url, get_string('changessaved')); } // Preparing form. $dummyruleset = new block_xp_ruleset(); $dummyfilter = block_xp_filter::load_from_data(array('rule' => $dummyruleset)); $templatefilter = $renderer->render($dummyfilter); // Templates of rules. $typeruleproperty = new block_xp_rule_property(); $typerulecm = new block_xp_rule_cm($manager->get_courseid()); $typeruleevent = new block_xp_rule_event(); $typeruleset = new block_xp_ruleset(); $templatetypes = array('block_xp_rule_cm' => array('name' => get_string('rulecm', 'block_xp'), 'template' => $renderer->render($typerulecm, array('iseditable' => true, 'basename' => 'XXXXX'))), 'block_xp_rule_event' => array('name' => get_string('ruleevent', 'block_xp'), 'template' => $renderer->render($typeruleevent, array('iseditable' => true, 'basename' => 'XXXXX'))), 'block_xp_rule_property' => array('name' => get_string('ruleproperty', 'block_xp'), 'template' => $renderer->render($typeruleproperty, array('iseditable' => true, 'basename' => 'XXXXX'))), 'block_xp_ruleset' => array('name' => get_string('ruleset', 'block_xp'), 'template' => $renderer->render($typeruleset, array('iseditable' => true, 'basename' => 'XXXXX')))); $PAGE->requires->yui_module('moodle-block_xp-filters', 'Y.M.block_xp.Filters.init', array(array('filter' => $templatefilter, 'rules' => $templatetypes))); $PAGE->requires->strings_for_js(array('pickaconditiontype'), 'block_xp'); echo $OUTPUT->header(); echo $OUTPUT->heading($strcourserules); echo $renderer->navigation($manager, 'rules'); echo $renderer->notices($manager); $a = new stdClass(); $a->list = (new moodle_url('/report/eventlist/index.php'))->out();