2013-01-01 17 views
6

Daha eski bir siteyi CF 10'a dönüştürüyorum ve bazı yardımcı kodlarımı iletmek istedim.ColdFusion - Bir sorguyu CFC ayarlayıcılarına dönüştürme

<cffunction name="populateSelf"> 
    <cfargument name="source" type="query" required="yes" /> 
    <cfif arguments.source.recordcount EQ 1> 
     <cfloop list="#arguments.source.columnlist#" index="local.col"> 
      <cfif structKeyExists(variables.instance, local.col)> 
       <cfset variables.instance[local.col] = arguments.source[local.col]) /> 
      </cfif> 
     </cfloop> 
    </cfif> <!--- one record? ---> 
</cffunction> 

ben 'getMetaData()' kullanıldığı mevcut özelliklerin kullanışlı değerlendirmeyle structKeyExists(variables.instance, local.col) yerini almış,:

kod sorguda, bizim örneğinde şeyler bulur arar ve onları doldurur ...

amacıyla ben <cfset this[local.col] =arguments.source[local.col] /> bunu değiştirirseniz <cfset variables.instance[local.col] = arguments.source[local.col]) />

, bu örtük ayarlayıcılar yok sayar ve sadece bu kapsamda sonuçları koyar: ama sonraki satıra ile sorun yaşıyorum

<cfset setValue =arguments.source[local.col] /> 
<cfset evaluate("set#local.col#('#setValue#')" /> 

ama bu karmaşık görünüyor ve eğilimli hatası (çok dizeleri herhangi bir "'" s kaçmak gerekir): denemek ve bizim belirleyiciler çağırmak, ben bu kod biraz denedik.

Muhtemelen birkaç düzine kez this.setPROPERTYNAME(query.COLUMN) aramak zorunda kalmadan bir CFC özelliklerinin tümünü veya tümünü yüklemek için bir sorguyu kullanmanın en iyi yolu nedir ???? dinamik yöntemleri çağırmak istiyorsanız

cevap

7

Eğer bütün bunları doğru okuyorsam, sorunuz aslında "bir yöntemi dinamik olarak nasıl ararım?

Sen referans yoluyla işlevini daha sonra, dinamik değişken adını ayarlamak buna bir işlev başvurusu ayarlayın, ardından aramak için bir dize kullanabilirsiniz:

myMethodName = "set#local.col#"; 
myMethodReference = this[myMethodName]; 
myMethodReference(arguments.source[local.col]); 
+0

evet! "Bir yöntemi dinamik olarak nasıl arayabilirim?" Kullanmak için doğru fiilleri düşünemedim ... stoopid tatil, beynim sızıyor. –

+2

Hey Stephen ... @ baynezy'nin cevabı benimkinden daha iyi! Önerdiğimden çok önerdiği şeyle koşmalısın. –

6

Eğer

<cfinvoke method="set#property#"> 

Yap anlamda cfinvoke kullanabilir?

+1

Aslında evet iyi çağrı. Fonksiyon referansları ile horlamayı kaydeder. –

+0

Tamam, denedim ama argüman ismini bilmediğim için ayarlanacak bir argümanı kabul etmem. (Denedim hayır şanssız) ... –

+0

Ah Sorununuzu görüyorum. Sizin belirleyicileriniz için argüman isminiz için adlandırma kuralı, yönteminizin kendisi için bir adlandırma kuralı gibi mi? Eğer yaparsanız, daha önce eklediklerime ek olarak cfinvokeargument kullanabilirsiniz. – baynezy