/** * Generates a dataform filter. * @param array|stdClass $record * @param array $options * @return stdClass generated object */ public function create_filter($record, array $options = null) { $record = (object) (array) $record; $filter = new \mod_dataform\pluginbase\dataformfilter($record); $fieldman = new \mod_dataform_field_manager($record->dataid); // Append sort options if specified. if (!empty($record->sortoptions)) { // Convert fieldname[,element] sortdir to // fieldid => (element,sortdir). $sorties = array(); foreach (explode(';', $record->sortoptions) as $sortoption) { list($fieldname, $element, $sortdir) = explode(',', $sortoption); if ($field = $fieldman->get_field_by_name($fieldname)) { $sorties[$field->id] = array($element, $sortdir); } } $filter->append_sort_options($sorties); } // Append search options if specified. if (!empty($record->searchoptions)) { // Convert AND|OR,fieldname,element,[NOT],operator,value to // fieldid => (endor => (element, not, operator, value)). $searchoptions = array(); foreach (explode(';', $record->searchoptions) as $searchoption) { list($andor, $fieldname, $element, $isnot, $op, $value) = explode(',', $searchoption); if ($field = $fieldman->get_field_by_name($fieldname)) { $searchy = array($andor => array(array($element, $isnot, $op, $value))); if (empty($searchoptions[$field->id])) { $searchoptions[$field->id] = $searchy; } else { $searchoptions[$field->id] = array_merge_recursive($searchoptions[$field->id], $searchy); } } } $filter->append_search_options($searchoptions); } $filter->update(); return $filter->instance; }
/** * Set up function. In this instance we are setting up dataform * entries to be used in the unit tests. */ public function test_filter() { global $DB; $this->resetAfterTest(); $this->setAdminUser(); // Course. $course = $this->getDataGenerator()->create_course(); // Dataform. $dataform = $this->getDataGenerator()->create_module('dataform', array('course' => $course->id)); $df = mod_dataform_dataform::instance($dataform->id); // Add a field. $field = $df->field_manager->add_field('text'); // Add a view. $view = $df->view_manager->add_view('aligned'); // Get an entry manager. $entryman = $view->entry_manager; $values = array('Hello', 'World', 'Hello world', '42'); // Prepare data for processing. $fieldname = "field_{$field->id}_"; $data = array('submitbutton_save' => 'Save'); $eids = array(); $i = 0; foreach ($values as $value) { $i--; $data["{$fieldname}{$i}"] = $value; $eids[] = $i; } // Add entries. list(, $eids) = $entryman->process_entries('update', $eids, (object) $data, true); $numentries = count($values); // No criteria. $filter = $view->filter; $expected = $numentries; $actual = $entryman->count_entries(array('filter' => $filter)); $this->assertEquals($expected, $actual); // First entry specified. $filter = new \mod_dataform\pluginbase\dataformfilter($view->filter->instance); $filter->eids = reset($eids); $expected = 1; $actual = $entryman->count_entries(array('filter' => $filter)); $this->assertEquals($expected, $actual); // All entries specified. $filter = new \mod_dataform\pluginbase\dataformfilter($view->filter->instance); $filter->eids = $eids; $expected = $numentries; $actual = $entryman->count_entries(array('filter' => $filter)); $this->assertEquals($expected, $actual); // NOT Empty: 4. $filter = new \mod_dataform\pluginbase\dataformfilter($view->filter->instance); $searchoptions = array($field->id => array('AND' => array(array('content', 'NOT', '', '')))); $filter->append_search_options($searchoptions); $expected = 4; $actual = $entryman->count_entries(array('filter' => $filter)); $this->assertEquals($expected, $actual); // NOT = 'Hello': 3. $filter = new \mod_dataform\pluginbase\dataformfilter($view->filter->instance); $searchoptions = array($field->id => array('AND' => array(array('content', 'NOT', '=', 'Hello')))); $filter->append_search_options($searchoptions); $expected = 3; $actual = $entryman->count_entries(array('filter' => $filter)); $this->assertEquals($expected, $actual); // Equals 'Hello': 1. $filter = new \mod_dataform\pluginbase\dataformfilter($view->filter->instance); $searchoptions = array($field->id => array('AND' => array(array('content', '', '=', 'Hello')))); $filter->append_search_options($searchoptions); $expected = 1; $actual = $entryman->count_entries(array('filter' => $filter)); $this->assertEquals($expected, $actual); // Equals 'World': 1. $filter = new \mod_dataform\pluginbase\dataformfilter($view->filter->instance); $searchoptions = array($field->id => array('AND' => array(array('content', '', '=', 'World')))); $filter->append_search_options($searchoptions); $expected = 1; $actual = $entryman->count_entries(array('filter' => $filter)); $this->assertEquals($expected, $actual); // Like 'hello': 2. $filter = new \mod_dataform\pluginbase\dataformfilter($view->filter->instance); $searchoptions = array($field->id => array('AND' => array(array('content', '', 'LIKE', 'Hello')))); $filter->append_search_options($searchoptions); $expected = 2; $actual = $entryman->count_entries(array('filter' => $filter)); $this->assertEquals($expected, $actual); // Equals 'Hello' and Equals 'World': 0. $filter = new \mod_dataform\pluginbase\dataformfilter($view->filter->instance); $searchoptions = array($field->id => array('AND' => array(array('content', '', '=', 'Hello'), array('content', '', '=', 'World')))); $filter->append_search_options($searchoptions); $expected = 0; $actual = $entryman->count_entries(array('filter' => $filter)); $this->assertEquals($expected, $actual); // Equals 'Hello' or LIKE 'World': 3. $filter = new \mod_dataform\pluginbase\dataformfilter($view->filter->instance); $searchoptions = array($field->id => array('OR' => array(array('content', '', '=', 'Hello'), array('content', '', 'LIKE', 'World')))); $filter->append_search_options($searchoptions); $expected = 3; $actual = $entryman->count_entries(array('filter' => $filter)); $this->assertEquals($expected, $actual); // Like 'llo' and Like 'rld' and ('42' or 'Hello'): 2. $filter = new \mod_dataform\pluginbase\dataformfilter($view->filter->instance); $searchoptions = array($field->id => array('OR' => array(array('content', '', 'LIKE', 'llo'), array('content', '', 'LIKE', 'rld'), array('content', '', 'LIKE', '4')), 'AND' => array(array('content', '', '=', '42')))); $filter->append_search_options($searchoptions); $expected = 1; $actual = $entryman->count_entries(array('filter' => $filter)); $this->assertEquals($expected, $actual); $df->delete(); }