формирование JSON из запроса Coldfusion для использования в автозаполнении JQuery - PullRequest
2 голосов
/ 19 октября 2011

Я в тупике. У меня есть функция автозаполнения, которая работала при вызове из автозаполнения ColdFusion. Теперь я пытаюсь преобразовать страницу, чтобы использовать ввод автозаполнения jQuery, и не могу заставить ее работать. Вот существующая функция в autosuggest.cfc:

<cffunction name="lookupSerialNumber" access="remote" returntype="Array" >
    <cfargument name="search" type="any" required="false" default="">

    <!--- Define variables --->
    <cfset var data="">
    <cfset var result=ArrayNew(1)>

    <!--- Do search --->
    <cfquery name="data">
        SELECT DISTINCT SERIAL_NUMBER
        FROM myTable
        WHERE SERIAL_NUMBER LIKE '%#trim(ARGUMENTS.search)#%'
        ORDER BY SERIAL_NUMBER
    </cfquery>

    <!--- Build result array --->
    <cfloop query="data">
        <cfset ArrayAppend(result, list)>
    </cfloop>

    <!--- And return it --->
    <cfreturn result />
</cffunction>

Когда я вызываю его с моего автозаполнения после ввода "01", Консоль показывает ответ, подобный этому:

   ["0000003001","0100002000","0100002001","0100002002","0100002003","0100002004",7300000100,7300000101,7300000102,7300000103,7300000104,7300000105,7300000107,7300000108,7300000109,7300000110,7300000111,7300000112]

Обратите внимание, что первые шесть ответов заключены в двойные кавычки, а остальные нет. Автозаполнение показывает первые шесть ответов, но не остальные.

Так что это моя первая проблема. Во-вторых, я хочу, чтобы ответ был вставлен как в текст, так и в значение ввода; в настоящее время только текст показывает ответ. Я не удивлен, так как я возвращаю только одно значение. Однако я не могу понять, как этого добиться.

Я попытался инициализировать автозаполнение с помощью функции разбора, например так:

$(document).ready(function(){
        $('#myInputID').autocomplete(
            {source: function(request, response) {
                $.ajax({
                    url: "cfc/autoSuggest.cfc?method=lookupSerialNumber>&returnformat=json",
                    dataType: "json",
                    data: {
                      search: request.term,
                      maxRows: 10
                    },
                    success: function(data) {
                      response(data);
                    }                   
                })
            },
            parse: function(data){
                return $.map(data, function(item) {
                    return { data: item, value: item, result: item };
                });
            }
        });
    });

но это ничего не дает. Так как функция синтаксического анализа отсутствует в API автозаполнения, я слетаю вслепую.

Я подумал, что эти проблемы были достаточно связаны, чтобы не разделить их на два вопроса; дайте мне знать, если вы думаете, что я должен. Как всегда, спасибо.

Ответы [ 3 ]

9 голосов
/ 19 октября 2011

Поместите результаты запроса в структуру и добавьте ее в массив.Затем преобразовать в JSON.При автозаполнении ожидается возврат json, а также поле label, value или оба.Вот пример:

<cffunction name="lookupSerialNumber" access="remote" returntype="String" >
    <cfargument name="search" type="any" default="">

    <!--- Define variables --->
    <cfset var data="">
    <cfset var result=ArrayNew(1)>
    <cfset var returnStruct = "">


    <!--- Do search --->
    <cfquery name="data">
        SELECT DISTINCT SERIAL_NUMBER
        FROM myTable
        WHERE SERIAL_NUMBER LIKE <cfqueryparam value="%#trim(ARGUMENTS.search)#%" 
                                     cfsqltype="cf_sql_varchar">

        ORDER BY SERIAL_NUMBER
    </cfquery>

    <!--- Build result array --->
    <cfloop query="data">
        <cfset returnStruct = StructNew() />
        <cfset returnStruct["label"] = SERIAL_NUMBER />

        <cfset ArrayAppend(result,returnStruct) />
    </cfloop>

    <!--- And return it --->
    <cfreturn serializeJSON(result) />
 </cffunction>

Вы можете использовать функцию serializeJSON, если она доступна в любой версии CF, которую вы используете.Если нет, то создайте строку json вручную.

Вот тут: http://www.jensbits.com/2010/03/18/jquery-ui-autocomplete-with-coldfusion/

0 голосов
/ 31 августа 2012

CFRemoting в OO Fashion с использованием Mura CMS Здесь ...

snProxy.cfc

<cfcomponent extends="mura.cfobject">

    <cfset variables.searchterm = ''>

    <cffunction name="get" access="remote" output="true">
    <cfargument name="searchterm" required="true">

        <cfset var $=getBean("MuraScope").init(session.siteid)>    
        <cfset variables.searchterm = arguments.searchterm >    

        <cfquery name="get" datasource="#request.dsn#">
                SELECT DISTINCT SERIAL_NUMBER    
                FROM tbl_serial_numbers 
                WHERE SERIAL_NUMBER like <cfqueryparam value="%#variables.searchterm#%" cfsqltype="cf_sql_varchar" />
        </cfquery>

        <cfset response = listToArray(valueList(get.SERIAL_NUMBER))>
        <cfset data = #createobject("component","mura.json").encode(response)#>

        <cfreturn data />

    </cffunction>    

</cfcomponent>    

JQuery Bind ...

<script type="text/javascript">
    $(function() {
        $("input##serial_numbers").autocomplete({
        source: "/com/snProxy.cfc?method=get&returnFormat=json",
        minLength: 1
        });
    });
</script>
0 голосов
/ 17 января 2012

Только что наткнулся на это в поисках аналогичного решения, но я должен сказать, что возвращение массива структур не соответствует большинству соглашений для возвращений JSON AJAX, даже после использования serializeJSON.

Другой ответ возвращает что-токак

[{key:value}, {key:value}, {key:value}...]

, тогда как обычно вы хотите видеть

{key:value,key:value,key:value...}

Так вот моя скорректированная версия кода для тех, кому нужно работать с последним форматом

<cffunction name="lookupSerialNumber" access="remote" returntype="String" >
<cfargument name="search" type="any" required="false" default="">

<!--- Define variables --->
<cfset var data="">
<cfset var result=StructNew()> <!--- Is now a Struct instead of Array --->

<!--- Do search --->
<cfquery name="data">
    SELECT DISTINCT SERIAL_NUMBER
    FROM myTable
    WHERE SERIAL_NUMBER LIKE '%#trim(ARGUMENTS.search)#%'
    ORDER BY SERIAL_NUMBER
</cfquery>

<!--- Build result array --->
<cfloop query="data">
  <cfset returnStruct = StructNew() />
  <cfset returnStruct["label"] = SERIAL_NUMBER />

  <cfset StructAppend(result,returnStruct) /> 
  <!--- Append the temporary struct to the main struct --->
</cfloop>

<!--- And return it --->
<cfreturn serializeJSON(result) />

Преимущество этого в более простом разборе:

$.ajax({
  url: 'path/to.cfc',
  dataType: 'json',
  data: {
    search: searchWord
  }
  success: function(data) {
    //Easy Parsing Bit here...
    $.each(data, function(key, val) {
      alert(key + ': ' + val); 
    })
  }
})

Принимая во внимание, что раньше вам приходилось вводить массив, ТОГДА анализировать отдельные записи JSON ...

...