/**
  * 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();