<cfsilent>	
<!---Замещает любую переменную (*** небезопасно) тега layout:page --->
<!---Тег layout:page проглатывает собственный контент, и вместо него после закрытия выводит разметку на основании атрибутов (при открытии тега он формирует переменные -  фрагменты разметки - по шаблону) и вложенных тегов layout:attribute (которые по закрытии тега на самом деле перезаписывают переменные в layout:page).
Вложенные теги удобны, чтобы передавать читабельную разметку, а не строку в кавычках.--->
<cfparam name="ATTRIBUTES.name"/><!---имя переменной layout:page, чаще всего title, controls--->
<!--- ATTRIBUTES.value --->
<cfparam name="ATTRIBUTES.append" default=""/><!---before,after--->

<cfif thisTag.executionMode IS "end">

	<cfassociate basetag="cf_page"/>		
	<cfset layoutTemplate=getBaseTagData('cf_page',1)/>
	
	<cfif structKeyExists(ATTRIBUTES, "value")>	
		<cfset value=ATTRIBUTES.value/>
	<cfelse>
		<cfset value=thisTag.generatedContent/>
	</cfif>
	
	<!---ниже в комментариях предполагается, что мы меняем фрагмент разметки, например, controls, но на самом деле это может быть любая переменная тега layout:page--->
	<cfif structKeyExists(layoutTemplate,"#ATTRIBUTES.name#") AND lcase(ATTRIBUTES.append) EQ "before">
		<!---дописать в начало фрагмента разметки с именем name, сгенерированного layout:page, например, controls--->
		<cfset "layoutTemplate.#ATTRIBUTES.name#" =  value & layoutTemplate["#ATTRIBUTES.name#"]/>
	<cfelseif structKeyExists(layoutTemplate,"#ATTRIBUTES.name#") AND lcase(ATTRIBUTES.append) EQ "after">
		<!---дописать в конец фрагмента разметки с именем name,, сгенерированного layout:page, например, controls--->
		<cfset "layoutTemplate.#ATTRIBUTES.name#" =  layoutTemplate["#ATTRIBUTES.name#"] & value/>
	<cfelse>
		<!---заменить фрагмент разметки с именем name, сгенерированный layout:page--->
		<cfset "layoutTemplate.#ATTRIBUTES.name#"= value/>
	</cfif>
	<cfset thisTag.generatedContent=""/>
</cfif>
</cfsilent>