From dc81e7081be7b4738f7f9635ea40699128c7dc93 Mon Sep 17 00:00:00 2001 From: Jared Hancock <jared@osticket.com> Date: Thu, 2 Jan 2014 16:39:01 -0600 Subject: [PATCH] Fix up search on dynamic fields Fix adding fields to an existing form --- include/ajax.tickets.php | 27 +++++++++++++-------------- include/class.dynamic_forms.php | 19 ++++++++++++------- scp/forms.php | 1 + 3 files changed, 26 insertions(+), 21 deletions(-) diff --git a/include/ajax.tickets.php b/include/ajax.tickets.php index c44f8dbf2..ceb824e2b 100644 --- a/include/ajax.tickets.php +++ b/include/ajax.tickets.php @@ -207,30 +207,29 @@ class TicketsAjaxAPI extends AjaxController { } // Dynamic fields - $dynfields='(SELECT entry.object_id, %s '. - 'FROM '.FORM_ANSWER_TABLE.' ans '. - 'JOIN '.FORM_ENTRY_TABLE.' entry ON entry.id=ans.entry_id '. - 'JOIN '.FORM_FIELD_TABLE.' field ON field.id=ans.field_id '. - 'WHERE entry.object_type="T" GROUP BY entry.object_id)'; - $vals = array(); + $cdata_search = false; foreach (TicketForm::getInstance()->getFields() as $f) { if (isset($req[$f->getFormName()]) && ($val = $req[$f->getFormName()])) { - $id = $f->get('id'); - $vals[] = "MAX(IF(field.id = '$id', ans.value_id, NULL)) as `f_{$id}_id`"; - $vals[] = "MAX(IF(field.id = '$id', ans.value, NULL)) as `f_$id`"; - $where .= " AND (dyn.`f_{$id}_id` = ".db_input($val) - . " OR dyn.`f_$id` LIKE '%".db_real_escape($val)."%')"; + $name = $f->get('name') ? $f->get('name') : 'field_'.$f->get('id'); + $cwhere = "cdata.`$name` LIKE '%".db_real_escape($val)."%'"; + if ($f->getImpl()->hasIdValue() && is_numeric($val)) + $cwhere .= " OR cdata.`{$name}_id` = ".db_input($val); + $where .= ' AND ('.$cwhere.')'; + $cdata_search = true; } } - if ($vals) - $from .= ' LEFT JOIN '.sprintf($dynfields, implode(',', $vals)) - ." dyn ON (dyn.object_id = ticket.ticket_id)"; + if ($cdata_search) + $from .= 'LEFT JOIN '.TABLE_PREFIX.'ticket__cdata ' + ." cdata ON (cdata.ticket_id = ticket.ticket_id)"; $sections = array(); foreach ($joins as $j) { $sections[] = "$select $from {$j['from']} $where AND ({$j['where']})"; } + if (!$joins) + $sections[] = "$select $from $where"; + $sql=implode(' union ', $sections); $res = db_query($sql); diff --git a/include/class.dynamic_forms.php b/include/class.dynamic_forms.php index f48303754..54415b9b5 100644 --- a/include/class.dynamic_forms.php +++ b/include/class.dynamic_forms.php @@ -209,13 +209,16 @@ class TicketForm extends DynamicForm { if (!$impl->hasData() || $impl->isPresentationOnly()) continue; + $name = ($f->get('name')) ? $f->get('name') + : 'field_'.$f->get('id'); + $fields[] = sprintf( 'MAX(IF(field.name=\'%1$s\',ans.value,NULL)) as `%1$s`', - $f->get('name')); + $name); if ($impl->hasIdValue()) { $fields[] = sprintf( 'MAX(IF(field.name=\'%1$s\',ans.value_id,NULL)) as `%1$s_id`', - $f->get('name')); + $name); } } return $fields; @@ -266,11 +269,12 @@ class TicketForm extends DynamicForm { // $record[$f] = $answer->value' // TicketFormData::objects()->filter(array('ticket_id'=>$a)) // ->merge($record); - $f = $answer->getField()->get('name'); - $ids = $answer->getField()->hasIdValue(); - $fields = sprintf('`%s`=', $f) . db_input($answer->get('value')); - if ($answer->getField()->hasIdValue()) - $fields .= sprintf(',`%s_id`=', $f) . db_input($answer->getIdValue()); + $f = $answer->getField(); + $name = $f->get('name') ? $f->get('name') : 'field_'.$f->get('id'); + $ids = $f->hasIdValue(); + $fields = sprintf('`%s`=', $name) . db_input($answer->get('value')); + if ($f->hasIdValue()) + $fields .= sprintf(',`%s_id`=', $name) . db_input($answer->getIdValue()); $sql = 'INSERT INTO `'.TABLE_PREFIX.'ticket__cdata` SET '.$fields .', `ticket_id`='.db_input($answer->getEntry()->get('object_id')) .' ON DUPLICATE KEY UPDATE '.$fields; @@ -287,6 +291,7 @@ Filter::addSupportedMatches('Custom Fields', function() { } return $matches; }); +// Manage materialized view on custom data updates Signal::connect('model.created', array('TicketForm', 'updateDynamicDataView'), 'DynamicFormEntryAnswer'); diff --git a/scp/forms.php b/scp/forms.php index 5af2dd327..6f14be6c1 100644 --- a/scp/forms.php +++ b/scp/forms.php @@ -99,6 +99,7 @@ if($_POST) { 'private'=>$_POST["private-new-$i"] == 'on' ? 1 : 0, 'required'=>$_POST["required-new-$i"] == 'on' ? 1 : 0 )); + $field->setForm($form); if ($field->isValid()) $field->save(); else -- GitLab