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