2010-06-09 15 views
6

Przeprowadzam migrację starej aplikacji korzystającej z application.cfm w celu użycia aplikacji application.cfc. ustawia CFM kilka globalne takie jakMożliwe utworzenie globalnego nieskopiowanego w pliku application.cfc?

<cfset dsn = "myDSN"> 

Próbowałem oddanie tej linii kodu w onApplicationStart, onRequestStart itp ale próbuje wydrukować tę wartość w ciągu stronie wyników testu w błąd. Ustawienie wartości w zakresie aplikacji (np. Application.dsn) działa dobrze, ale jestem w bardzo krótkim terminie i nie mogę napędzać łodzi, wykonując wyszukiwanie w całym serwisie i zastępując je dla każdego globalnego.

Wiem, że umieszczanie ich w teleskopach jest słuszne, ale na chwilę obecną jest jakiś sposób, aby przejść do korzystania z Application.CFC, ale nadal tworzyć nieprzesuwione zmienne globalne?

Odpowiedz

9

Spróbuj umieścić go wewnątrz onRequest() zamiast onRequestStart().

+0

To załatwiło sprawę, chociaż oddałem głos pod poniższą odpowiedź, ponieważ dobrze jest o tym wiedzieć w przyszłości. – DaveBurns

4

Potrzebne będą zarówno Application.cfc, jak i Application.cfm. Przenieś cały główny kod z Application.cfm do odpowiednich części Applicaiton.cfc.

Wtedy, a to może być jedyna linia, w Applicaiton.cfm:

<cfset variables.dsn = "myDSN" />

Teraz wróć do Application.cfc i dodać to poza wszystkim funkcje:

<cfinclude template="Application.cfm" />

na test.cfm, powinien mieć możliwość wyjścia zmienna DSN bez prefiksu zakres:

<cfoutput>#dsn#</cfoutput>

Jeśli zdefiniujesz variable.dsn w dowolnym miejscu wewnątrz CFC, wstawiasz zmienną do zakresu zmiennych CFC, który jest prywatny dla CFC. Definiując go w CFM, a następnie w CFM, jest przechowywany w zakresie zmiennych żądania strony.

+2

Jeśli podejmiesz takie podejście, nazwałbym dołączony plik podobnie jak globals.cfm, aby uniknąć nieporozumień co do tego, czy jest on traktowany jak Application.cfm w poprzednich wersjach CF (której nie ma). –

+0

Czy ktoś przetestował to interesujące podejście? Może robię coś nie tak z moimi 3 szablonami jednoliniowymi, ale to nie działa dla mnie (CF9). Wypróbowałem application.cfm i globals.cfm. Szczerze mówiąc, nie spodziewałem się, że to zadziała, ponieważ nie widzę, dlaczego ustawienie zmiennej w dołączonym pliku powinno "opuścić" zakres włączania cfc i sprawić, że var będzie dostępny globalnie. I dlaczego bezpośrednie ustawienie var w pliku application.cfc poza funkcjami nie powinno działać w ten sam sposób. Metoda onRequest() "Mixin" działa zgodnie z oczekiwaniami. –

+0

Próbowałem również tego na CF9, aktualizacja 1 z wynikiem negatywnym. –

1

Zmagając się z tym sam, dam ci moje rozwiązanie. Zauważ, że działa to na CF9, nie wiem o innych wersjach (jest problem z wywołaniami onRequest i AJAX w poprzednich wersjach). Zasadniczo konieczne jest posiadanie funkcji onRequest w aplikacji Application.cfc. Oto podstawowy szablon:

<cffunction name="onRequest" access="public" returntype="void" output="true"> 
    <cfargument name="targetPage" type="string" required="true"> 

    <!--- include the requested page. ---> 
    <cfinclude template="#arguments.TargetPage#"> 
</cffunction> 

As far as I understand it: it's actually the cfinclude that enables you to access the functions. So, with this onRequest in your Application.cfc you can access the 'this' scope of the Application.cfc which would include your public functions & variables. 
If you want a more in depth example of this then check out Framework-1 by Sean Corfield. It does this exact thing, all API methods are contained in the Application.cfc. 
Powiązane problemy