2015-08-21 5 views
2

2 Questions -variables globales dans ColdFusion

En CF8 dans le application.cfm I ​​froid une variable globale comme si

<cfset DSN = "dej6_42"> 

J'essaie maintenant de s'adapter à la Application.cfc dans CF10/Lucee et ne peut pas comprendre comment définir cette même variable.

Voici ma position actuelle Application.cfc

<cfcomponent output="false"> 

    <cfset This.name = "My Application"> 
    <cfset This.clientmanagement="True"> 
    <cfset This.loginstorage="Session"> 
    <cfset This.sessionmanagement="True"> 
    <cfset This.sessiontimeout="#createtimespan(0,0,10,0)#"> 
    <cfset This.applicationtimeout="#createtimespan(5,0,0,0)#"> 

    <cfset DSN = "dej6_42"> 
</cfcomponent> 

J'ai essayé

<cfset This.DSN = "dej6_42"> 

ensuite essayé d'appeler dans une page séparée

<cfoutput>#Applicaton.DSN#</cfoutput> 

Je pense que de mes recherches je vais besoin d'utiliser à la fois application.cfc et application.cfm pour accomplir ce qui précède. * edit - J'ai essayé d'ajouter un include à la fin du fichier application.cfc à applciation.cfm et cela n'a pas fonctionné.

2 Question. Lorsque je place l'une des fonctions standard dans le Application.cfc mon site se transforme en une page blanche

Voici Application.cfc - I si je supprime tout ce qui est en dessous de l'ensemble DSN alors il affichera le site.

<cfcomponent output="false"> 

    <cfset This.name = "My Application"> 
    <cfset This.clientmanagement="True"> 
    <cfset This.loginstorage="Session"> 
    <cfset This.sessionmanagement="True"> 
    <cfset This.sessiontimeout="#createtimespan(0,0,10,0)#"> 
    <cfset This.applicationtimeout="#createtimespan(5,0,0,0)#"> 

    <cfset DSN = "dej6_42"> 

    <cffunction name="onApplicationStart"> 

    </cffunction> 

    <cffunction name="onApplicationEnd"> 

    </cffunction> 


    <cffunction name="onRequestStart"> 

    </cffunction> 

    <cffunction name="onRequest"> 

    </cffunction> 


    <cffunction name="onRequestEnd"> 

    </cffunction> 

    <cffunction name="onSessionStart"> 

    </cffunction> 

    <cffunction name="onSessionEnd"> 

    </cffunction> 

    <cffunction name="onError"> 

    </cffunction> 



</cfcomponent> 
+2

La réponse de Matt est correcte. Les CFC ont leur propre portée de variables qui n'est pas partagée avec le reste de la demande. C'est par conception et souhaitable ou encapsulation. Notez également que la portée "application" ne fait nullement référence à des variables définies dans une portée dans le fichier Application.cfc. En outre, lisez les documents sur Application.cfc, vous interceptez votre demande avec des méthodes vides. –

+0

Vous pourriez vouloir donner une lecture: http://www.learncfinaweek.com/week1/Application_cfc/ comme il explique ces méthodes de cycle de vie – Abram

Répondre

3

Vous devez définir dans le champ d'application

<cfcomponent output="false"> 
    <cfset This.name = "My Application"> 
    <cfset This.clientmanagement="True"> 
    <cfset This.loginstorage="Session"> 
    <cfset This.sessionmanagement="True"> 
    <cfset This.sessiontimeout="#createtimespan(0,0,10,0)#"> 
    <cfset This.applicationtimeout="#createtimespan(5,0,0,0)#"> 
    <cfset application.DSN = 'dej6_42'> 
</cfcomponent> 
+0

J'ai essayé ceci et j'obtiens une erreur indiquant que l'élément DSN n'est pas défini dans l'application. –

+3

C'est le mauvais endroit pour définir une variable de portée d'application. Il devrait être dans 'onApplicationStart()' –

5

Votre exemple ne définit pas une variable globale. Il définit une variable dans la portée des variables: elle ne sera accessible ni à un code basé sur CFC, ni aux balises personnalisées utilisées dans la requête. Application.cfc est un CFC (pour indiquer l'évidence), ainsi les variables à portée de variables définies à l'intérieur de celui-ci sont disponibles dans le fichier Application.cfm, le fichier demandé, les fichiers qu'il contient et OnRequestEnd.cfm

seulement disponible en son sein. Si vous souhaitez définir une variable à l'échelle de l'application, vous devez la placer dans la portée de l'application. Les variables d'étendue d'application doivent être définies dans le gestionnaire onApplicationStart() qui est exécuté une fois au démarrage de l'application, mais pas à chaque requête. A titre de comparaison, Application.cfm (qui est mal nommé) est exécuté à chaque requête. Il devrait s'appeler OnRequestStart.cfm.

Si vous utilisez un onRequest() intercepteur, et dans ce include le fichier demandé à l'origine, la demande sera exécutée dans le cadre de l'instance Application.cfc et variables définies au sein onRequest() sera disponible pour le reste de la ligne principale demande du code, un peu comme la façon dont vous définissez votre variable dans Application.cfm. Sémantiquement cependant, si vous voulez dire qu'une variable existe pour la vie de l'application (comme une DSN), alors le mettre dans la portée de l'application est le meilleur pari. Il me semble, à partir des déductions que l'on peut tirer de votre question, que l'architecture de votre application pourrait être en train de languir dans les années quatre-vingt-dix. Je pense que vous devriez lire sur l'utilisation d'un cadre (par exemple: FW/1 ou ColdBox) pour mieux organiser votre code d'une manière maintenable et évolutive. Vous devez également lire sur Application.cfc (et method reference).Et probablement CFC en général: Using ColdFusion components-Developing guide.

Vous pouvez également envisager de moderniser votre approche de l'écriture CFML et d'épargner les balises pour le code de vue et d'utiliser un script. Il rend le code plus facile à suivre pour vous et les autres développeurs qui pourraient avoir besoin de le maintenir si l'ensemble de l'application n'est pas encombré de tags.

+0

Je ne suis pas sûr de suivre ce que vous voulez dire - moderniser votre approche de l'écriture CFML et épargner les balises pour le code de vue, et sinon en utilisant un script. –

+0

Nix dernier commentaire Adam. J'ai relu ce que tu as écrit. Oui je suis d'accord, c'est juste à la tentative à Application.cfc. Je prends en charge un système basé sur les tags, donc c'est ce que je suis à l'aise d'utiliser et nous utilisons application.cfm- et ce cfc est une créature différente, mais je ne suis pas contre le changement. Il est plus difficile dans cet environnement car il prend en charge plus de code, puis les changements majeurs où les réécritures sont nécessaires. C'est une aventure à coup sûr puisque le développeur a aimé coder les choses plutôt que d'utiliser des variables. –