Выполните строковые функции в запросе AJAX перед возвратом результатов из CFC

На моей странице есть алфавит в верхней части "A-Z". Когда пользователь нажимает на букву, я выполняю AJAX-вызов CFC, который выполняет запрос каталога миниатюрных изображений на основе выбранной буквы и возвращает список соответствующих имен файлов.

Когда список возвращается к моей функции на странице, которую я использую split() выполнить несколько функций над именем файла, чтобы извлечь определенную информацию. Например, имена файлов отформатированы следующим образом: lastname_firstnameIMG_1234_RGB.jpg

Моя цель - извлечь фамилию, имя и номер в моем CFC, чтобы я мог пометить миниатюру изображения и создать ссылки на "настоящие" файлы для загрузки, такие как lastname_firstnameIMG_1234_CMYK.tif так далее...

Первоначально я построил свою функцию AJAX для работы с возвращенным списком, используя split() но я получаю ошибки в IE. Чтобы смягчить проблему, я бы предпочел выполнить строковые функции в моем CFC и вернуть данные, готовые к работе.

Как выполнить строковые функции в CFC перед возвратом структуры данных?

РЕДАКТИРОВАТЬ Эта настройка отлично работала в Safari и FF, но вызвала ошибку в IE. Я пытался изменить split() функции и имели некоторый успех, но тогда, конечно, он не работал должным образом в FF. Опять же, моя цель - устранить строковые моды javascript и сделать это в CFC.

Вот мой CFC:

<cffunction name="List" access="remote" output="no" returntype="struct">
<cfargument name="letter" required="yes" type="string">
<cfset local = StructNew()>
<cfset local.response = StructNew()>
<cfset local.response["error"] = "">
<cfset local.response["message"] = "">
<cfset local.data = #arguments.letter# & "*.jpg">

<cfdirectory
            action="list"
            directory="#thumbsdir#"
            recurse="true"
            listinfo="name"
            name="qFile"
            filter="#local.data#"
            />
            <cfset local.response["message"] = #qFile#>
    <cfreturn local.response>
</cffunction>

И моя функция AJAX (которая обернута в функцию document.ready...):

$('.lastname').click(function(e){
    e.preventDefault();
    $('#emptymessage').hide();
    $('#searching').show();
    $('#content').html("");
    var alpha = $(this).attr('id');
    $.getJSON("cfcengine.cfc?method=List&returnformat=json&queryFormat=column", 
        {letter:alpha},
        function(res, code) {
            var s = "";
            if(res.message.ROWCOUNT > 0) {
            $('#searching').hide();
            for(var i=0; i<res.message.ROWCOUNT; i++) {
            //This is all the stuff I want to get rid of...
            var theFile = res.message.DATA.Name[i]
            var theLastName = theFile.split(/_(.+)/)[0];
            var theRest = theFile.split(/_(.+)/)[1];
            var theFirstNameAll = theRest.split(/_(.+)/)[0];
            var theFirstName = theFirstNameAll.split(/(?:IMG)/)[0];
            var theImageAll = theRest.split(/_(.+)/)[1];
            var theImage = theImageAll.split(/_(.+)/)[0];
            var bw = theLastName + '_' + theFirstName + 'IMG_' + theImage + '_BW.jpg';
            var rgb = theLastName + '_' + theFirstName + 'IMG_' + theImage + '_RGB.jpg';
            //Right now I'm just returning the name to the page until debugging is complete...
                            s += '<p>' + res.message.DATA.Name[i] + '<\/p>';
            }
        } else {
            var s = "Sorry, nothing matched your search.";
        }
        $("#content").html(s);

            //End response
            }
        //End getJSON
        );

//End plist click function  
});

2 ответа

Решение

Для JavaScript я бы покончил с литералами регулярных выражений и упростил split():

// replace with res.message.DATA.Name[i]
var theFile = 'lastname_firstnameIMG_1234_RGB.jpg';
// ['lastname', 'firstnameIMG', '1234', RGB.jpg']
var pieces = theFile.split('_');
//lastname
var theLastName = pieces[0];
//firstname
var theFirstName = pieces[1].slice(0, pieces[1].length - 3);
//1234
var theImage = pieces[2];

var bw = theLastName + '_' + theFirstName + 'IMG_' + theImage + '_BW.jpg';
var rgb = theLastName + '_' + theFirstName + 'IMG_' + theImage + '_RGB.jpg';

// lastname_firstnameIMG_1234_BW.jpg'
alert(bw);
// lastname_firstnameIMG_1234_RGB.jpg'
alert(rgb);

Вот как бы я это сделал в <cfscript>...</cfscript>:

theFile = 'lastname_firstnameIMG_1234_RGB.jpg';
// ['lastname', 'firstnameIMG', '1234', RGB.jpg']
pieces = theFile.split('_');
//lastname
theLastName = pieces[1];
//firstname
theFirstName = left(pieces[2], len(pieces[2]) - 3);
//1234
theImage = pieces[3];

bw = theLastName & '_' & theFirstName & 'IMG_' & theImage & '_BW.jpg';
rgb = theLastName & '_' & theFirstName & 'IMG_' & theImage & '_RGB.jpg';

// lastname_firstnameIMG_1234_BW.jpg'
writeOutPut(bw & "<br/>");
// lastname_firstnameIMG_1234_RGB.jpg'
writeOutPut(rgb);

Эта часть ColdFusion может быть выполнена в одной строке кода с использованием

ListFirst(list [, delimiters, includeEmptyValues ])

потому что _ действительно действует как разделитель в вашем случае.

ListFirst и ListLast - очень удобные функции.

Другие вопросы по тегам