cfdirectory выводит другой html на основе фильтра

Я хочу выдать немного другой html на основе условия фильтра, переданного в cfdirectory.

Вот мой cfml:

<cfdirectory
    directory="#dirName#"
    name="fileList"
    action="list"
    type="file"
    filter="*.jpg|*.jpeg|*.png|*.gif|*.mp4"
>
<ul id="content">
    <cfoutput>
        <cfloop query="fileList">
            <cfif filter NEQ '*.mp4'> // I guess this is not possible and is throwing the error
                <li class="content image">
                    <img src="img/#name#" />
                </li>
            </cfif>
            <cfelse>
                <li class="video image">
                    <video controls="controls">
                        <source src="img/#name#" type="video/mp4">
                    </video>
                </li>
            </cfif>
        </cfloop>
    </cfoutput>
</ul>

Я предполагаю, что я не могу просто получить доступ к filter внутри cfif, но я не уверен, как его скрыть. Нужно ли хранить его в переменной вне цикла?

Любая помощь очень ценится


person lharby    schedule 21.05.2020    source источник


Ответы (3)


Давайте сделаем это шаг за шагом

<ul id="content">
   <!--- Normally you want to loop over query in a cfoutput. No need for both --->
    <cfoutput query="fileList">
            <cfif listlast(fileList.name, '.') NEQ 'mp4'>

                <li class="content image">
                    <img src="img/#name#" />
                </li>

            <cfelse>
                <li class="video image">
                    <video controls="controls">
                        <source src="img/#name#" type="video/mp4">
                    </video>
                </li>
            </cfif>

    </cfoutput>
</ul>

More details

 <cfif listLast(fileList.name, '.') NEQ 'mp4'>

fileList.name означает: Мы хотим посмотреть на name. Но не просто любое имя, которое может существовать в любой области. Нам нужно имя, связанное с fileList

listLast() означает взять строковую переменную, разделить ее запятыми и сказать мне, какой последний элемент. Верните это как строку.

listLast(..., '.') Вы знаете ту часть про запятые, да, давайте вместо них будем использовать точки. Другими словами, что является последней частью имени файла после последнего ..

Если это не мп4, то...

person James A Mohler    schedule 21.05.2020
comment
Потрясающий. Спасибо. Обычно я нахожу это глупой ошибкой, которую часто упускаю из виду (случайная </cfif>). - person lharby; 22.05.2020
comment
Я не включил EncodeForHTMLURL(), который должен был быть - person James A Mohler; 22.05.2020

Вы можете просто сделать следующее.

<cfif listLast(fileList.name, '.') NEQ 'mp4'>
person rrk    schedule 21.05.2020
comment
Хм, кажется, у меня не работает. Я также попробовал ListLast() согласно документации: helpx .adobe.com/coldfusion/cfml-reference/coldfusion-functions/ Раньше я не использовал эту функцию. Но не могли бы вы объяснить метод? Интересно, могу ли я создать пример здесь: cffiddle.org/app/ - person lharby; 21.05.2020
comment
Хорошо, я сделал это: cffiddle.org/app/ Вроде работает, но я не получаю доступ к list.name таким же образом. - person lharby; 21.05.2020

Вы не сказали нам, какую ошибку вы на самом деле получаете, но если код в вопросе действительно является кодом, который вы используете, то ваша проблема не в фильтре, а в следующем:

        </cfif>
        <cfelse>

Удалите ложный </cfif> и повторите запуск, и если после этого вы все равно получите сообщение об ошибке, добавьте его в вопрос.

Редактировать: вы по-прежнему обнаружите, что ссылка на фильтр не будет работать, но ответ RRK listLast будет работать нормально - также, если вы еще этого не сделали, убедитесь, что ваш каталог действительно является правильным путем, например:

<cfset dirName = expandPath('img')>
<cfdirectory
    directory="#dirName#"
    name="fileList"
    action="list"
    type="file"
    filter="*.jpg|*.jpeg|*.png|*.gif|*.mp4"
>
<ul id="content">
    <cfoutput>
        <cfloop query="fileList">
            <cfif listLast(fileList.name, '.') NEQ 'mp4'>
                <li class="content image">
                    <img src="img/#EncodeForUrl(name)#" />
                </li>
            <cfelse>
                <li class="video image">
                    <video controls="controls">
                        <source src="img/#EncodeForURL(name)#" type="video/mp4">
                    </video>
                </li>
            </cfif>
        </cfloop>
    </cfoutput>
</ul>
person Sev Roberts    schedule 21.05.2020
comment
Мне нравится encodeforURL() . Он должен быть включен. У меня есть файлы с пробелами в именах, и об этом нужно позаботиться. - person James A Mohler; 22.05.2020
comment
Хорошо, к счастью, все мои файлы написаны строчными буквами без пробелов, но я обновлю скрипт, чтобы зафиксировать это, спасибо. - person lharby; 22.05.2020