CustomTag CFScript «Нюанс»

У меня все еще есть несколько 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

Оцените статью
devanswers.ru
Добавить комментарий