Выполните строковые функции в запросе AJAX перед возвратом результатов из CFC - PullRequest
2 голосов
/ 19 апреля 2011

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

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

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

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

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

EDIT Эта настройка отлично работала в 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 ]

1 голос
/ 19 апреля 2011

Для 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);
0 голосов
/ 21 апреля 2011

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

ListFirst(list [, delimiters, includeEmptyValues ])

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...