У меня все еще есть несколько CustomTag, которые мы использовали в производстве в течение многих лет, и теперь, когда я пишу больше cfscript, я решил продолжить использование некоторых из них (пока), используя следующий синтаксис, о котором я узнал на StackOverflow:
CFML tag-based approach:
<cf_customTagName param1=param1Value>
CFScript approach:
cf_customTagName(param1=param1Value);
Я сразу же обнаружил, что метод cfscript выполняет тег дважды. Чтобы дважды выполнить версию на основе тегов, используя синтаксис CFML на основе тегов, нужно явно использовать начальный и конечный теги, а затем проверить thisTag.executionMode
со значением либо start
, либо end
.
<cf_customTagName param1=param1Value>
<!--- this runs the tag twice w/different executionModes --->
</cf_customTagName>
Этот «нюанс» (то, что пользовательские теги на основе CFM всегда выполняются дважды через cfscript) не документирован в единственной документации Adobe, в которой это обсуждается: «Поддержка сценариев для пользовательских тегов». (ПРИМЕЧАНИЕ: я не уверен, что такое же поведение наблюдается в Lucee CFML).
Решение для этого — проверить, выполняется ли файл CFM как CustomTag (т.е. если thisTag.executionMode
существует и имеет значение start
), а затем выйти.
<cfif isDefined("thisTag.executionMode") and thisTag.executionMode is "start">
<cfexit>
</cfif>
Если вы не сделаете это явным образом, вы рискуете тем, что функции пользовательского тега будут неосознанно выполнены дважды, что может вызвать проблемы с данными или негативно повлиять на производительность.
Вот файлы, которые я создал для воспроизведения и проверки этого:
https://gist.github.com/JamoCA/2d48f9eb88ceb7f8bcb93fc3ab718ffa