initial draft
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
<cfsilent>
|
||||
<cfparam name="ATTRIBUTES.name"/>
|
||||
<cfparam name="ATTRIBUTES.value" default="1"/>
|
||||
|
||||
<cfif structKeyExists(ATTRIBUTES,"checked")>
|
||||
<cfset checked=!(ATTRIBUTES.checked EQ "0" OR ATTRIBUTES.checked EQ "")/>
|
||||
<cfelse>
|
||||
<cfset checked=!(ATTRIBUTES.container[ATTRIBUTES.name] EQ "0" OR ATTRIBUTES.container[ATTRIBUTES.name] EQ "")/>
|
||||
</cfif>
|
||||
|
||||
<cfparam name="ATTRIBUTES.suffix" default=""/>
|
||||
<cfparam name="ATTRIBUTES.id" default="#ATTRIBUTES.name##ATTRIBUTES.suffix#"/>
|
||||
<cfparam name="ATTRIBUTES.disabled" type="boolean" default="No"/>
|
||||
<cfset attributeList="name,value,checked,container,suffix,id,disabled"/>
|
||||
|
||||
</cfsilent><cfoutput><input type="checkbox" name="#ATTRIBUTES.name#"<!---
|
||||
---><cfif len(ATTRIBUTES.id)> id=#ATTRIBUTES.id#</cfif> value="#ATTRIBUTES.value#"<!---
|
||||
---><cfif checked> checked="checked"</cfif><!---
|
||||
---><cfif ATTRIBUTES.disabled> disabled="disabled"</cfif><!---
|
||||
passthrough additional attributes
|
||||
---><cfloop collection=#ATTRIBUTES# item="attr"><!---
|
||||
---><cfif NOT listFindNoCase(attributeList,attr)> #attr#="#structFind(ATTRIBUTES,attr)#"</cfif><!---
|
||||
---></cfloop>/></cfoutput><cfexit method="exittag"/>
|
||||
@@ -0,0 +1,30 @@
|
||||
<cfparam name="ATTRIBUTES.lang" type="string" default=""/>
|
||||
<cfparam name="request.language" type="string" default=""/>
|
||||
<cfif len(ATTRIBUTES.lang) AND #ATTRIBUTES.lang# NEQ #request.language#>
|
||||
<cfexit method="exittag"/>
|
||||
</cfif>
|
||||
|
||||
<cfif thisTag.executionMode IS "end">
|
||||
|
||||
<!--- <cfloop collection=#CALLER# item="item">
|
||||
<cfset structInsert(variables, item, CALLER[item], false)/>
|
||||
</cfloop> --->
|
||||
|
||||
<cfassociate basetag="cf_table" datacollection="columns"/>
|
||||
<cfset attributeList=""/> <!--- *** сделать проброс атрибутов --->
|
||||
<cfparam name="thisTag.th" type="array" default=#[{content="",field=""}]#/><!---контейнер для данных вложенного элемента TH. Предусмотрен только один элемент массива, остальные игнорируются--->
|
||||
<!---<cfparam name="thisTag.td" type="array" default=#[{content="",field=""}]#/>--->
|
||||
<cfparam name="thisTag.td" type="array" default=#thisTag.th#/><!---контейнер для данных вложенного элемента TD. Предусмотрен только один элемент массива, остальные игнорируются--->
|
||||
<!---Зачем массив? - потому что массив вложенных тегов, а у нас считается только первый вложенный тег TD--->
|
||||
|
||||
<cfset ATTRIBUTES.td=#thisTag.td#/><!---поле, видное включающему тегу table в коллекции columns--->
|
||||
<cfset ATTRIBUTES.th=#thisTag.th#/><!---поле, видное включающему тегу table в коллекции columns--->
|
||||
<cfset ATTRIBUTES.content=thisTag.generatedContent/>
|
||||
|
||||
<cfparam name="ATTRIBUTES.field" default="#thisTag.td[1].field#"/><!---***---><!---настоящий атрибут - имя поля запроса (query) для ВЫВОДА, может задаваться как атрибут тега--->
|
||||
<cfparam name="ATTRIBUTES.formatter" type="function" default=#function (x) {return x;}#/>
|
||||
<cfparam name="ATTRIBUTES.sortable" type="boolean" default=true/>
|
||||
<cfparam name="ATTRIBUTES.visible" type="boolean" default=true/>
|
||||
<cfparam name="ATTRIBUTES.columnOrder" type="integer" default=0/>
|
||||
<!--- Желательное поведение сортировки колонок: для некоторых колонок указан порядок, на этом месте они и оказываются. Не указан - идут в порядке появления в коде. Если 2 колонки с одним порядком сортировки, первой выводится та, которая первая по тексту. --->
|
||||
</cfif>
|
||||
@@ -0,0 +1,46 @@
|
||||
<cfsilent>
|
||||
<cfimport prefix="c" taglib="."/>
|
||||
|
||||
|
||||
<!---*** идея включить титул в метаданные была не совсем пустой, но когда титул определяется в селекте, это не слишком удобно --->
|
||||
<cfassociate basetag="cf_grid_head" datacollection="headersArray"/>
|
||||
<cfset envelope=getBaseTagData('cf_grid_head',1)/>
|
||||
|
||||
<cfparam name="ATTRIBUTES.title" type="string" default="#envelope.ATTRIBUTES.titleMap[ATTRIBUTES.name].title#"/>
|
||||
<cfparam name="ATTRIBUTES.name" type="string"/><!--- Заголовок указвается на том поле, по которому будет сортировка, а не на том, которе отображается --->
|
||||
<cfparam name="ATTRIBUTES.arrows" type="boolean" default="Yes"/>
|
||||
|
||||
|
||||
|
||||
<cfset attributeList="name,arrows,title"/>
|
||||
|
||||
<!--- В данном случае реализован подход: дополнительные атрибуты передаются вниз.
|
||||
Другой вариант - создавать атрибут extra, в который писать суффикс QueryString.
|
||||
Первый подход, использованный здесь, позволяет иметь доступ к дополнительным атрибутам, но непонятно, зачем - ведь их имена все равно неизвестны.
|
||||
Очевидный минус этого подхода - возможный конфликт имен с именами существующих атрибутов --->
|
||||
<cfset extraAttributes=structNew()/>
|
||||
|
||||
<!--- дополнительные атрибуты родительского тега--->
|
||||
<cfif StructKeyExists(envelope, "extraAttributes") AND isStruct(envelope.extraAttributes)>
|
||||
<cfloop collection=#envelope.extraAttributes# item="attr">
|
||||
<cfif NOT listFindNoCase(attributeList, attr)><!--- проверка относительно локальных атрибутов, чтобы их не перетереть--->
|
||||
<cfset val="#structFind(envelope.extraAttributes, attr)#"/>
|
||||
<cfif IsSimpleValue(val)>
|
||||
<cfset structInsert(extraAttributes, attr, val)/>
|
||||
</cfif>
|
||||
</cfif>
|
||||
</cfloop>
|
||||
</cfif>
|
||||
|
||||
<cfloop collection=#ATTRIBUTES# item="attr">
|
||||
<cfif NOT listFindNoCase(attributeList, attr)>
|
||||
<cfset val="#structFind(ATTRIBUTES, attr)#"/>
|
||||
<cfif IsSimpleValue(val)>
|
||||
<cfset structInsert(extraAttributes, attr, val, "Yes")/><!--- локальные атрибуты перетрут родительские --->
|
||||
</cfif>
|
||||
</cfif>
|
||||
</cfloop>
|
||||
|
||||
|
||||
</cfsilent><cfif thisTag.executionMode is "end"><cfoutput>#ATTRIBUTES.title#
|
||||
<cfif ATTRIBUTES.arrows><c:order_arrows sortArray=#envelope.ATTRIBUTES.sortArray# n=#envelope.ATTRIBUTES.titleMap[ATTRIBUTES.name].ordinal# attributeCollection=#extraAttributes#/></cfif></cfoutput></cfif>
|
||||
@@ -0,0 +1,178 @@
|
||||
<!--- combobox
|
||||
v3.1 23.10.2020 support of list in multiple selection
|
||||
v3.0 12.08.2016 ATTRIBUTES.readonly
|
||||
v2.1 04.05.2016 ATTRIBUTES.disabled
|
||||
v2 с форматным выводом
|
||||
|
||||
---><cfprocessingdirective suppresswhitespace="true">
|
||||
<!---
|
||||
<cfparam name="ATTRIBUTES.query" type="query"/>
|
||||
<cfparam name="ATTRIBUTES.queryString" type="string"/>
|
||||
<cfparam name="ATTRIBUTES.list" type="string"/>
|
||||
--->
|
||||
<cfparam name="ATTRIBUTES.DS" type="string" default="#request.DS#"/>
|
||||
<cfparam name="ATTRIBUTES.combo"/><!--- имя контрола (name)--->
|
||||
<cfparam name="ATTRIBUTES.key"/><!--- Имя ключевого поля---><!--- ограничение: не поддерживаем составные ключи --->
|
||||
<cfparam name="ATTRIBUTES.display" default=""/><!--- имя поля резалтсета --->
|
||||
<cfparam name="ATTRIBUTES.displayf" default=""/><!--- форматный вывод, поля резалтсета писать: ##field##, например "*##field1##:##field2##*" --->
|
||||
<cfparam name="ATTRIBUTES.selected" default=""/><!--- в случае base64 - завернуто в base64--->
|
||||
<cfparam name="ATTRIBUTES.base64" default="No"/><!---*** это архитектурная ошибка. Base64 is url unsafe. Но поскольку все передается POST-ом, обычно не проявляется --->
|
||||
<cfparam name="ATTRIBUTES.disabled" type="boolean" default="No"/>
|
||||
<cfparam name="ATTRIBUTES.style_selector" default=""/>
|
||||
<cfparam name="ATTRIBUTES.style_spec" type="struct" default=#structNew()#/>
|
||||
<cfparam name="ATTRIBUTES.class_selector" default=""/>
|
||||
<cfparam name="ATTRIBUTES.class_spec" type="struct" default=#structNew()#/>
|
||||
<cfparam name="ATTRIBUTES.flag_disabled" type="string" default=""/><!--- проверяется на > 0. Возможно, не следует отключать выбранное значение --->
|
||||
<cfparam name="ATTRIBUTES.readonly" type="boolean" default="false"/><!--- в случае readonly выводится текст и скрытое поле с ID, если множественное выделение, то надо наверно выводить все выделенные элементы? --->
|
||||
<cfparam name="ATTRIBUTES.extra" type="string" default=""/><!--- --->
|
||||
|
||||
|
||||
<cfset attributeList="template,query,queryString,combo,key,display,displayf,selected,empty,DS,base64,disabled,style_selector,style_spec,class_selector,class_spec,flag_disabled,readonly,extra"/>
|
||||
|
||||
<cffunction name="escape64" returnType="string">
|
||||
<cfargument name="val" type="string">
|
||||
<cfif #ATTRIBUTES.base64#>
|
||||
<cfreturn ToBase64(val)>
|
||||
<cfelse>
|
||||
<cfreturn val>
|
||||
</cfif>
|
||||
</cffunction>
|
||||
|
||||
<cffunction name="isSelected" returnType="boolean">
|
||||
<!--- tests for presense of key (second arg) in passed array (first arg) or, if sel is simple value just compares key and sel.
|
||||
Used for checking against multiple alternatives like "save" OR "saveAndClose"
|
||||
--->
|
||||
<cfargument name="sel">
|
||||
<cfargument name="key">
|
||||
<cfscript>
|
||||
if (isArray(sel)) {
|
||||
for(i=1; i <= ArrayLen(sel); i++){
|
||||
if (sel[i]==key) {return true;}
|
||||
}
|
||||
return false;
|
||||
} else { //считаем, что из сложных типов тут бывает только массив
|
||||
if (!isSimpleValue(sel)) {return false;}
|
||||
/*return (sel == key);*/
|
||||
return listFind(sel,key);
|
||||
}
|
||||
</cfscript>
|
||||
</cffunction>
|
||||
|
||||
<cffunction name="strSelected" returnType="string">
|
||||
<cfargument name="sel">
|
||||
<cfargument name="key">
|
||||
<!---unsupported in CF8: <cfreturn (isSelected(sel,key)? " selected" : "")>--->
|
||||
<cfif isSelected(sel,key)>
|
||||
<cfreturn " selected">
|
||||
<cfelse>
|
||||
<cfreturn "">
|
||||
</cfif>
|
||||
</cffunction>
|
||||
|
||||
<!--- функция условного обертывания --->
|
||||
<cffunction name="w" returnType="string">
|
||||
<cfargument name="prefix"/>
|
||||
<cfargument name="input"/>
|
||||
<cfargument name="suffix" default=""/>
|
||||
|
||||
<cfif len(input) GT 0>
|
||||
<cfreturn "#prefix##input##suffix#"/>
|
||||
<cfelse>
|
||||
<cfreturn ""/>
|
||||
</cfif>
|
||||
</cffunction>
|
||||
|
||||
<cffunction name="strAttribute" returnType="string">
|
||||
<!---returns formatted string ' attribute="value"',
|
||||
where attribute name is the first argument,
|
||||
and value is taken from passed structure(third argument) by key (second argument)--->
|
||||
<cfargument name="name"/>
|
||||
<cfargument name="selector"/>
|
||||
<cfargument name="spec" type="struct"/>
|
||||
|
||||
<cfif StructKeyExists(spec, selector)>
|
||||
<cfreturn ' #name#="#structFind(spec, selector)#"'/>
|
||||
<cfelse>
|
||||
<cfreturn "">
|
||||
</cfif>
|
||||
</cffunction>
|
||||
|
||||
<!--- ---------------------------------------------------------------------------------- --->
|
||||
|
||||
<cfif structKeyExists(ATTRIBUTES,"query")>
|
||||
<cfset qSel=ATTRIBUTES.query>
|
||||
<cfelseif structKeyExists(ATTRIBUTES,"queryString")>
|
||||
<cfquery name="qSel" datasource="#ATTRIBUTES.DS#">
|
||||
#preserveSingleQuotes(ATTRIBUTES.queryString)#
|
||||
</cfquery>
|
||||
<cfelseif structKeyExists(ATTRIBUTES,"list")>
|
||||
<cfset qSel=#queryNew("item")#/>
|
||||
<cfloop list=#ATTRIBUTES.list# item="item">
|
||||
<cfset queryAddRow(qSel,{"item":"#item#"})/>
|
||||
</cfloop>
|
||||
</cfif>
|
||||
|
||||
|
||||
<!--- parse class specifications--->
|
||||
<cfscript>
|
||||
</cfscript>
|
||||
|
||||
<cfif ATTRIBUTES.readonly>
|
||||
<cfif isArray(ATTRIBUTES.selected)>
|
||||
<cfset selectedList=ArrayToList(ATTRIBUTES.selected)/>
|
||||
<cfelse>
|
||||
<cfset selectedList=ATTRIBUTES.selected/>
|
||||
</cfif>
|
||||
|
||||
<cfquery name="qSelFiltered" dbtype="query">
|
||||
select * from qSel where <cfif len(selectedList)>#ATTRIBUTES.key# in (#selectedList#)<cfelse>1=0</cfif>
|
||||
</cfquery>
|
||||
|
||||
<cfoutput>
|
||||
<div class="textbox-disabled" style="display:inline-block;"<cfloop collection=#ATTRIBUTES# item="attr"><!---
|
||||
---><cfif NOT listFindNoCase(attributeList,attr)> #attr#="#structFind(ATTRIBUTES,attr)#"</cfif><!---
|
||||
---></cfloop>>
|
||||
<cfif qSelFiltered.recordCount GT 0>
|
||||
<cfloop query="qSelFiltered"><!---
|
||||
---><cfset key=evaluate("#ATTRIBUTES.key#")/><!---
|
||||
---><cfset key=trim(escape64(key))/><!---
|
||||
---><div><input type="hidden" name="#ATTRIBUTES.combo#" value="#key#"/>#Evaluate(ATTRIBUTES.display)#<cfset Evaluate("WriteOutput('#ATTRIBUTES.displayf#')")/></div>
|
||||
</cfloop>
|
||||
<cfelseif isDefined("ATTRIBUTES.empty")>
|
||||
<input type="hidden" name="#ATTRIBUTES.combo#" value="#ATTRIBUTES.empty#"/><!-- #ATTRIBUTES.combo#: nothing selected -->
|
||||
|
||||
<cfelse>
|
||||
|
||||
</cfif>
|
||||
</div>
|
||||
</cfoutput>
|
||||
<cfelse><!--- ATTRIBUTES.readonly --->
|
||||
|
||||
<cfoutput>
|
||||
<select name="#ATTRIBUTES.combo#"<!---
|
||||
passthrough additional attributes
|
||||
---><cfloop collection=#ATTRIBUTES# item="attr"><!---
|
||||
---><cfif NOT listFindNoCase(attributeList,attr)> #attr#="#structFind(ATTRIBUTES,attr)#"</cfif><!---
|
||||
---></cfloop><cfif ATTRIBUTES.disabled> disabled="disabled"</cfif><cfif len(ATTRIBUTES.extra)>#ATTRIBUTES.extra#</cfif>>
|
||||
<cfif isDefined("ATTRIBUTES.empty")>
|
||||
<option value="#ATTRIBUTES.empty#"></option><!--- *** Надо было делать не пустое, а дефолтное значение, чтобы можно было ввести, например, {N/A, -1} --->
|
||||
</cfif>
|
||||
<cfloop query=qSel>
|
||||
<cfset key=evaluate("#ATTRIBUTES.key#")/><!--- в контексте запроса, поэтому находится в цикле! *** не самый лучший способ в смысле производительности --->
|
||||
<cfset key=trim(escape64(key))/>
|
||||
<cfset str_sel=strSelected(ATTRIBUTES.selected, key)/>
|
||||
<option value="#key#"#str_sel#<!---
|
||||
---><cfif len(ATTRIBUTES.style_selector) GT 0>#strAttribute("style",
|
||||
Evaluate(ATTRIBUTES.style_selector),ATTRIBUTES.style_spec)#</cfif><!---
|
||||
---><cfif len(ATTRIBUTES.class_selector) GT 0>#strAttribute("class", Evaluate(ATTRIBUTES.class_selector),ATTRIBUTES.class_spec)#</cfif><!---
|
||||
---><cfif len(ATTRIBUTES.flag_disabled) GT 0><cfif Evaluate(ATTRIBUTES.flag_disabled) GT 0> disabled="1"</cfif></cfif><!---
|
||||
--->>#Evaluate(ATTRIBUTES.display)#<cfset Evaluate("WriteOutput('#ATTRIBUTES.displayf#')")/></option>
|
||||
</cfloop>
|
||||
</select>
|
||||
</cfoutput>
|
||||
</cfif>
|
||||
|
||||
</cfprocessingdirective><cfexit method="EXITTAG"/>
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
<cfsilent>
|
||||
<cfparam name="ATTRIBUTES.name"/>
|
||||
|
||||
<cfif structKeyExists(ATTRIBUTES,"value")>
|
||||
<cfset value=#ATTRIBUTES.value#/>
|
||||
<cfelse>
|
||||
<cfset value=#ATTRIBUTES.container[ATTRIBUTES.name]#/>
|
||||
</cfif>
|
||||
|
||||
<cfparam name="ATTRIBUTES.suffix" default=""/>
|
||||
<cfparam name="ATTRIBUTES.id" default="#ATTRIBUTES.name##ATTRIBUTES.suffix#"/>
|
||||
<cfparam name="ATTRIBUTES.format" default="YYYY-MM-DD"/>
|
||||
<cfparam name="ATTRIBUTES.size" default="#len(ATTRIBUTES.format)#"/>
|
||||
<cfparam name="ATTRIBUTES.disabled" type="boolean" default="No"/>
|
||||
<cfset attributeList="name,value,container,suffix,id,format,size,disabled"/>
|
||||
|
||||
</cfsilent><cfoutput><input type="text" name="#ATTRIBUTES.name#"<cfif len(ATTRIBUTES.id)> id=#ATTRIBUTES.id#</cfif> value="#dateFormat(value, ATTRIBUTES.format)#" size="#ATTRIBUTES.size#"<cfif ATTRIBUTES.disabled> disabled="disabled"</cfif><!---
|
||||
passthrough additional attributes
|
||||
---><cfloop collection=#ATTRIBUTES# item="attr"><!---
|
||||
---><cfif NOT listFindNoCase(attributeList,attr)> #attr#="#structFind(ATTRIBUTES,attr)#"</cfif><!---
|
||||
---></cfloop>/></cfoutput><cfexit method="exittag"/>
|
||||
@@ -0,0 +1,29 @@
|
||||
<cfsilent>
|
||||
<cfparam name="ATTRIBUTES.name"/>
|
||||
|
||||
<cfif structKeyExists(ATTRIBUTES,"value")>
|
||||
<cfset value=#ATTRIBUTES.value#/>
|
||||
<cfelse>
|
||||
<cfset value=#ATTRIBUTES.container[ATTRIBUTES.name]#/>
|
||||
</cfif>
|
||||
|
||||
<cfparam name="ATTRIBUTES.suffix" default=""/>
|
||||
<cfparam name="ATTRIBUTES.id" default="#ATTRIBUTES.name##ATTRIBUTES.suffix#"/>
|
||||
<cfparam name="ATTRIBUTES.dformat" default="YYYY-MM-DD"/>
|
||||
<cfparam name="ATTRIBUTES.tformat" default="HH:MM"/>
|
||||
<cfparam name="ATTRIBUTES.size" default="#len(ATTRIBUTES.dformat)+len(ATTRIBUTES.tformat)+1#"/>
|
||||
<cfparam name="ATTRIBUTES.disabled" type="boolean" default="No"/>
|
||||
<cfparam name="ATTRIBUTES.timeFirst" type="boolean" default="No"/>
|
||||
|
||||
<cfif ATTRIBUTES.timeFirst>
|
||||
<cfset value="#timeFormat(value, ATTRIBUTES.tformat)# #dateFormat(value, ATTRIBUTES.dformat)#"/>
|
||||
<cfelse>
|
||||
<cfset value="#dateFormat(value, ATTRIBUTES.dformat)# #timeFormat(value, ATTRIBUTES.tformat)#"/>
|
||||
</cfif>
|
||||
<cfset attributeList="name,value,container,suffix,id,dformat,tformat,size,disabled"/>
|
||||
|
||||
</cfsilent><cfoutput><input type="text" name="#ATTRIBUTES.name#"<cfif len(ATTRIBUTES.id)> id=#ATTRIBUTES.id#</cfif> value="#value#" size="#ATTRIBUTES.size#"<cfif ATTRIBUTES.disabled> disabled="disabled"</cfif><!---
|
||||
passthrough additional attributes
|
||||
---><cfloop collection=#ATTRIBUTES# item="attr"><!---
|
||||
---><cfif NOT listFindNoCase(attributeList,attr)> #attr#="#structFind(ATTRIBUTES,attr)#"</cfif><!---
|
||||
---></cfloop>/></cfoutput><cfexit method="exittag"/>
|
||||
@@ -0,0 +1,18 @@
|
||||
<!---moved to layout--->
|
||||
<!---<cfif thisTag.executionMode IS "end" OR NOT thisTag.hasEndTag>
|
||||
<cfparam name="ATTRIBUTES.backUrl" type="string" default="."/>
|
||||
<cfparam name="ATTRIBUTES.enable" type="boolean" default="No"/>
|
||||
<cfoutput>
|
||||
<div class="row" style="margin:0px;">
|
||||
<div class="col-sm-3" style="padding: 0px;">
|
||||
<button type="submit" name="save" class="btn btn-secondary" style="width: 100%; padding: 6px 0px;"<cfif NOT ATTRIBUTES.enable> disabled</cfif>>#request.i18("Сохранить","Save")#</button>
|
||||
</div>
|
||||
<div class="col-sm-6" style="padding: 0px 5px;">
|
||||
<button type="submit" name="saveAndClose" class="btn btn-secondary" style="width: 100%; padding: 6px 0px;"<cfif NOT ATTRIBUTES.enable> disabled</cfif>>#request.i18("Сохранить и закрыть","Save and Close")#</button>
|
||||
</div>
|
||||
<div class="col-sm-3" style="padding: 0px;">
|
||||
<button type="button" name="close" class="btn btn-secondary" style="width: 100%; padding: 6px 0px;" onClick="document.location.href='#ATTRIBUTES.backUrl#'">#request.i18("Закрыть","Close")#</button>
|
||||
</div>
|
||||
</div>
|
||||
</cfoutput>
|
||||
</cfif>--->
|
||||
@@ -0,0 +1,18 @@
|
||||
<cfsilent>
|
||||
<cfparam name="ATTRIBUTES.titleMap" default=#structNew()#/>
|
||||
<cfparam name="ATTRIBUTES.sortArray" default=#arrayNew(1)#/>
|
||||
|
||||
<cfset attributeList="titleMap,sortArray"/>
|
||||
|
||||
<cfset extraAttributes=structNew()/>
|
||||
<cfloop collection=#ATTRIBUTES# item="attr">
|
||||
<cfif NOT listFindNoCase(attributeList, attr)>
|
||||
<cfset val="#structFind(ATTRIBUTES, attr)#"/>
|
||||
<cfif IsSimpleValue(val)>
|
||||
<cfset structInsert(extraAttributes, attr, val)/>
|
||||
</cfif>
|
||||
</cfif>
|
||||
</cfloop>
|
||||
|
||||
</cfsilent><!---
|
||||
---><cfif thisTag.executionMode is "start"><tr><cfelseif thisTag.executionMode is "end"></tr></cfif>
|
||||
@@ -0,0 +1,11 @@
|
||||
<cfsilent>
|
||||
<cfparam name="ATTRIBUTES.canWrite" type="boolean" default="Yes"/>
|
||||
<cfif NOT ATTRIBUTES.canWrite>
|
||||
<cfexit method="exitTag"/>
|
||||
</cfif>
|
||||
<cfparam name="ATTRIBUTES.entity"/>
|
||||
<cfparam name="ATTRIBUTES.key" default="#ATTRIBUTES.entity#_id"/>
|
||||
<cfparam name="ATTRIBUTES.extra" default=""/>
|
||||
<cfparam name="ATTRIBUTES.fwx"/>
|
||||
<cfparam name="ATTRIBUTES.title" default="создать"/>
|
||||
</cfsilent><cfoutput><a href="#ATTRIBUTES.entity#.cfm?#ATTRIBUTES.key#=-1<cfif len(ATTRIBUTES.extra)>&#ATTRIBUTES.extra#</cfif>&#ATTRIBUTES.fwx#" title="#ATTRIBUTES.title#" class="add"></a></cfoutput><cfexit method="exitTag"/>
|
||||
@@ -0,0 +1,10 @@
|
||||
<cfsilent>
|
||||
<cfparam name="ATTRIBUTES.canWrite" type="boolean" default="Yes"/>
|
||||
<cfif NOT ATTRIBUTES.canWrite>
|
||||
<cfexit method="exitTag"/>
|
||||
</cfif>
|
||||
<cfparam name="ATTRIBUTES.entity"/>
|
||||
<cfparam name="ATTRIBUTES.key" default="#ATTRIBUTES.entity#_id"/>
|
||||
<cfparam name="ATTRIBUTES.id"/>
|
||||
<cfparam name="ATTRIBUTES.fwx"/>
|
||||
</cfsilent><cfoutput><a href="#ATTRIBUTES.entity#_del.cfm?#ATTRIBUTES.key#=#ATTRIBUTES.id#&#ATTRIBUTES.fwx#" title="удалить" name="#ATTRIBUTES.id#" class="del"></a></cfoutput><cfexit method="exitTag"/>
|
||||
@@ -0,0 +1,9 @@
|
||||
<!---***deprecated. Use link_view_edit---><cfsilent>
|
||||
<cfparam name="ATTRIBUTES.canWrite" type="boolean" default="Yes"/>
|
||||
<cfparam name="ATTRIBUTES.entity"/>
|
||||
<cfparam name="ATTRIBUTES.key" default="#ATTRIBUTES.entity#_id"/>
|
||||
<cfparam name="ATTRIBUTES.id"/>
|
||||
<cfparam name="ATTRIBUTES.fwx"/>
|
||||
<cfparam name="ATTRIBUTES.title_edit" default="редактировать"/>
|
||||
<cfparam name="ATTRIBUTES.title_view" default="просмотреть"/>
|
||||
</cfsilent><cfoutput><a href="#ATTRIBUTES.entity#.cfm?#ATTRIBUTES.key#=#ATTRIBUTES.id#&#ATTRIBUTES.fwx#" name="#ATTRIBUTES.id#" <cfif ATTRIBUTES.canWrite>title="#ATTRIBUTES.title_edit#" class="edit"<cfelse>title="#ATTRIBUTES.title_view#" class="view"</cfif>></a></cfoutput><cfexit method="exitTag"/>
|
||||
@@ -0,0 +1,6 @@
|
||||
<cfsilent>
|
||||
<cfparam name="ATTRIBUTES.entity"/>
|
||||
<cfparam name="ATTRIBUTES.key" default="#ATTRIBUTES.entity#_id"/>
|
||||
<cfparam name="ATTRIBUTES.id"/>
|
||||
<cfparam name="ATTRIBUTES.fwx"/>
|
||||
</cfsilent><cfoutput><a href="#ATTRIBUTES.entity#.cfm?#ATTRIBUTES.key#=#ATTRIBUTES.id#&#ATTRIBUTES.fwx#" title="просмотреть" name="#ATTRIBUTES.id#" class="view"></a></cfoutput><cfexit method="exitTag"/>
|
||||
@@ -0,0 +1,9 @@
|
||||
<cfsilent>
|
||||
<cfparam name="ATTRIBUTES.canWrite" type="boolean" default="Yes"/>
|
||||
<cfparam name="ATTRIBUTES.entity"/>
|
||||
<cfparam name="ATTRIBUTES.key" default="#ATTRIBUTES.entity#_id"/>
|
||||
<cfparam name="ATTRIBUTES.id"/>
|
||||
<cfparam name="ATTRIBUTES.fwx"/>
|
||||
<cfparam name="ATTRIBUTES.title_edit" default="редактировать"/>
|
||||
<cfparam name="ATTRIBUTES.title_view" default="просмотреть"/>
|
||||
</cfsilent><cfoutput><a href="#ATTRIBUTES.entity#.cfm?#ATTRIBUTES.key#=#ATTRIBUTES.id#&#ATTRIBUTES.fwx#" name="#ATTRIBUTES.id#" <cfif ATTRIBUTES.canWrite>title="#ATTRIBUTES.title_edit#" class="edit"<cfelse>title="#ATTRIBUTES.title_view#" class="view"</cfif>></a></cfoutput><cfexit method="exitTag"/>
|
||||
@@ -0,0 +1,25 @@
|
||||
<cfprocessingdirective suppressWhitespace="YES"><cfsilent>
|
||||
|
||||
<cfparam name="ATTRIBUTES.page" type="string"/>
|
||||
<cfparam name="ATTRIBUTES.queryString" type="string" default=""/>
|
||||
<cfparam name="ATTRIBUTES.acl" type="string" default=""/>
|
||||
<cfparam name="ATTRIBUTES.label" type="string" default=""/>
|
||||
|
||||
<cfif structKeyExists(#ATTRIBUTES#,"external")>
|
||||
<cfset class="menu-item-ext"/>
|
||||
<cfset target=' target="_blank"'/>
|
||||
<cfelse>
|
||||
<cfset class="menu-item"/>
|
||||
<cfset target=''/>
|
||||
</cfif>
|
||||
|
||||
</cfsilent><!---
|
||||
---><cfmodule template="../ac.cfm" obj="#ATTRIBUTES.acl#"><cfif NOT (request.thisPage EQ ATTRIBUTES.page)><cfsilent>
|
||||
<cfif len(ATTRIBUTES.queryString)>
|
||||
<cfset pageUrl="#ATTRIBUTES.page#?#ATTRIBUTES.queryString#"/>
|
||||
<cfelse>
|
||||
<cfset pageUrl="#ATTRIBUTES.page#"/>
|
||||
</cfif>
|
||||
</cfsilent><cfoutput><li class="#class#"><a href="#pageUrl#"#target#>#ATTRIBUTES.label#</a></li></cfoutput>
|
||||
<cfelse><cfoutput><li class="selected">#ATTRIBUTES.label#</li></cfoutput></cfif><!---
|
||||
---></cfmodule></cfprocessingdirective><cfexit method="EXITTAG"/>
|
||||
@@ -0,0 +1,6 @@
|
||||
<cfsilent>
|
||||
<cfparam name="ATTRIBUTES.targetid"/>
|
||||
<cfparam name="ATTRIBUTES.enabled" default="Yes"/>
|
||||
<cfparam name="ATTRIBUTES.suffix" default=""/>
|
||||
<cfparam name="ATTRIBUTES.title" default="Сейчас"/>
|
||||
</cfsilent><cfoutput><button onclick="document.getElementById(#ATTRIBUTES.targetid#).value=""></</cfoutput><cfexit method="exittag"/>
|
||||
@@ -0,0 +1,36 @@
|
||||
<cfsilent>
|
||||
<cfparam name="ATTRIBUTES.n" type="numeric"/>
|
||||
<cfset attributeList="n,sortArray"/>
|
||||
|
||||
<cfset img_up="arr_up.png"/>
|
||||
<cfset img_dn="arr_dn.png"/>
|
||||
<cfset HIGHLIGHTED_CNT=2/>
|
||||
|
||||
<cfif isDefined("ATTRIBUTES.sortArray")>
|
||||
<cfset i=1>
|
||||
<cfloop condition="i LE HIGHLIGHTED_CNT AND i LE arrayLen(ATTRIBUTES.sortArray)">
|
||||
<cftry>
|
||||
<cfif ATTRIBUTES.sortArray[i].fld EQ ATTRIBUTES.n>
|
||||
<cfif ATTRIBUTES.sortArray[i].asc>
|
||||
<cfset img_up="arr_up#i#.png">
|
||||
<cfelse>
|
||||
<cfset img_dn="arr_dn#i#.png">
|
||||
</cfif>
|
||||
</cfif>
|
||||
<cfcatch type="Any"></cfcatch>
|
||||
</cftry>
|
||||
<cfset i=i+1>
|
||||
</cfloop>
|
||||
</cfif>
|
||||
|
||||
<cfset extra_query_string=""/>
|
||||
<cfloop collection=#ATTRIBUTES# item="attr">
|
||||
<cfif NOT listFindNoCase(attributeList,attr)>
|
||||
<cfset val="#structFind(ATTRIBUTES,attr)#"/>
|
||||
<cfif IsSimpleValue(val)>
|
||||
<cfset extra_query_string="#extra_query_string#&#attr#=#val#"/>
|
||||
</cfif>
|
||||
</cfif>
|
||||
</cfloop>
|
||||
|
||||
</cfsilent><cfoutput><a href="?sort=#ATTRIBUTES.n#a#extra_query_string#" class="noprint" style="padding:2px;" title="по возрастанию"><img src="img/#img_up#" alt="по возрастанию"></a><a href="?sort=#ATTRIBUTES.n#d#extra_query_string#" title="по убыванию"><img src="img/#img_dn#" alt="по убыванию"></a></cfoutput><cfexit method="exittag"/>
|
||||
@@ -0,0 +1,80 @@
|
||||
<cfparam name="nStart" type="integer" default="1"/>
|
||||
|
||||
<cfparam name="ATTRIBUTES.recordCount" type="integer"/>
|
||||
<cfparam name="ATTRIBUTES.recordsPerPage" type="integer"/>
|
||||
<cfparam name="ATTRIBUTES.thisPage" type="string" default=""/>
|
||||
<cfparam name="ATTRIBUTES.addtionalUrlParams" type="string" default=""/>
|
||||
<cfparam name="ATTRIBUTES.self" type="string" default=""/>
|
||||
<!---<cfparam name="ATTRIBUTES.fwx" type="string" default=""/>--->
|
||||
<cfparam name="ATTRIBUTES.output" type="string" default="paginator"/>
|
||||
|
||||
<!--- Исключение: рассчитанный индекс страницы превышает количество существующих страниц - надо возвращаться на первую --->
|
||||
|
||||
<cfset nPages = Int((ATTRIBUTES.recordCount-1)/ATTRIBUTES.recordsPerPage)+1/>
|
||||
<cfset nCurrentPage = Int((nStart-1)/ATTRIBUTES.recordsPerPage)+1/>
|
||||
<cfif nStart GT ATTRIBUTES.recordCount>
|
||||
<cfset nStart=1/>
|
||||
</cfif>
|
||||
|
||||
<cfset UrlSuffix=""/>
|
||||
<cfif len(ATTRIBUTES.addtionalUrlParams) GT 0>
|
||||
<cfset UrlSuffix="&#ATTRIBUTES.addtionalUrlParams#"/>
|
||||
</cfif>
|
||||
<cfif len(ATTRIBUTES.self) GT 0>
|
||||
<cfset UrlSuffix="&track=#ATTRIBUTES.self#"/>
|
||||
</cfif>
|
||||
|
||||
<cfset somePages=3/>
|
||||
|
||||
<cfsavecontent variable="pages">
|
||||
<cfif ATTRIBUTES.recordCount GT ATTRIBUTES.recordsPerPage>
|
||||
<cfset doMerge = false/>
|
||||
<cfloop index="i" from="1" to="#nPages#">
|
||||
<cfset nPageStartRecordNum=(i-1)*ATTRIBUTES.recordsPerPage+1>
|
||||
<!---
|
||||
схема, которая обеспечивает дихотомический поиск
|
||||
первые несколько страниц (не менее 2)
|
||||
если есть разрыв - многоточие
|
||||
посередине
|
||||
если есть разрыв - многоточие
|
||||
несколько страниц до текушей
|
||||
текущую без ссылки
|
||||
несколько страниц после текущей
|
||||
если есть разрыв - многоточие
|
||||
посередине
|
||||
если есть разрыв - многоточие
|
||||
последние несколько страниц
|
||||
--->
|
||||
<!---Можно сделать на многоточии ссылку на середину интервала!--->
|
||||
<!---Хочется добиться, чтобы при хождении вперед-назад значения повторялись--->
|
||||
<!---забавный эффект, когда остается разрыв в 1 страницу, а там все равно многоточие--->
|
||||
<cfoutput>
|
||||
<cfif i NEQ nCurrentPage>
|
||||
<cfif i GT somePages AND (nCurrentPage-i) GT somePages>
|
||||
<cfif NOT doMerge><!---*** неуклюже--->
|
||||
<cfset nMidPage = ceiling(nCurrentPage/2)/>
|
||||
<cfset nMidStartRecord = (nMidPage-1)*ATTRIBUTES.recordsPerPage+1/>
|
||||
<a href="#ATTRIBUTES.thisPage#?nStart=#nMidStartRecord##UrlSuffix#" title="#nMidPage#">...</a> <cfset doMerge=true/>
|
||||
</cfif>
|
||||
<cfelseif (i-nCurrentPage) GT somePages AND (nPages-i) GT somePages>
|
||||
<cfif NOT doMerge>
|
||||
<cfset nMidPage = ceiling((nCurrentPage+nPages)/2)/>
|
||||
<cfset nMidStartRecord = (nMidPage-1)*ATTRIBUTES.recordsPerPage+1/>
|
||||
<a href="#ATTRIBUTES.thisPage#?nStart=#nMidStartRecord##UrlSuffix#" title="#nMidPage#">...</a> <cfset doMerge=true/>
|
||||
</cfif>
|
||||
<cfelse>
|
||||
<a href="#ATTRIBUTES.thisPage#?nStart=#nPageStartRecordNum##UrlSuffix#">#i#</a>
|
||||
<cfset doMerge=false/>
|
||||
</cfif>
|
||||
<cfelse>
|
||||
<b>#i#</b>
|
||||
</cfif>
|
||||
</cfoutput>
|
||||
</cfloop>
|
||||
</cfif>
|
||||
</cfsavecontent>
|
||||
|
||||
<cfset "CALLER.#ATTRIBUTES.output#.links"=#pages#/>
|
||||
<cfset "CALLER.#ATTRIBUTES.output#.recordsPerPage"=#ATTRIBUTES.recordsPerPage#/>
|
||||
|
||||
<cfexit method="exittag"/>
|
||||
@@ -0,0 +1,154 @@
|
||||
<cfimport prefix="c" taglib="."/>
|
||||
<cfif thisTag.executionMode IS "end">
|
||||
<!--- <cfloop collection=#CALLER# item="item">
|
||||
<cfset structInsert(variables, item, CALLER[item], false)/>
|
||||
</cfloop> --->
|
||||
|
||||
<cfparam name="ATTRIBUTES.query" type="query"/>
|
||||
<cfparam name="ATTRIBUTES.recordsPerPage" type="integer" default="500"/>
|
||||
<cfparam name="ATTRIBUTES.nStart" type="integer" default="1"/>
|
||||
<cfparam name="ATTRIBUTES.titleMap" type="struct" default=srtuctNew()/><!---for definition see: field_set.cfm--->
|
||||
<cfparam name="ATTRIBUTES.sortArray" type="array" default=arrayNew(1)/>
|
||||
|
||||
<cfset tableAttributeList="query,recordsPerPage,nStart,titleMap,sortArray"/>
|
||||
<cfset colAttributeList="lang,th,td,content,field,formatter,sortable,visible,columnOrder"/>
|
||||
<cfset tdAttributeList="content,field"/>
|
||||
|
||||
|
||||
<cfparam name="thisTag.columns" type="array"/>
|
||||
|
||||
|
||||
<cffunction name=reorderColumns output="No">
|
||||
<!--- Вариант сортировки. Вынимаем все элементы с указанным порядком в отдельную коллекцию,
|
||||
после чего вставляем их в оставшуюся коллекцию на указанные позиции.
|
||||
нет смысла делать вид, что мы реализуем что-то универсальное
|
||||
(поле для сортировки в совершенно конкретном поле структуры в массиве),
|
||||
поэтому ничего не передаем в аргументах, спокойно ссылаемся на окружение--->
|
||||
<cfset var tmpOrderedIndexes=ArrayNew(1)/>
|
||||
<cfset var tmpUnorderedIndexes=ArrayNew(1)/>
|
||||
|
||||
<cfloop from=1 to=#arrayLen(thisTag.columns)# index="i">
|
||||
<cfif thisTag.columns[i].columnOrder GT 0>
|
||||
<cfset arrayAppend(tmpOrderedIndexes,i)/>
|
||||
<cfelse>
|
||||
<cfset arrayAppend(tmpUnorderedIndexes,i)/>
|
||||
</cfif>
|
||||
</cfloop>
|
||||
|
||||
<cfloop from=#arrayLen(tmpOrderedIndexes)# to=1 step=-1 index="i">
|
||||
<!--- counting up-down preserves entry order for equal columnOrders --->
|
||||
<cfset var pos=max(min(thisTag.columns[tmpOrderedIndexes[i]].columnOrder, len(tmpUnorderedIndexes)+1),1)/>
|
||||
<cfset arrayInsertAt(tmpUnorderedIndexes,pos,tmpOrderedIndexes[i])/>
|
||||
</cfloop>
|
||||
|
||||
<cfset var sortedColumns=ArrayNew(1)/>
|
||||
<cfloop from=1 to=#arrayLen(tmpUnorderedIndexes)# index="i">
|
||||
<cfset sortedColumns[i]=thisTag.columns[tmpUnorderedIndexes[i]]/>
|
||||
</cfloop>
|
||||
|
||||
<cfreturn sortedColumns/>
|
||||
</cffunction>
|
||||
|
||||
<cfset sortedColumns=reorderColumns()/>
|
||||
|
||||
<cfset thisTag.generatedContent=""/>
|
||||
|
||||
<table<!--- passthrough additional attributes
|
||||
---><cfoutput><cfloop collection=#ATTRIBUTES# item="attr"><!---
|
||||
---><cfif NOT listFindNoCase(tableAttributeList,attr)<!--- AND isSimpleValue(structFind(ATTRIBUTES,attr))--->> #attr#="#structFind(ATTRIBUTES,attr)#"</cfif><!---
|
||||
---></cfloop></cfoutput>>
|
||||
<thead>
|
||||
<tr>
|
||||
<cfloop array=#sortedColumns# index="column">
|
||||
<cfset th=column.th[1]/>
|
||||
<th<!--- атрибуты колонки передаются в TH, хотя это выглядит не очень нужным --->
|
||||
<cfloop collection=#column# item="colAttr">
|
||||
<cfif NOT listFindNoCase(colAttributeList,colAttr)><cfoutput>#colAttr#="#structFind(column,colAttr)#" </cfoutput></cfif>
|
||||
</cfloop>>
|
||||
<cfif len(column.field) AND column.sortable>
|
||||
<c:order_arrows sortArray=#ATTRIBUTES.sortArray# n=#ATTRIBUTES.titleMap[column.field].ordinal#<!--- attributeCollection=#extraAttributes#--->/>
|
||||
</cfif>
|
||||
<cfif len(th.content)>
|
||||
<cfset Evaluate("WriteOutput('#th.content#')")/>
|
||||
<cfelseif len(column.field)>
|
||||
<cfif structKeyExists(ATTRIBUTES.titleMap[column.field],"title")>
|
||||
<cfoutput>#ATTRIBUTES.titleMap[column.field].title#</cfoutput>
|
||||
</cfif>
|
||||
</cfif>
|
||||
</th>
|
||||
</cfloop>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
<cfoutput query=#ATTRIBUTES.query# maxrows=#ATTRIBUTES.recordsPerPage# startrow=#ATTRIBUTES.nStart#>
|
||||
<tr>
|
||||
<cfloop array=#sortedColumns# index="column">
|
||||
<cfset td=column.td[1]/>
|
||||
<td<!--- Если нужно передать атрибут в TD, можно ввести тег <C:TD class="r"/> только как плейсхолдер для атрибутов, а поле будет получено от колонки --->
|
||||
<cfloop collection=#td# item="tdAttr">
|
||||
<cfif NOT listFindNoCase(tdAttributeList,tdAttr)>#tdAttr#="#structFind(td,tdAttr)#" </cfif>
|
||||
</cfloop>
|
||||
><cfif len(td.content)><cfset Evaluate("WriteOutput('#td.content#')")/><!---#td.content#--->
|
||||
<cfelseif len(td.field)>#ATTRIBUTES.query[td.field][currentRow]#
|
||||
<cfelseif len(column.field)>#column.formatter(ATTRIBUTES.query[column.field][currentRow])#
|
||||
</cfif></td>
|
||||
</cfloop>
|
||||
</tr>
|
||||
</cfoutput>
|
||||
</tbody>
|
||||
|
||||
</table>
|
||||
<!--- <cfdump var=#variables#/> --->
|
||||
</cfif>
|
||||
<!--- <cfexit method="exitTag"/> --->
|
||||
|
||||
<cfscript>
|
||||
/**
|
||||
* Sorts an array of structures based on a key in the structures.
|
||||
*
|
||||
* @param aofS Array of structures.
|
||||
* @param key Key to sort by.
|
||||
* @param sortOrder Order to sort by, asc or desc.
|
||||
* @param sortType Text, textnocase, or numeric.
|
||||
* @param delim Delimiter used for temporary data storage. Must not exist in data. Defaults to a period.
|
||||
* @return Returns a sorted array.
|
||||
* @author Nathan Dintenfass (nathan@changemedia.com)
|
||||
* @version 1, December 10, 2001
|
||||
*/
|
||||
function arrayOfStructsSort(aOfS,key){
|
||||
//by default we'll use an ascending sort
|
||||
var sortOrder = "asc";
|
||||
//by default, we'll use a textnocase sort
|
||||
var sortType = "textnocase";
|
||||
//by default, use ascii character 30 as the delim
|
||||
var delim = ".";
|
||||
//make an array to hold the sort stuff
|
||||
var sortArray = arraynew(1);
|
||||
//make an array to return
|
||||
var returnArray = arraynew(1);
|
||||
//grab the number of elements in the array (used in the loops)
|
||||
var count = arrayLen(aOfS);
|
||||
//make a variable to use in the loop
|
||||
var ii = 1;
|
||||
//if there is a 3rd argument, set the sortOrder
|
||||
if(arraylen(arguments) GT 2)
|
||||
sortOrder = arguments[3];
|
||||
//if there is a 4th argument, set the sortType
|
||||
if(arraylen(arguments) GT 3)
|
||||
sortType = arguments[4];
|
||||
//if there is a 5th argument, set the delim
|
||||
if(arraylen(arguments) GT 4)
|
||||
delim = arguments[5];
|
||||
//loop over the array of structs, building the sortArray
|
||||
for(ii = 1; ii lte count; ii = ii + 1)
|
||||
sortArray[ii] = aOfS[ii][key] & delim & ii;
|
||||
//now sort the array
|
||||
arraySort(sortArray,sortType,sortOrder);
|
||||
//now build the return array
|
||||
for(ii = 1; ii lte count; ii = ii + 1)
|
||||
returnArray[ii] = aOfS[listLast(sortArray[ii],delim)];
|
||||
//return the array
|
||||
return returnArray;
|
||||
}
|
||||
</cfscript>
|
||||
@@ -0,0 +1,15 @@
|
||||
<cfif thisTag.executionMode IS "end">
|
||||
<!--- <cfloop collection=#CALLER# item="item">
|
||||
<cfset structInsert(variables, item, CALLER[item], false)/>
|
||||
</cfloop> --->
|
||||
|
||||
<cfassociate basetag="cf_column" datacollection="td"/>
|
||||
<cfset attributeList="field"/>
|
||||
<cfparam name="ATTRIBUTES.field" default=""/>
|
||||
<cfset ATTRIBUTES.content=thisTag.generatedContent/>
|
||||
</cfif>
|
||||
<!---<cfparam name="ATTRIBUTES.lang" type="string" default=""/>
|
||||
<cfparam name="request.language" type="string" default=""/>
|
||||
<cfif len(ATTRIBUTES.lang) AND #ATTRIBUTES.lang# NEQ #request.language#>
|
||||
<cfexit method="exittag"/>
|
||||
</cfif>--->
|
||||
@@ -0,0 +1,20 @@
|
||||
<cfsilent>
|
||||
<cfparam name="ATTRIBUTES.name"/>
|
||||
|
||||
<cfif structKeyExists(ATTRIBUTES,"value")>
|
||||
<cfset value=#ATTRIBUTES.value#/>
|
||||
<cfelse>
|
||||
<cfset value=#ATTRIBUTES.container[ATTRIBUTES.name]#/>
|
||||
</cfif>
|
||||
|
||||
<cfparam name="ATTRIBUTES.suffix" default=""/>
|
||||
<cfparam name="ATTRIBUTES.id" default="#ATTRIBUTES.name##ATTRIBUTES.suffix#"/>
|
||||
<cfparam name="ATTRIBUTES.size" default=""/>
|
||||
<cfparam name="ATTRIBUTES.disabled" type="boolean" default="No"/>
|
||||
<cfset attributeList="name,value,container,suffix,id,size,disabled"/>
|
||||
|
||||
</cfsilent><cfoutput><input type="text" name="#ATTRIBUTES.name#"<cfif len(ATTRIBUTES.id)> id=#ATTRIBUTES.id#</cfif> value="#value#"<cfif len(ATTRIBUTES.size)> size="#ATTRIBUTES.size#"</cfif><cfif ATTRIBUTES.disabled> disabled="disabled"</cfif><!---
|
||||
passthrough additional attributes
|
||||
---><cfloop collection=#ATTRIBUTES# item="attr"><!---
|
||||
---><cfif NOT listFindNoCase(attributeList,attr)> #attr#="#structFind(ATTRIBUTES,attr)#"</cfif><!---
|
||||
---></cfloop>/></cfoutput><cfexit method="exittag"/>
|
||||
@@ -0,0 +1,6 @@
|
||||
<cfif thisTag.executionMode IS "end">
|
||||
<cfassociate basetag="cf_column" datacollection="th"/>
|
||||
<cfset attributeList="field"/>
|
||||
<cfparam name="ATTRIBUTES.field" default=""/>
|
||||
<cfset ATTRIBUTES.content=thisTag.generatedContent/>
|
||||
</cfif>
|
||||
@@ -0,0 +1,21 @@
|
||||
<cfsilent>
|
||||
<cfparam name="ATTRIBUTES.name"/>
|
||||
|
||||
<cfif structKeyExists(ATTRIBUTES,"value")>
|
||||
<cfset value=#ATTRIBUTES.value#/>
|
||||
<cfelse>
|
||||
<cfset value=#ATTRIBUTES.container[ATTRIBUTES.name]#/>
|
||||
</cfif>
|
||||
|
||||
<cfparam name="ATTRIBUTES.suffix" default=""/>
|
||||
<cfparam name="ATTRIBUTES.id" default="#ATTRIBUTES.name##ATTRIBUTES.suffix#"/>
|
||||
<cfparam name="ATTRIBUTES.format" default="HH:MM"/>
|
||||
<cfparam name="ATTRIBUTES.size" default="#len(ATTRIBUTES.format)#"/>
|
||||
<cfparam name="ATTRIBUTES.disabled" type="boolean" default="No"/>
|
||||
<cfset attributeList="name,value,container,suffix,id,format,size,disabled"/>
|
||||
|
||||
</cfsilent><cfoutput><input type="text" name="#ATTRIBUTES.name#"<cfif len(ATTRIBUTES.id)> id=#ATTRIBUTES.id#</cfif> value="#timeFormat(value, ATTRIBUTES.format)#" size="#ATTRIBUTES.size#"<cfif ATTRIBUTES.disabled> disabled="disabled"</cfif><!---
|
||||
passthrough additional attributes
|
||||
---><cfloop collection=#ATTRIBUTES# item="attr"><!---
|
||||
---><cfif NOT listFindNoCase(attributeList,attr)> #attr#="#structFind(ATTRIBUTES,attr)#"</cfif><!---
|
||||
---></cfloop>/></cfoutput><cfexit method="exittag"/>
|
||||
Reference in New Issue
Block a user