Example #1
0
 /**
  * This event runs after we have built the query used to fetch a record
  * list in a model. It is used to apply automatic query filters.
  *
  * @param   DataModel  &$model  The model which calls this event
  * @param   JDatabaseQuery      &$query  The query we are manipulating
  *
  * @return  void
  */
 public function onAfterBuildQuery(&$model, &$query)
 {
     $tableKey = $model->getIdFieldName();
     $db = $model->getDbo();
     $fields = $model->getTableFields();
     $backlist = $model->blacklistFilters();
     $filterZero = $model->getBehaviorParam('filterZero', null);
     $tableAlias = $model->getBehaviorParam('tableAlias', null);
     foreach ($fields as $fieldname => $fieldmeta) {
         if (in_array($fieldname, $backlist)) {
             continue;
         }
         $fieldInfo = (object) array('name' => $fieldname, 'type' => $fieldmeta->Type, 'filterZero' => $filterZero, 'tableAlias' => $tableAlias);
         $filterName = $fieldInfo->name;
         $filterState = $model->getState($filterName, null);
         // Special primary key handling: if ignore request is set we'll also look for an 'id' state variable if a
         // state variable by the same name as the key doesn't exist. If ignore request is not set in the model we
         // do not filter by 'id' since this interferes with going from an edit page to a browse page (the list is
         // filtered by id without user controls to unset it).
         if ($fieldInfo->name == $tableKey) {
             $filterState = $model->getState($filterName, null);
             if (!$model->getIgnoreRequest()) {
                 continue;
             }
             if (empty($filterState)) {
                 $filterState = $model->getState('id', null);
             }
         }
         $field = DataModel\Filter\AbstractFilter::getField($fieldInfo, array('dbo' => $db));
         if (!is_object($field) || !$field instanceof DataModel\Filter\AbstractFilter) {
             continue;
         }
         if (is_array($filterState) && (array_key_exists('value', $filterState) || array_key_exists('from', $filterState) || array_key_exists('to', $filterState)) || is_object($filterState)) {
             $options = new \JRegistry($filterState);
         } else {
             $options = new \JRegistry();
             $options->set('value', $filterState);
         }
         $methods = $field->getSearchMethods();
         $method = $options->get('method', $field->getDefaultSearchMethod());
         if (!in_array($method, $methods)) {
             $method = 'exact';
         }
         switch ($method) {
             case 'between':
             case 'outside':
                 $sql = $field->{$method}($options->get('from', null), $options->get('to', null), $options->get('include', false));
                 break;
             case 'interval':
                 $sql = $field->{$method}($options->get('value', null), $options->get('interval'));
                 break;
             case 'search':
                 $sql = $field->{$method}($options->get('value', null), $options->get('operator', '='));
                 break;
             case 'exact':
             case 'partial':
             default:
                 $sql = $field->{$method}($options->get('value', null));
                 break;
         }
         if ($sql) {
             $query->where($sql);
         }
     }
 }
Example #2
0
 /**
  * @group           AbstractFilter
  * @group           AbstractFilterGetFieldType
  * @covers          FOF30\Model\DataModel\Filter\AbstractFilter::getFieldType
  * @dataProvider    AbstractFilterDataprovider::getTestGetFieldType
  */
 public function testGetFieldType($test, $check)
 {
     $msg = 'AbstractFilter::getFieldType %s - Case: ' . $check['case'];
     $result = AbstractFilter::getFieldType($test['type']);
     $this->assertEquals($check['result'], $result, sprintf($msg, 'Failed to get the correct field type'));
 }