coldfusion
CFLOOP How-To
Поиск…
замечания
Большое спасибо
- Пит Фрейтаг за свой чит-лист CFScript
- Адам Кэмерон для CF 11: CFLOOP в CFScript очень расстроен (и он все еще находится в CF 2016).
Цитирование через коллекцию с использованием меток CFML.
<!--- Define collection --->
<cfset attributes = {
"name": "Sales",
"type": "text",
"value": "Connection"
}>
<!---
cfloop tag with attribute collection can be used to
loop through the elements of a structure
--->
<cfloop collection=#attributes# item="attribute">
<cfoutput>
Key : #attribute#, Value : #attributes[attribute]#
</cfoutput>
</cfloop>
Цитирование через коллекцию с использованием CFSCRIPT.
<cfscript>
/*define collection*/
attributes = {
"name": "Sales",
"type": "text",
"value": "Connection"
};
for(attribute in attributes){
/* attribute variable will contain the key name of each key value pair in loop */
WriteOutput('Key : ' & attribute & ', Value : ' & attributes[attribute] & '<br/>');
}
</cfscript>
Индекс
параметры
| атрибут | необходимые | Тип | По умолчанию | Описание |
|---|---|---|---|---|
| индекс | правда | строка | Имя переменной для индекса цикла. Значение по умолчанию для области variables . | |
| от | правда | числовой | Начальное значение для индекса. | |
| в | правда | числовой | Конечное значение для индекса. | |
| шаг | ложный | числовой | 1 | Значение, с помощью которого можно увеличить или уменьшить индекс за итерацию. |
Базовая индексная петля
Конечное значение
xравно 10.
<!--- Tags --->
<cfoutput>
<cfloop index="x" from="1" to="10">
<li>#x#</li>
</cfloop>
</cfoutput>
<!--- cfscript --->
<cfscript>
for (x = 1; x <= 10; x++) {
writeOutput('<li>' & x & '</li>');
}
</cfscript>
<!--- HTML Output --->
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Увеличьте шаг до 2
Конечное значение
xравно 11.
<!--- Tags --->
<cfoutput>
<cfloop index="x" from="1" to="10" step="2">
<li>#x#</li>
</cfloop>
</cfoutput>
<!--- cfscript --->
<cfscript>
for (x = 1; x <= 10; x += 2) {
writeOutput('<li>' & x & '</li>');
}
</cfscript>
<!--- HTML Output --->
- 1
- 3
- 5
- 7
- 9
Шаг уменьшения на 1
Конечное значение
xравно 0.
<!--- Tags --->
<cfoutput>
<cfloop index="x" from="10" to="1" step="-1">
<li>#x#</li>
</cfloop>
</cfoutput>
<!--- cfscript --->
<cfscript>
for (x = 10; x > 0; x--) {
writeOutput('<li>' & x & '</li>');
}
</cfscript>
<!--- HTML Output --->
- 10
- 9
- 8
- 7
- 6
- 5
- 4
- 3
- 2
- 1
CFLoop в функции
Удостоверьтесь, что в
varилиlocalscope указатель внутри функции.Foo()возвращает 11.
<!--- var scope --->
<cffunction name="foo" access="public" output="false" returntype="numeric">
<cfset var x = 0 />
<cfloop index="x" from="1" to="10" step="1">
<cfset x++ />
</cfloop>
<cfreturn x />
</cffunction>
<!--- Local scope --->
<cffunction name="foo" access="public" output="false" returntype="numeric">
<cfloop index="local.x" from="1" to="10" step="1">
<cfset local.x++ />
</cfloop>
<cfreturn local.x />
</cffunction>
ColdFusion 11 через текущий
Функция cfscript
cfloopне поддерживаетindexкак отдельный механизм счетчика.
Состояние
Синтаксис тегов
параметры
| атрибут | необходимые | Тип | По умолчанию | Описание |
|---|---|---|---|---|
| состояние | правда | строка | Условие, которое управляет циклом. Не может содержать математические символы, такие как < , > или = . Должны использовать потоки текста ColdFusion, такие как less than , lt , greater than , gt , equals или eq . |
Конечное значение x равно 5.
<cfset x = 0 />
<cfoutput>
<cfloop condition="x LT 5">
<cfset x++ />
<li>#x#</li>
</cfloop>
</cfoutput>
Сгенерированный HTML
Это также будет иметь разрыв строки между каждой строкой HTML.
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
CFScript
Предыдущая в ColdFusion 8
<cfscript>
x = 0;
while (x LT 5) {
x = x + 1;
writeOutput('<li>' & x & '</li>');
}
</cfscript>
ColdFusion 8 через текущий
<cfscript>
x = 0;
while (x LT 5) {
x = x++;
writeOutput('<li>' & x & '</li>');
}
</cfscript>
ColdFusion 11 через текущий
Функция cfscript
cfloopне поддерживаетcondition.
Сгенерированный HTML
Обратите внимание, что вывод cfscript находится на одной строке.
<li>one</li><li>two</li><li>three</li><li>four</li>
Дата или временной диапазон
Пример для даты или времени.
запрос
Рассмотрим таблицу dbo.state_zip , которая содержит столбцы city , statecode и zipcode и имеет более 80 000 записей.
параметры
| атрибут | необходимые | Тип | По умолчанию | Описание |
|---|---|---|---|---|
| запрос | правда | строка | Имя переменной объекта запроса. | |
| StartRow | ложный | числовой | Индекс начальной строки объекта запроса. | |
| EndRow | ложный | числовой | Индекс конечной строки объекта запроса. | |
| группа | ложный | строка | Имя столбца запроса для группировки записей. |
Пример запроса
<cfquery name="geo" datasource="reotrans-dev">
SELECT city, stateCode, zipCode
FROM dbo.state_zip
</cfquery>
Синтаксис тегов
Использование объекта запроса geo в качестве источника для cfloop . Так как таблица dbo.state_zip имеет так много записей, созданный HTML займет довольно много времени. В этом примере показаны только первые 20 записей HTML.
<cfoutput>
<ul>
<cfloop query="geo">
<!--- Scope the column names with the query name. --->
<li>#geo.city# | #geo.stateCode# | #geo.zipCode#</li>
</cfloop>
</ul>
</cfoutput>
Сгенерированный HTML
<ul>
<li>100 PALMS | CA | 92274</li>
<li>1000 PALMS | CA | 92276</li>
<li>12 MILE | IN | 46988</li>
<li>1ST NATIONAL BANK OF OMAHA | NE | 68197</li>
<li>29 PALMS | CA | 92277</li>
<li>29 PALMS | CA | 92278</li>
<li>3 STATE FARM PLAZA | IL | 61710</li>
<li>3 STATE FARM PLAZA | IL | 61791</li>
<li>30TH STREET | PA | 19104</li>
<li>3M CORP | MN | 55144</li>
<li>65TH INFANTRY | PR | 00923</li>
<li>65TH INFANTRY | PR | 00924</li>
<li>65TH INFANTRY | PR | 00929</li>
<li>65TH INFANTRY | PR | 00936</li>
<li>7 CORNERS | VA | 22044</li>
<li>88 | KY | 42130</li>
<li>9 MILE POINT | LA | 70094</li>
<li>A A R P INS | PA | 19187</li>
<li>A A R P PHARMACY | CT | 06167</li>
<li>A H MCCOY FEDERAL BLDG | MS | 39269</li>
</ul>
Ограничение вывода на определенные строки
Чтобы ограничить вывод запроса определенным диапазоном строк, укажите startrow и endrow .
<cfloop query="geo" startrow="100" endrow="150">
<li>#geo.city# | #geo.stateCode# | #geo.zipCode#</li>
</cfloop>
Группировка вывода
В данных примера одно и то же состояние перечислено несколько раз по отношению к нескольким городам, которые связаны с каждым состоянием. Вы также можете увидеть один и тот же город, указанный несколько раз по отношению к нескольким почтовым индексам, связанным с каждым городом.
Сначала сгруппируем вывод по состоянию. Обратите внимание на второй экземпляр cfloop обернутый вокруг содержимого, которое будет выводиться в соответствии с группированным контентом stateCode .
<cfoutput>
<ul>
<cfloop query="geo" group="stateCode">
<!--- Scope the column names with the query name. --->
<li>#geo.stateCode#
<ul>
<cfloop>
<li>#geo.city# | #geo.zipCode#</li>
</cfloop>
</ul>
</li>
</cfloop>
</ul>
</cfoutput>
Сгенерированный HTML (извлечение) из одного cfloop тега cfloop .
<ul>
<li>AK
<ul>
<li>KONGIGANAK | 99545</li>
<li>ADAK | 99546</li>
<li>ATKA | 99547</li>
<!-- etc. -->
</ul>
</li>
<li>AL
<ul>
<li>ALEX CITY | 35010</li>
<li>ALEXANDER CITY | 35010</li>
<li>ALEX CITY | 35011</li>
<!-- etc. -->
</ul>
</li>
<!-- etc. -->
</ul>
Наконец, давайте сгруппируем вывод по stateCode , затем по city , чтобы просмотреть все записи zipCode каждого города. Обратите внимание, что второй cfloop теперь сгруппирован по city и существует 3-й cfloop для вывода данных zipCode .
<cfoutput>
<ul>
<cfloop query="geo" group="stateCode">
<li>#geo.stateCode#
<ul>
<cfloop group="city">
<li>#geo.city#
<ul>
<cfloop>
<li>#geo.zipCode#</li>
</cfloop>
</ul>
</li>
</cfloop>
</ul>
</li>
</cfloop>
</ul>
</cfoutput>
Сгенерированный HTML (извлечение) из двух сгруппированных тегов cfloop .
<ul>
<li>AK
<ul>
<li>ADAK
<ul>
<li>99546</li>
<li>99571</li>
</ul>
</li>
<li>AKHIOK
<ul>
<li>99615</li>
</ul>
</li>
<!--- etc. --->
<li>BARROW
<ul>
<li>99723</li>
<li>99759</li>
<li>99789</li>
<li>99791</li>
</ul>
</li>
<!--- etc. --->
</ul>
</li>
<!--- stateCodes etc. --->
</ul>
CFScript
ColdFusion 6 (MX), хотя ток
<cfscript>
for (x = 1; x LTE geo.recordcount; x = x + 1) {
writeOutput( '<li>' & geo.city[x] & ' | ' &
geo.stateCode[x] & ' | ' & geo.zipCode[x] & '</li>');
}
</cfscript>
ColdFusion 8, хотя текущий
<cfscript>
for (x = 1; x <= geo.recordcount; x++) {
writeOutput( '<li>' & geo.city[x] & ' | ' &
geo.stateCode[x] & ' | ' & geo.zipCode[x] & '</li>');
}
</cfscript>
ColdFusion 10, хотя текущий
С синтаксисом
FOR INxявляется объектом строки запроса, а не индексом строки.
<cfscript>
for (x in geo) {
writeOutput( '<li>' & x.city & ' | ' &
x.stateCode & ' | ' & x.zipCode & '</li>');
}
</cfscript>
ColdFusion 11, хотя текущий
ColdFusion 11 позволяет записывать большинство тегов как cfscript.
<cfscript>
cfloop(query: geo, startrow: 1, endrow: 2) {
writeOutput( '<li>' & geo.city & ' | ' &
geo.stateCode & ' | ' & geo.zipCode & '</li>');
}
</cfscript>
С group .
<cfscript>
cfloop(query: geo, group: 'city') {
writeOutput( '<li>' & geo.city & '<ul>');
cfloop() { // no arguments, just as in the tag syntax.
writeOutput('<li>' & geo.zipCode & '</li>');
}
writeOutput('</ul></li>');
}
</cfscript>
Список
Рассмотрим этот список:
<cfset foo = "one,two,three,four" />
Синтаксис тегов
параметры
| атрибут | необходимые | По умолчанию | Описание |
|---|---|---|---|
| список | правда | Объект списка. Переменная должна быть оценена (завернута с ##) | |
| индекс | правда | Текущий элемент списка. |
<cfoutput>
<cfloop list="#foo#" index="x">
<li>#x#</li>
</cfloop>
</cfoutput>
Сгенерированный HTML
Это также будет иметь разрыв строки между каждой строкой HTML.
<li>one</li>
<li>two</li>
<li>three</li>
<li>four</li>
CFScript
Предыдущая в ColdFusion 8
<cfscript>
for (x = 1; x LTE listLen(foo); x = x + 1) {
writeOutput("<li>" & listGetAt(foo, x) & "</li>");
}
</cfscript>
ColdFusion 8 через текущий
<cfscript>
for (x = 1; x <= listLen(foo); x++) {
writeOutput("<li>" & listGetAt(foo, x) & "</li>");
}
</cfscript>
ColdFusion 9 через текущий
<cfscript>
for (x in foo) {
writeOutput("<li>" & x & "</li>");
}
</cfscript>
ColdFusion 11 через текущий
Функция cfscript
cfloopне поддерживаетlist.
Сгенерированный HTML
Обратите внимание, что вывод cfscript находится на одной строке.
<li>one</li><li>two</li><li>three</li><li>four</li>
массив
В ColdFusion 8 была добавлена возможность прямого использования объекта
arrayс помощьюcfloop.
Рассмотрим этот массив;
<cfset aFoo = [
"one"
, "two"
, "three"
, "four"
] />
Синтаксис тегов
ColdFusion 8 через текущий
Использование index атрибута.
параметры
| атрибут | необходимые | По умолчанию | Описание |
|---|---|---|---|
| массив | правда | Объект массива. Переменная должна быть оценена (завернута с ##) | |
| индекс | правда | Текущий элемент массива. |
<cfoutput>
<cfloop array="#aFoo#" index="x">
<li>#x#</li>
</cfloop>
</cfoutput>
Сгенерированный HTML
Это также будет иметь разрыв строки между каждой строкой HTML.
<li>one</li>
<li>two</li>
<li>three</li>
<li>four</li>
ColdFusion 2016 через текущий
Атрибут
itemизменяет поведениеcfloopпо состоянию на Coldfusion 2016 года.
Использование item атрибута вместо или в дополнение к index .
параметры
| атрибут | необходимые | По умолчанию | Описание |
|---|---|---|---|
| массив | правда | Объект массива. Переменная должна быть оценена (завернута с ##) | |
| вещь | правда | Текущий элемент массива. | |
| индекс | ложный | Текущий индекс массива. |
<cfoutput>
<cfloop array="#aFoo#" item="x" index="y">
<li>#x# | #y#</li>
</cfloop>
</cfoutput>
Сгенерированный HTML
Это также будет иметь разрыв строки между каждой строкой HTML.
<li>one | 1</li>
<li>two | 2</li>
<li>three | 3</li>
<li>four | 4</li>
CFScript
Предыдущая в ColdFusion 8
<cfscript>
for (i = 1; x LTE arrayLen(aFoo); i = i + 1) {
writeOutput("<li>" & aFoo[i] & "</li>");
}
</cfscript>
ColdFusion 8 через текущий
<cfscript>
for (i = 1; i <= arrayLen(aFoo); i = i++) {
writeOutput("<li>" & aFoo[i] & "</li>");
}
</cfscript>
ColdFusion 9 через текущий
С синтаксисом
FOR INx является текущим элементом массива, а не индексом массива.
<cfscript>
for (x in aFoo) {
writeOutput("<li>" & x & "</li>");
}
</cfscript>
ColdFusion 11 через текущий
Функция cfscript
cfloopне поддерживаетarray.
Сгенерированный HTML
Обратите внимание, что вывод cfscript находится на одной строке.
<li>one</li><li>two</li><li>three</li><li>four</li>
файл
<cfloop list="#myFile#" index="FileItem" delimiters="#chr(10)##chr(13)#">
<cfoutput>
#FileItem#<br />
</cfoutput>
</cfloop>
Состав
Рассмотрим эту структуру:
<cfset stFoo = {
a = "one"
, b = "two"
, c = "three"
, d = "foue"
} />
Синтаксис тегов
параметры
Обратите внимание на использование атрибута
itemвместоindex.
| атрибут | необходимые | Тип | По умолчанию | Описание |
|---|---|---|---|---|
| коллекция | правда | состав | Объект struct . Переменная должна быть оценена (завернута с ##). | |
| вещь | правда | строка | Текущий key элемент структуры, |
Использование структурных функций
<cfoutput>
<cfloop collection="#stFoo#" item="x">
<li>#structFind(stFoo, x)#</li>
</cfloop>
</cfoutput>
Синтаксис неявной структуры
<cfoutput>
<cfloop collection="#stFoo#" item="x">
<li>#stFoo[x]#</li>
</cfloop>
</cfoutput>
Сгенерированный HTML
Это также будет иметь разрыв строки между каждой строкой HTML.
<li>one</li>
<li>two</li>
<li>three</li>
<li>four</li>
CFScript
С синтаксисом
FOR INxявляетсяkeyобъекта структуры.
Вывести ключи структуры
<cfscript>
for (x in stFoo) {
writeOutput("<li>" & x & "</li>");
}
</cfscript>
Сгенерированный HTML
<li>A</li><li>B</li><li>C</li><li>D</li>
Вывести значение ключей структуры
Использование структурных функций
<cfscript>
for (x in stFoo) {
writeOutput("<li>" & structFind(stFoo, x) & "</li>");
}
</cfscript>
Синтаксис неявной структуры
<cfscript>
for (x in stFoo) {
writeOutput("<li>" & stFoo[x] & "</li>");
}
</cfscript>
ColdFusion 11 через текущий
Функция cfscript
cfloopне поддерживаетcollection.
Сгенерированный HTML
Обратите внимание, что вывод cfscript находится на одной строке.
<li>one</li><li>two</li><li>three</li><li>four</li>
Индексная петля
Используйте атрибуты from и to чтобы указать, сколько итераций должно произойти. Атрибут (необязательный) step позволяет вам определить, насколько велики будут приращения.
<cfloop from="1" to="10" index="i" step="2">
<cfoutput>
#i#<br />
</cfoutput>
</cfloop>
Условный цикл
Вы используете атрибут condition чтобы указать условие для использования.
<cfset myVar=false>
<cfloop condition="myVar eq false">
<cfoutput>
myVar = <b>#myVar#</b> (still in loop)<br />
</cfoutput>
<cfif RandRange(1,10) eq 10>
<cfset myVar="true">
</cfif>
</cfloop>
<cfoutput>
myVar = <b>#myVar#</b> (loop has finished)
</cfoutput>
Query Loop
Вы можете запрограммировать результаты запроса ColdFusion.
<cfquery name="getMovies" datasource="Entertainment">
select top 4 movieName
from Movies
</cfquery>
<cfloop query="getMovies">
#movieName#
</cfloop>
Цикл списка
Вы можете использовать (необязательный) атрибут delimiters чтобы указать, какие символы используются в качестве разделителей в списке.
<cfloop list="ColdFusion,HTML;XML" index="ListItem" delimiters=",;">
<cfoutput>
#ListItem#<br />
</cfoutput>
</cfloop>
File Loop
Вы можете перебрать файл.
<cfloop file="#myFile#" index="line">
<cfoutput>
#line#<br />
</cfoutput>
</cfloop>
Коды сборки COM / структуры
Вы можете перебрать структуру или коллекцию COM.
<cfset myBooks = StructNew()>
<cfset myVariable = StructInsert(myBooks,"ColdFusion","ColdFusion MX Bible")>
<cfset myVariable = StructInsert(myBooks,"HTML","HTML Visual QuickStart")>
<cfset myVariable = StructInsert(myBooks,"XML","Inside XML")>
<cfloop collection="#myBooks#" item="subject">
<cfoutput>
<b>#subject#:</b> #StructFind(myBooks,subject)#<br />
</cfoutput>
</cfloop>