Недавно на форумах SitePoint ColdFusion прошла небольшая дискуссия о CFC и о том, как каждый, кто их объясняет или учит их, произносит много модных слов, что делает их более запутанными, чем помогает им в этом. Теперь я знаю, что это происходит, потому что я виновен в этом, как и многие другие опытные разработчики ColdFusion. Надеюсь, с этим постом я смогу помочь перенести тех, кто интересуется, но не уверен насчет ХФУ, в этот замечательный мир.
Так что же такое ХФУ? Во-первых, CFC на самом деле называется компонентом ColdFusion, и в самых простых терминах это просто шаблон ColdFusion (он же страница или файл ColdFusion), но вместо расширения .cfm или .cfml он имеет расширение .cfc.
Теперь, только потому, что файл имеет расширение .cfc, он не делает его CFC сразу. Как только вы создали свой файл .cfc, вам нужно написать код. Обычно CFC состоит из 2 или 3 основных частей. Первая часть — это теги CFC, и они выглядят примерно так:
<cfcomponent displayname="Greeting" hint="I'm a greeting CFC">
</cfcomponent>
Существует только один тег, который создает CFC, и это тег CFComponent, который требует как открывающий, так и закрывающий тег. Теперь с этого момента вы можете добавить некоторый код в эти теги или оставить его пустым, оставив пустым, вы получите пустой CFC. Вы заметите, что мой тег CFComponent имеет два дополнительных атрибута displayname и hint . Это описательный атрибут в том смысле, что они ничего не делают, но описывают CFC. Атрибут displayname — это имя, которое отображается, когда ColdFusion auto создает документацию для CFC, а подсказка — описание. Мы еще поговорим о документации позже 🙂
Так что же может быть внутри этих тегов CFComponent? Практически любые теги ColdFusion, которые вы обычно используете, могут использоваться внутри тегов CFComponent. Обычно CFC — это набор функций, использующих тег CFFunction, а иногда и свойства, используя тег CFProperty.
Теперь я уверен, что вы видели тег CFFunction и, если вы проделали какую-либо обширную разработку с CF MX (версия 6) или позже, вы использовали свою справедливую долю тегов CFFunction. Для CFC вы используете тот же синтаксис, что и в любом другом месте своего кода. Например, если бы я хотел, чтобы функция возвращала общее приветствие для меня, я мог бы написать его так:
<cffunction name="getGreeting" output="false" returntype="string" description="Returns a greeting string">
<cfargument name="visitor" required="no" type="string" displayname="Visitor String" hint="The Visitors name">
<cfif IsDefined('arguments.visitor') AND Len(Trim(arguments.visitor))>
<cfreturn 'Welcome ' & arguments.visitor & '! I hope you enjoy your stay.'>
<cfelse>
<cfreturn 'Welcome guest! Enjoy your visit and please come back soon.'>
</cfif>
</cffunction>
Теперь этот код немного сложнее, поэтому я пронумеровал каждую строку, чтобы мы могли пройти по ней без необходимости перепечатывать ее (и рисковать ошибкой вырезания и вставки!). Таким образом, строка 1 устанавливает нашу функцию с тегом CFFunction, и в этом теге я использовал 4 атрибута. Атрибут name — это формулировка, которую я буду использовать для ссылки или вызова этой функции, в данном случае она называется getGreeting. Затем я установил для выходного атрибута значение false, которое сообщает ColdFusion обрабатывать эту функцию так, как если бы она была внутри тега CFSilent, тем самым заставляя выводить только текст, указанный в теге CFReturn, при вызове функции. Если я установлю вывод в true, то любой код, который у меня был внутри этой функции (включая HTML), будет отображаться при обработке этой функции. 99% времени вы хотите убедиться, что вы установили вывод в false, если у вас нет причин для обработки и отображения HTML и CFML без использования тега cfreturn. (Я еще не сталкивался с этим, но я уверен, что кто-то имеет). Следующий атрибут — это тип returnty, который я установил в строку . Установка типа возврата полезна, поскольку позволяет ColdFusion проверять ошибки данных, которые возвращает конкретная функция. Так что, если бы я случайно возвратил массив, или запрос ColdFusion вывел бы ошибку, сообщив мне, что тип данных, возвращаемых из этой функции, не имеет типа string. Очень редко мои функции на самом деле возвращают что-то кроме того, о чем я говорю, но когда вы попадаете в сложные CFC, которые возвращают все виды типов данных, установка типа возврата может быть очень полезной. Теперь вам не нужно устанавливать тип возвращаемых данных, но если CFC и функции являются новыми для вас, я бы порекомендовал вам делать это до тех пор, пока вы не поймете, что именно происходит и почему. Хорошо, последний атрибут, который мы установили — это описание, и оно просто используется, чтобы описать коллеге-разработчику, что происходит, и если вы используете ColdFusion для создания ваших документов (подробнее об этом позже), это будет выводиться в этих документах, поэтому всегда попробуйте описать свои функции.
Строка 2 является тегом CFArgument. Функции имеют возможность принимать данные, а затем обрабатывать или делать что-то с этими данными, эти переданные данные называются аргументами, а функции могут иметь несколько аргументов, переданных. Тег CFArgument выше состоит из 5 атрибутов. атрибут name — это имя передаваемого аргумента, в данном случае это посетитель . Далее у нас есть обязательный атрибут, который сообщает ColdFusion, требуется ли этот аргумент для правильной работы функции. В этом случае мы установили значение обязательного атрибута в no, чтобы мы могли вызывать эту функцию и не передавать никаких аргументов. Затем у нас есть атрибут type, который сообщает ColdFusion, какими будут данные этого аргумента. Опять же, указав тип, ColdFusion проверит переданные данные и, если они не указанного типа, вернет ошибку. В этом случае мы сказали нашей функции, что посетитель будет иметь тип string, поэтому он будет позволять вводить что угодно. Последние два атрибута displayname и hint снова используются, чтобы помочь моим коллегам-разработчикам узнать, что происходит, а также для документации.
В строке 3 начинается оператор if, где мы проверяем, был ли передан мой аргумент посетителя в нашем not. При использовании функций все передаваемые переменные находятся в области аргументов, которая является областью, доступной только коду внутри открывающих и закрывающих тегов функции. Здесь я использую функцию IsDefined, чтобы увидеть, существует ли переменная, и если она существует, то следующий бит кода для выполнения — это мои функции Len () и Trim (). Я вложил функцию обрезки в функцию len, так что любые пробелы или возвраты каретки в данных переменной посетителя будут удалены, и я получу значение длины только для фактических данных, переданных в строке. Делая обрезку, а затем лени я могу убедиться, что куча пустых мест, вкладок или возвратов не были отправлены и что у меня действительно есть строка используемых данных. Я мог бы написать этот бит кода как Len (Trim (arguments.visitor)) GT 1, и он имел бы тот же эффект, что и Len (Trim (arguments.visitor)), поскольку последний вернет либо ноль, либо некоторое положительное число.
ОК, строка 4 имеет тег CFReturn, и вы должны заметить, что здесь нет атрибутов. тег CFReturn принимает выражение, в данном случае строку, и именно это выражение возвращается функцией. Здесь я набрал небольшое приветствие и использовал символ &, чтобы объединить две строки вокруг любых данных, которые были переданы в мою функцию через переменную посетителя.
строка 5 является нашим оператором cfelse, поэтому, если arguments.visitor не существует ИЛИ длина значения для arguments.visitor после его обрезки была равна 0, тогда строка 6 будет выполнена.
строка 6 — это еще один тег CFReturn, но на этот раз это просто текстовое предложение без объединения переменных, как мы видели в строке 4.
Строка 7 закрыла наш блок CFIF, а строка 8 закроет наш тег CFFunction. Так что, если мы добавим код нашего компонента в наш код функции, он должен выглядеть так:
<cfcomponent displayname="Greeting" hint="I'm a greeting CFC">
<cffunction name="getGreeting" output="false" returntype="string" description="Returns a greeting string">
<cfargument name="visitor" required="no" type="string" displayname="Visitor String" hint="The Visitors name">
<cfif IsDefined('arguments.visitor') AND Len(Trim(arguments.visitor))>
<cfreturn 'Welcome ' & arguments.visitor & '! I hope you enjoy your stay.'>
<cfelse>
<cfreturn 'Welcome guest! Enjoy your visit and please come back soon.'>
</cfif>
</cffunction>
</cfcomponent>
Так что теперь у вас есть очень простой ХФУ. Вы можете скопировать этот текст в ваш редактор по вашему выбору и сохранить файл какreeting.cfc. Итак, теперь, когда у вас есть этот CFC, что вы можете с ним сделать? как ты это называешь? в чем смысл? Все это замечательные вопросы, но вам придется подождать не менее 24 — 48 часов, чтобы получить ответ. Почему? Потому что я пишу это в 11 часов вечера в День Благодарения, и у меня есть планы встать в 3 часа ночи в надежде забить себе Nintendo Wii. Да, я геймер, и в последний раз, когда я стоял в очереди на Wii, мне посчастливилось узнать, что я был номером 29 в очереди на 26 единиц, судьба, которую я надеюсь не повторить! Так что ищите мой следующий пост через 24 часа после того, как этот выйдет в эфир (не уверен, когда это произойдет, так как мое интернет-соединение здесь нестабильно).