Может ли cfmodule возвращать значения в локальную область вызывающей стороны?

Внутри cfm модуля cfmodule значения возвращаются за счет использования области действия Caller. Если я вызываю cfmodule внутри функции в CFC, Caller сопоставляется с областью переменных CFC, верно? Могу ли я вернуть значения в локальную область действия функции CFC?

Спасибо


person Henry    schedule 13.09.2011    source источник


Ответы (1)


Да, ко всему вышеперечисленному. Демонстрация:

Тестирование.cfc:

<cfcomponent>

    <cfset Variables.Instance = {} />

    <cffunction name="checkTheScopeYo" returntype="Struct">

        <cfset var LOCAL = {} />

        <!--- Call a CFModule --->
        <cfmodule template="TestModule.cfm" />

        <cfset Variables.theLocal = LOCAL />

        <cfreturn Variables />

    </cffunction>
</cfcomponent>

TestModule.cfm:

<cfif thisTag.ExecutionMode EQ "end">

    <cfset Caller.FromModule = "Set to the Variables scope" />

    <cfset Caller.Instance.FromModule = "Set to the Variables.instance variable" />

    <cfset Caller.Local.FromModule = "Set to the LOCAL scope" />

</cfif>

Scribble.cfm:

<cfset theResult = CreateObject("component", "Testing").checkTheScopeYo() />

<cfdump var="#theResult#">

Дамп показывает, что у вас есть доступ к локальным переменным внутри функции, а также к области видимости переменных всего CFC:

struct

CHECKTHESCOPEYO:  
    [function]
    Arguments: none 
    ReturnType: Struct 
    Roles:  
    Access: public 
    Output:   
    DisplayName:  
    Hint:  
    Description:  
FROMMODULE: Set to the Variables scope
INSTANCE:  
    [struct]
    FROMMODULE: Set to the Variables.instance variable
THELOCAL:  
    [struct]
    FROMMODULE: Set to the LOCAL scope
THIS:  
    [component Testing]
    Methods: 
        CHECKTHESCOPEYO
            [function]
            Arguments: none 
            ReturnType: Struct 
            Roles:  
            Access: public 
            Output:   
            DisplayName:  
            Hint:  
            Description:  
person Dan Short    schedule 14.09.2011
comment
так что лучше всего сначала использовать var как var q = "" и использовать <customTag return="q">? - person Henry; 14.09.2011
comment
Честно говоря, я никогда не использовал пользовательский тег внутри функции CFC. И я в очень редких случаях использовал область Caller. Я полагаюсь на CustomTags для отображения... поэтому, если мне для чего-то нужен вывод из CustomTag, я оборачиваю его в cfsavecontent и таким образом получаю HTML... Если вы должны пойти по этому пути, да, я бы установил верните имя переменной в атрибуте и установите для него значение Caller[Attributes.return] из CustomTag, чтобы получить результат там, где вы хотите, не полагаясь на жестко запрограммированное имя переменной Caller. - person Dan Short; 14.09.2011
comment
Дайте мне знать, если вам нужен пример кода, который позволит это сделать, и я обновлю ответ. Я упоминал, что люблю CustomTags? - person Dan Short; 14.09.2011
comment
Да, да... устаревшая система использует его ОБШИРНО (эра до CFC) и... нет, мне это не нравится. :) - person Henry; 14.09.2011
comment
Вы должны научиться любить пользовательские теги, но по правильной причине :). И есть что-то мягкое, чтобы бросить людям, когда вам нужно работать с этой устаревшей системой с пользовательскими тегами в CFC. - person Dan Short; 14.09.2011
comment
значит ли это, что область действия вызывающей стороны — это не просто область действия переменных CFC, а сочетание локальных и переменных? - person Henry; 14.09.2011
comment
Область Caller действительно дает вам доступ ко всему, что вы имели бы в функции вызова, что означает, что вы получаете доступ как к области локальной функции, так и к области Variables. Я предполагаю (и еще не проверял), что он будет следовать тем же правилам цепочки областей видимости, что и любая другая страница CF. Итак, если бы у вас была (в языке CF9) переменная LOCAL.foo, а также переменная Variables.foo, то она сначала попала бы в область LOCAL, а затем в область Variables. Мой образец не подходит для этой ситуации. Похоже, мне нужно сделать еще несколько cfset. - person Dan Short; 14.09.2011
comment
Действуйте так, как будто код модуля выполняется внутри вызывающей функции, и это сообщит, какие переменные (и в каком порядке) будут иметь к ним доступ. - person Dan Short; 14.09.2011
comment
хорошо, такое же поведение, как <cfquery name="q">, я полагаю. Спасибо! - person Henry; 14.09.2011