diff --git a/include/class.forms.php b/include/class.forms.php index a0192de63c2affad1f24e7db991a0b6ab2a5c51b..ea0947e44fbd2db2450f7a5c65d96ce15f229cef 100644 --- a/include/class.forms.php +++ b/include/class.forms.php @@ -1252,6 +1252,18 @@ class BooleanField extends FormField { 'set.not' => null, ); } + + function getSearchQ($method, $value, $name=false) { + $name = $name ?: $this->get('name'); + switch ($method) { + case 'set': + return new Q(array($name => '1')); + case 'set.not': + return new Q(array($name => '0')); + default: + return parent::getSearchQ($method, $value, $name); + } + } } class ChoiceField extends FormField { diff --git a/include/class.search.php b/include/class.search.php index 43a9cb30c182d76b849ece53538812ea5abe44f5..1236d14bb415f11e92d836764163f06b92721a38 100644 --- a/include/class.search.php +++ b/include/class.search.php @@ -795,6 +795,7 @@ class SavedSearch extends VerySimpleModel { foreach ($form->getFields() as $f) { if (substr($f->get('name'), -7) == '+search' && $f->getClean()) { $name = substr($f->get('name'), 0, -7); + $filter = new Q(); // Determine the search method and fetch the original field if (($M = $form->getField("{$name}+method")) && ($method = $M->getClean()) @@ -816,12 +817,6 @@ class SavedSearch extends VerySimpleModel { ); $column = $field->get('name') ?: 'field_'.$field->get('id'); list($type,$id) = explode('!', $name, 2); - $OP = $other_paths[$type]; - if ($type == ':field') { - $DF = DynamicFormField::lookup($id); - TicketModel::registerCustomData($DF->form); - $OP = 'cdata+'.$DF->form->id.'__'; - } // XXX: Last mile — find a better idea switch (array($type, $column)) { case array(':user', 'name'): @@ -834,13 +829,21 @@ class SavedSearch extends VerySimpleModel { $name = 'user__org__name'; break; default: + if ($type == ':field' && $id) { + $name = 'entries__answers__value'; + $filter->add(array('entries__answers__field_id' => $id)); + break; + } + $OP = $other_paths[$type]; $name = $OP . $column; } } // Add the criteria to the QuerySet - if ($Q = $field->getSearchQ($method, $value, $name)) - $qs = $qs->filter($Q); + if ($Q = $field->getSearchQ($method, $value, $name)) { + $filter->add($Q); + $qs = $qs->filter($filter); + } } } } diff --git a/include/class.ticket.php b/include/class.ticket.php index 86634603200f535244e7bacfc261d4e6566f0d26..1cb11c7f80f381d7e924b8adaee9ce3eeba245c5 100644 --- a/include/class.ticket.php +++ b/include/class.ticket.php @@ -81,6 +81,12 @@ class TicketModel extends VerySimpleModel { 'reverse' => 'TicketCData.ticket', 'list' => false, ), + 'entries' => array( + 'constraint' => array( + "'T'" => 'DynamicFormEntry.object_type', + 'ticket_id' => 'DynamicFormEntry.object_id', + ), + ), ) );