Пользовательские функции (User Defined Functions - UDF) в ColdFusion MX
User Defined Functions (UDF) наиболее часто используемая и сильно ожидаемая новая возможность в ColdFusion 5.
В то время как разработчики долгое время могли создавать пользовательские теги (начиная с ColdFusion 2), они не могли создавать пользовательские функции до тех пор, пока не был выпущен ColdFusion 5 в 2001 году.
В ColdFusion 5 пользовательские функции можно было создавать только в <cfscript>, который появился еще в ColdFusion 4.
Таким образом, пользовательские функции - это была единственная возможность ColdFusion, требующая использования <cfscript>. В свою очередь, <cfscript> был создан для тех разработчиков, кому удобнее было писать код в стиле скрипта, а не тегами ColdFusion.
Пользовательские функции в ColdFusion 5 имели 2 главных недостатка:
- многим разработчика неудобно использовать <cfscript>
- <cfscript> может взаимодействовать только с функциями, поэтому пользоватеьсктие функции не могут взаимодействовать с тегами CFML или пользовательскими тегами.
Но в ColdFusion MX теперь есть мозможность создавать пользовательские функии без использования <cfscript>. Конечно, <cfscript> все еще поддерживается, но только для тех, кому он слишком сильно нравиться.
В ColdFusion MX функции можно создавать используя 3 новых тега:
- <cffunction> - создает функцию
- <cfargument> - определяет аргументы, передаваемые в функцию
- <cfreturn> - возвращает результат
Тег <cfargument> не обязвтелен, т.к. не во всех функциях нам нужно определять аргументы. Но другие два тега обязательны.
В ColdFusion есть функция Now(), которая возвращает текущие таду и время. Но в нем нет функции, которая вернула бы завтрашнюю дату - ее надо было вычислять самому, пока не было вот этой функции:
Функция Tomorrow() объявлена тегом <cffunction>. Название функции указывается в обязательном аттрибуте 'name'. Аттрибут 'returntype' не обязателен, но рпактика показывает, что лучше все-таки его указывать, чтобы быть уверенным, что возвращаемые данные именно того типа, который нам нужен.
Функция сама по себе просто возвращает данные, используя тег <cfreturn>. Возращенное нам значение - это текущая дата + 1 день полученные с помощью функции DateAdd().
Теперь, когда мы имеем функцию для получения завтраней даты ( Tomorrow() ), как насчет составить функцию для получения вчерашней даты ( Yesterday() )? Вот код:
Пользовательские функции используются как любые другие функции. Следующий пример кода показывает сегодняшнюю, вчерашнюю и завтрашнюю даты, используя сочетание встроенных и пользовательских функций:
Мы создали простейшую пользовательскую функцию с использованием тегов <cffunction> и <cfreturn>. Заметьте, что тег <cfreturn> всегда должен быть между тегами <cffunction> и </cffunction>.
Параметры, передаваемые в пользовательские функции
Большинство функций требуют (или принимают) параметры и в этом смысле пользовательские функции от них не отличаются.
Параметры (или говоря техническим языком "аргументы") обозначаются тегом <cfargument>. Каждый тег <cfargument> определяет один параметр в той последовательности, в которой они нужны при вызове функции.
Если параметр обязателен (выполнение функции не будет выполнено без него), то аттрибут required должен быть установлен в значение yes:
В этом примере, если параметр n не определен, то это приведет к ошибке и функция не будет отработана.
Также, можно обозначить, что требуемый параметр соответствует определенному типу:
В этом примере параметр n обязательно должен быть определен, а также должен быть числом, а не строкой или чем либо еще.
Некоторые функции принимают необязательные параметры и тег <cfargument> также их поддерживает и позволяет назначать им значения по-умолчанию:
В этом примере показано, что если параметр browser не определен, то ему присваивается значение cgi переменной.
Пример функций Square() и Cube()
Функция Square():
Как она работает:
- Тег <cffunction> создает функцию и указывает, что возвращаемое значение - число.
- Тег <cfargument> определяет, получила ли функция параметр n и является ли этот параметр числом. Иначе этот тег возвращает ошибку.
- И наконец, тег <cfreturn> возвращает параметр n, умноженный на сам на себя, т.е. n в квадрате.
Усложнив немного пример функции Square() может получить функцию Cube(), возращающую полученный параметр в кубе:
А теперь отобразим на странице результат отработки этих двух функций:
Еще один пример. Пример функций обнаружения броузера:
Функция IsIE() проверяет, смотрим ли мы страницу в броузере Internet Explorer:
Как она работает:
- Тег <cffunction> создает функцию и указывает, что возвращаемое значение - булево ("да" или "нет").
- Тег <cfargument> определяет, получила ли функция параметр browser и если нет, то этому параметру присваивается cgi значение по-умолчанию.
- Затем определяем возвращаемую переменную result.
- Выражение <cfif> проверяет, содержит ли параметр browser строку MSIE и устанавливает переменную result в значение "да", если такая строка есть.
- И наконец, тег <cfreturn> возвращает переменную result, которая равна "да" или "нет".
А вот похожая функция для обнаружения броузера Netscape:
И в заключение, приведем еще один пример обнаружения броузера программы Dreamweaver, который не является ни Netscape'ом, ни IE:
Подведем черту и отобразим результат отработки всех вышеприведенных функций обнаружения броузера:
От UDF к CFC
Как видите, использование пользовательских функций в ColdFusion MX не такое уж и сложное дело. И в отличие от ColdFusion 5, теперь нет никаких ограничений в отношении того, что вы можете делать внутри ваших функций.
И как приятное дополнение к полученным вами знаниям, следует сказать, что рассмотренные здесь три новых тега также исползуются при создании ColdFusion компонент (CFC). Так что вы уже легко сможете освоить и эту новую возможность в ColdFusion MX.
Автор статьи: Бен Форта (ben(at)forta.com)
© 2002-2005 г. Вадим Пушкарев