2013-01-01 11 views
6

मैं एक पुरानी साइट को सीएफ 10 में परिवर्तित कर रहा हूं और अपने कुछ सहायक कोड को आगे ले जाना चाहता हूं।कोल्डफ्यूजन - सीएफसी सेटर्स में एक क्वेरी को कनवर्ट करना

कोड लग रहा है एक प्रश्न पर, चीजें हैं जो हमारे उदाहरण में हैं पाता है, और उन्हें भरता है:

<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> 

मैं हमारे वर्तमान 'getMetaData()' उपयोग करने वाली प्रॉपर्टी का एक आसान मूल्यांकन के साथ structKeyExists(variables.instance, local.col) जगह ले ली है, लेकिन मैं अगली पंक्ति साथ परेशानी हो रही हूँ: <cfset variables.instance[local.col] = arguments.source[local.col]) />

अगर मैं <cfset this[local.col] =arguments.source[local.col] /> के लिए इसे बदल, यह अंतर्निहित setters ध्यान नहीं देता और सिर्फ इस दायरे में परिणाम डालता है ...

आदेश में कोशिश करते हैं और हमारे setters कॉल करने के लिए, मैं कोड के इस बिट की कोशिश की:

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

लेकिन इस जटिल लगता है और त्रुटि प्रवण (भी तार में किसी भी " '" रों बचने के लिए है)।

कुछ या सभी सीएफसी गुणों को लोड करने के लिए क्वेरी का उपयोग करने का सबसे अच्छा तरीका क्या है बिना स्पष्ट रूप से this.setPROPERTYNAME(query.COLUMN) को संभवतः कई दर्जन बार कॉल करने के बिना ????

उत्तर

7

तो अगर मैं यह सब सही ढंग से पढ़ रहा हूं, तो आपका प्रश्न वास्तव में "मैं गतिशील तरीके से एक विधि कैसे कॉल करूं?", और बाकी सब ड्रेसिंग सेट कर रहे हैं?

आप गतिशील चर नाम, संदर्भ के माध्यम से समारोह सेट तो है कि करने के लिए एक समारोह संदर्भ सेट तो कॉल करने के लिए एक स्ट्रिंग का उपयोग कर सकते हैं:

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

हाँ! "मैं गतिशील तरीके से एक विधि कैसे कॉल करूं?" मैं उपयोग करने के लिए सही क्रियाओं के बारे में नहीं सोच सका ... stoopid छुट्टी, मेरा दिमाग बाहर निकल रहा है। –

+2

हे स्टीफन ... @ बेयनेज़ी का जवाब मेरी तुलना में बेहतर है! मैंने जो सुझाव दिया उसके बजाए आपको जो सुझाव दिया गया उसके साथ चलना चाहिए। –

6

आप cfinvoke

<cfinvoke method="set#property#"> 

मेक भावना का उपयोग कर सकते हैं तरीकों गतिशील कॉल करने के लिए चाहते हैं?

+1

असल में, हाँ अच्छा कॉल। फंक्शन संदर्भों के साथ चारों ओर घुड़सवारी बचाता है। –

+0

ठीक है, मैंने कोशिश की लेकिन मैं इसे सेट करने के लिए तर्क स्वीकार नहीं कर सकता क्योंकि मुझे नहीं पता कि तर्क का नाम क्या है। (मैंने किसी भी भाग्य के साथ की कोशिश की) ... –

+0

आह ठीक है, मैं आपकी समस्या देखता हूं। क्या आपके पास अपने सेटर्स के लिए आपके तर्क नाम के लिए नामकरण सम्मेलन नहीं है, वैसे ही आपके पास अपनी विधि के लिए नामकरण सम्मेलन है? यदि आप ऐसा करते हैं तो आप इसके अतिरिक्त जो मैंने पहले रखा है उसके अलावा आप अतिरिक्त रूप से cfinvokeargument का उपयोग कर सकते हैं। – baynezy

संबंधित मुद्दे