Странный результат с использованием пользовательского тега ColdFusion - PullRequest
1 голос
/ 28 февраля 2011

Я создал простой пользовательский тег, который принимает строку, заменяя пробел на «-» и «&» на «и» для строки запроса (я не хочу% 20 и т. П.).

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

qsEncode.cfm: (пользовательский тег)

<cfparam name="attributes.string" type="string" default="">

<cfset whitespace = Replace(attributes.string," ","-","all")>
<cfset ampersand =  Replace(whitespace,"&","and","all")>

<cfoutput>#ampersand#</cfoutput>

Реализация тега:

<a href="?Page=<cf_qsEncode string="#getCategory.Name#">">#getCategory.Name#</a>

И окончательный вывод, создающий пробел перед тегом:

somepage.cfm?Page=%20Finance-and-Taxes

Моему пользовательскому тегу не передается строка, к которой добавлен пробел (и даже если бы он был заменен символом "-"), поэтому я не понимаю, почему тег создает пробел.

Примечание: Я понимаю, что могу включить ?Page= в свой пользовательский тег, который бы это исправил, но мне все еще любопытно, почему это происходит.

Ответы [ 2 ]

6 голосов
/ 28 февраля 2011

Ваша конкретная проблема с дополнительным пространством может быть исправлена ​​с помощью:

<cfsetting enablecfoutputonly="true">

как самое первое, что есть внутри вашего пользовательского тега (и в конце его значение возвращается на «false»).

Однако я бы настоятельно рекомендовал заменить функциональность пользовательского тега на фактическую функцию - либо встроенную, либо (предпочтительно) внутри cfc. В любом случае, вы хотите что-то вроде этого:

<cffunction name="qsEncode" output="false" returntype="string">
  <cfargument name="str" type="string" required="true">
  <cfset var whitespace = Replace(arguments.str," ","-","all")>
  <cfset var ampersand = Replace(whitespace,"&","and","all")> 
  <cfreturn ampersand>
</cffunction>

Тогда у вас будет:

<a href="?Page=#qsEncode(getCategory.Name)#">#getCategory.Name#</a>

Для служебных функций, подобных этим, которые не поддерживают состояние, быстрое решение (оставляя в стороне аргументы в пользу мудрости синглетонов) состоит в том, чтобы установить утилиту cfc и сохранить ее как одиночный в области приложения. Создайте экземпляр utility.cfc в обработчике onApplicationStart вашего Application.cfc. Затем во всем приложении вы можете делать такие вещи:

application.utility.qsEncode('this');
application.utility.someOtherFunction('that');
application.utility.yetAnotherStringMangler('theother');    
0 голосов
/ 02 марта 2011

Кен правильный - пробел в вашем пользовательском теге CFM создает дополнительное пространство в его выводе.И я рекомендую его ответ (я предпочитаю вызывать функции UDF по сравнению с пользовательскими тегами CFM ... даже лучше как функцию в объекте CFC вместо CFM).

Но если вы хотите просто настроить существующий пользовательский тег,используйте CFSILENT для подавления вывода пробелов (и убедитесь, что после последнего тега в файле нет запаздывающих пробелов).

<cfsilent>
<cfparam name="attributes.string" type="string" default="">

<cfset whitespace = Replace(attributes.string," ","-","all")>
<cfset ampersand =  Replace(whitespace,"&","and","all")>

</cfsilent><cfoutput>#ampersand#</cfoutput>
...