Right!.

Your call (if you are using the form scope) would look like this:

object.update_product(argumentCollection=form);
or
object.update_product(duplicate(form));

Same thing if you are looking at something in the session: 
object.update_product(argumentCollection=session.key);

Rick Faircloth wrote:
> Thanks for the feedback, Jake.
>
> All that "reassigning" of variables is a lot more typing.  (But, can I 
> get around
> reassigning each form variable individually by using the 
> "argumentCollection"
> attribute when calling the method?)
>
> I think I see what you're saying, however.
>
> By "translating" the type of variable coming in to the method into the 
> argument scope,
> then any type of variable can be fed into the method...session, url, 
> form, etc.,... making
> the method more flexible.
>
> Right?
>
> Thanks for the re-write, too!  That helps me understand how things need 
> to change.
>
> Jake Churchill wrote:
>   
>> I generally make my CFCs as generic as possible.  You are updating a 
>> product and looking in the form scope for everything.  It'll work, 
>> sure.  But, what if in the future you get an entire cart.  Then you 
>> won't be looking in the form scope, you'll be looking at something in 
>> the session or database.  In that case, you'll want to be able to loop 
>> over something and pass stuff into the function which would be very 
>> tricky if the function is stuck in the form scope.  Also, there's no 
>> reason to copy the arguments over to variables.  Variables would be used 
>> more if you are actually instantiating a CFC as an object.  I assume you 
>> are not because if you did that, you'd probably pass an object into the 
>> update product.
>>
>> Here's a way I'd re-write your function to make it more abstract:
>>
>> <cffunction name = "update_product" displayname = "update_product" hint 
>> = "Update specified product" output = "false">
>>     <cfargument name="product_id" type="string" required="yes">
>>     <cfargument name="name" type="string" required="false" default="">
>>     <cfargument name="description" type="string" required="false" 
>> default="">
>>     <cfargument name="regular_price" type="numeric" required="false" 
>> default="">
>>     <cfargument name="featured" type="string" required="false" default="">
>>     <cfargument name="special" type="string" required="false" default="">
>>     <cfargument name="special_price" type="numeric" required="false" 
>> default="">
>>     <cfargument name="photo_150" type="string" required="false" default="">
>>     <cfargument name="photo_400" type="string" required="false" default="">
>>    
>>     <cfquery name = "qUpdateProduct" datasource="#application.dsn#">
>>         update    products
>>         set        name = <cfqueryparam cfsqltype="cf_sql_varchar" 
>> value="#arguments.name#">,
>>                 description = <cfqueryparam cfsqltype="cf_sql_varchar" 
>> value="#arguments.description#">,
>>                 regular_price = <cfqueryparam cfsqltype="cf_sql_decimal" 
>> value="#arguments.regular_price#" scale="2">,
>>                 featured = <cfqueryparam cfsqltype="cf_sql_char" 
>> value="#arguments.featured#">,
>>                 special = <cfqueryparam cfsqltype="cf_sql_char" 
>> value="#arguments.special#">,
>>                 special_price = <cfqueryparam cfsqltype="cf_sql_decimal" 
>> value="#arguments.special_price#" scale="2">,
>>                 photo_150 = <cfqueryparam cfsqltype="cf_sql_varchar" 
>> value="#arguments.photo_150#">,
>>                 photo_400 = <cfqueryparam cfsqltype="cf_sql_varchar" 
>> value="#arguments.photo_400#">
>>         where    product_id = "#arguments.product_id#"
>>     </cfquery>  
>> </cffunction>
>>
>>
>> -Jake Churchill
>>
>> Rick Faircloth wrote:
>>   
>>     
>>> Hi, all... still trying to get a handle on using CFC's.
>>>
>>> Here's an update method I wrote and I'd like to know
>>> what can be changed to make it better.  Such as,
>>> why not use the form scope in the query?  And, why
>>> not just use the application scope for the dsn, instead
>>> of converting it to the variables scope?
>>>
>>> If components have access to the url, form, session, and
>>> application scopes, etc., why not use them in the component?
>>> What's the benefit of converting them?
>>>
>>> <cffunction    name               =    "update_product"
>>>                      displayname    =    "update_product"
>>>                      hint                  =    "Update specified product"
>>>                      output              =    "false">
>>>                    
>>>         <cfargument name="product_id" type="string" required="yes">
>>>         <cfset variables.product_id = "#arguments.product_id#">
>>>        
>>>         <cfquery name = "qUpdateProduct" datasource="#application.dsn#">
>>>        
>>>                 update        products
>>>                
>>>                 set              name                 =    <cfqueryparam 
>>> cfsqltype = "cf_sql_varchar"        value = "#form.name#">,
>>>                                    description        =    <cfqueryparam 
>>> cfsqltype = "cf_sql_varchar"        value = "#form.description#">,
>>>                                    regular_price    =    <cfqueryparam 
>>> cfsqltype = "cf_sql_decimal"        value = "#form.regular_price#" scale 
>>> = "2">,
>>>                                    featured            =    
>>> <cfqueryparam cfsqltype = "cf_sql_char"             value = 
>>> "#form.featured#">,
>>>                                    special              =    
>>> <cfqueryparam cfsqltype = "cf_sql_char"             value = 
>>> "#form.special#">,
>>>                                    special_price    =    <cfqueryparam 
>>> cfsqltype = "cf_sql_decimal"        value = "#form.special_price#" scale 
>>> = "2">,
>>>                                    photo_150        =    <cfqueryparam 
>>> cfsqltype = "cf_sql_varchar"        value = "#form.photo_150#">,
>>>                                    photo_400        =    <cfqueryparam 
>>> cfsqltype = "cf_sql_varchar"        value = "#form.photo_400#">
>>>                            
>>>                 where         product_id        =     
>>> "#variables.product_id#"
>>>                
>>>         </cfquery>
>>>
>>>        
>>>     </cffunction>
>>>
>>>
>>>     
>>>       
>>     
>
> 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
Adobe® ColdFusion® 8 software 8 is the most important and dramatic release to 
date
Get the Free Trial
http://ad.doubleclick.net/clk;207172674;29440083;f

Archive: 
http://www.houseoffusion.com/groups/cf-talk/message.cfm/messageid:314234
Subscription: http://www.houseoffusion.com/groups/cf-talk/subscribe.cfm
Unsubscribe: 
http://www.houseoffusion.com/cf_lists/unsubscribe.cfm?user=11502.10531.4

Reply via email to