Coldfusion ve Recursive Fonskiyonlar
Tarih: July 1st, 2010 | Yazan: Bora Unal | 1 Yorum »Uygulama geliştiren herkes bir yerde döngülerin yeterli olmadığını bilir. Bu durumda kendini kendi içinde tekrarlayacak fonksiyonlara ihtiyaç duyarsınız. Bu tür fonksiyonlara recursive fonksiyonlar adı verilir.
Örneğin sitenizin içinde yer almasını istediğiniz aşağıdaki yapıyı (breadcrumb) veritabanı içindeki verilerden alıp oluşturmanız gerekiyor.
Anasayfa >Amerika Kıtası > Kuşlar > Yırtıcı Kuşlar > Kel Kartal
Ve verileriniz de veritabanında aşağkine benzer bir tabloda tutuluyor:
| ID | CONTENT | PARENTID |
| 1 | Anasayfa | 0 |
| 2 | Amerika Kıtası | 1 |
| 3 | Kuşlar | 2 |
| 4 | Sürüngenler | 2 |
| 5 | Yırtıcı Kuşlar | 3 |
| 6 | Evcil Kuşlar | 3 |
| 7 | Asya Kıtası | 1 |
| 8 | Kel Kartal | 5 |
| 9 | Şahin | 5 |
Bu durumda en altta bulunan satırdan anasayfaya kadar olan veriyi analiz edip birbiri ile ilgili olanları eklememiz gerekecek. Buradan örnek dosyayı indirebilirsiniz.
Bu işlem için iki fonkisyona ihtiyaç duyacağız:
Bunlardan birincisi bizim parametrelerimizi (bulunduğumuz içeriğin ID’si ve anasayfa’nın ID’si) göndereceğimiz fonksiyon. Bu fonksiyon asıl veriyi oluşturacak olan ikinci fonksiyonu çağaracak ve ona içini dolduracağı boş bir değişken gönderecek.
Fonksiyon 1: getParentStructure(ContentID,HomePageID)
<cffunction name="getParentStructure"> <cfargument name="contentID"> <cfargument name="homepageID"> <cfset ParentData=""> <cfset ParentData=ListChangeDelims(ParentData,"|")> <cfset ParentDataOutput = getParent(ParentData,ContentID,HomePageID)> <cfreturn ParentDataOutput> </cffunction>
Fonksiyon 2: getParent(ParentData,ContentID,HomePageID)
İkinci fonksiyon ise birinciden gelen veriye göre kendini kendi içinde işlem tamamlanana kadar tekrarlayacak fonksiyon. Burada ikinci fonksiyonun recursive (kendi kendini çağıran) özelliğini 13. satırda görebilirsiniz. Şartlar sağlanana kadar bu fonksiyon kendini tekrar tekrar çağıracak. Örneği incelemek için çalışan dosyayı buradan indirebilirsiniz.
<cffunction name="getParent"> <cfargument name="ParentData"> <cfargument name="ContentID"> <cfargument name="HomePageID"> <cfquery name="qSiteTreeII" dbtype="query"> SELECT * FROM qSiteTree WHERE CONTENTID=#arguments.contentid# ORDER BY PARENTID, ORDERME ASC </cfquery> <cfif arguments.ContentID NEQ arguments.HomePageID> <cfset nextParent=qSiteTreeII.PARENTID> <cfset breadCrumbItem="<li><a href='' >"&qSiteTreeII.MENUTITLE&"</a></li>"> <cfset breadCrumb=ListPrepend(ParentData,breadCrumbItem,"|")> <cfreturn getParent (breadCrumb,nextParent,arguments.HomePageID)> <cfelse> <cfset breadCrumbItem=application.homePageItem> <cfset breadCrumb=ListPrepend(ParentData,breadCrumbItem,"|")> <cfset breadCrumb=Replace(breadCrumb,"|","","ALL")> <cfreturn breadCrumb> </cfif> </cffunction>
Merhaba
makale için çok teşekkürler elinize sağlık.