Exemple #1
0
 /**
  * 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();
 }