diff --git a/include/ajax.tickets.php b/include/ajax.tickets.php index c44f8dbf2bd64afccc1fd8bcc603d3d15c42ce6c..ceb824e2bb7e3c61c87582dc197b36c725d5ec67 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 f48303754b3e1e18b7bc62f94b5f05267617c1a3..54415b9b509d4938e336d586bb58a749c7e9a54b 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 5af2dd327781d18adca740b46ad654eb272929db..6f14be6c1a2bec06aea87c6f1c4c97d9db177efd 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