2010-03-26 32 views
16

Nếu tôi có một cấu trúc thư mục đó trông như thế này:Trong Coldfusion, làm thế nào để tôi khởi tạo một thành phần nằm trên thư mục đường dẫn hiện tại?

/ 
/bin/myComponent.cfc 
/reports/index.cfm 

Làm thế nào để khởi myComponent.cfc từ index.cfm?

myService = createObject("component", "bin.myComponent"); 

Sử dụng cú pháp dấu chấm, tôi biết cách chuyển đến thư mục sâu hơn, nhưng làm cách nào để tôi đi lên thư mục và xuống thư mục khác? Sử dụng cú pháp gạch chéo nó sẽ là một cái gì đó như thế này:

../bin/myComponent.cfc 

Nhưng createObject() không hoạt động theo cách đó. Tôi muốn giữ một đường dẫn tương đối để tôi có thể di chuyển thư mục này đến một máy chủ khác mà không phá vỡ các đường dẫn.

Ý tưởng? Cảm ơn!

EDIT:

Ví dụ của tôi không hiển thị cấu trúc thư mục đủ sâu cho câu trả lời quảng cáo mà bạn đã cung cấp. Dưới đây là những gì tôi nên làm:

/[my project folder]/ 
/[my project folder]/bin/myComponent.cfc 
/[my project folder]/reports/index.cfm 

câu hỏi cơ bản của tôi là nếu nó đã có thể đi UP một thư mục khi sử dụng CreateObject ("thành phần", "chấm path") từ index.cfm để myComponent.cfc NẾU tên của [thư mục dự án của tôi] không tĩnh trên tất cả các lượt cài đặt của dự án.

Nếu câu trả lời là KHÔNG, thì tôi sẽ chỉ cần tìm ra cách thực hành tốt nhất là gì, cho dù đó là bản đồ hay cài đặt ứng dụng.

Trả lời

15

Chúng tôi xử lý việc này bằng cách sử dụng ánh xạ trong quản trị viên CF. Thông thường tất cả các thành phần đi trong một thư mục nằm trên thư mục gốc của www. Trong trường hợp của bạn, bạn có thể thêm một ánh xạ đến/mà sẽ cho phép bạn làm:

myService = createObject("component", "mymapping.bin.myComponent"); 
+0

Trong khi tôi thích phương pháp trên, điều này chỉ đơn giản hơn vì tôi có quyền truy cập quản trị viên. –

17

nếu bạn có Application.cfc trong thư mục gốc của cấu trúc thư mục của bạn, bạn có thể sử dụng một cái gì đó như thế này:

<cfset this.mappings["/local"] = getDirectoryFromPath(getCurrentTemplatePath()) /> 

và sau đó truy cập nó thông qua "local.bin.myComponent"

+0

Điều này có thể sẽ hoạt động. Tôi giả sử tôi sử dụng mã này trong application.cfc? Từ thời điểm đó để tôi tham khảo nó với # application.mappings ["/ local"]? –

+0

Nó hoạt động theo cách tương tự như khi bạn thiết lập ánh xạ trong Quản trị viên CF. Bạn có thể tham khảo các tệp của bạn dưới dạng /local/bin/somefile.cfm hoặc thành phần của bạn dưới dạng local.bin.myComponent (như được hiển thị bởi intnick ở trên) –

3

chỉ cần sử dụng đường dẫn đầy đủ từ gốc

<cfset obj = createObject("component", "bin.cart.item")>

trong đó item.cfc nằm trong [root root]/lib/cart/- điều này sẽ hoạt động ở mọi nơi trong mã của bạn.

+0

Vấn đề là tôi sẽ không biết tên thư mục gốc của trang web, có thể cài đặt trang web vào một thư mục có tên khác. Từ thư mục đó mọi thứ đều ở một nơi đã biết tương đối với nhau. Tôi cần có khả năng xác định tên thư mục đó theo chương trình. –

+0

bạn không cần phải biết tên thư mục gốc của trang web, miễn là/bin nằm ngay dưới thư mục gốc. ví dụ: nếu trang web của bạn ở đây c: /inetpub/example.com/webroot/ thì bạn có thể khởi tạo cfc nằm trong c: /inetpub/example.com/webroot/bin/ bằng cách sử dụng createObject ở trên. và bây giờ tôi nhận ra rằng tất cả cfc của bạn không nằm trong thư mục webroot, trong trường hợp đó giải pháp của tôi sẽ không hoạt động. Có đúng không? – Yisroel

+0

Tôi tin rằng tôi đã gây nhầm lẫn bằng cách sử dụng tên thư mục 'bin' trong ví dụ của tôi. Trong thực tế thực tế, nó chỉ là một thư mục cho tất cả các cfc liên quan đến dự án này. Nó không nằm ở webroot. Các dự án trên máy chủ này được tách ra khỏi các dự án khác. –

4

Nó là một cuối tuần khó khăn, vì vậy khá nhiều khả năng mã sau đây có thể được tăng cường bằng cách nào đó, nhưng nhìn chung phương pháp này nên làm việc:

<cfscript> 

    // this script is here http://XXXXXXX/test/paths/relative/reports/index.cfm 
    // component is here http://XXXXXXX/test/paths/relative/bin/myComponent.cfc 

    local = {}; 

    // initialize with dynamic mapping 
    local.myComponentDynamic = createObject("component", "/bin/myComponent"); 

    // grab the current directory name 
    local.parentPathExpanded = ExpandPath("../"); 
    local.scriptPathExpanded = ExpandPath(cgi.SCRIPT_NAME); 
    local.thisDirectory = GetDirectoryFromPath(Replace(local.scriptPathExpanded, local.parentPathExpanded, "")); 

    // build base path 
    local.scriptPathDirectory = GetDirectoryFromPath(cgi.SCRIPT_NAME); 
    local.basePath = Replace(local.scriptPathDirectory, local.thisDirectory, ""); 

    // this is relative path we already know 
    local.relativePath = "bin/myComponent"; 

    // initialize with slash-syntax (path starting with /) 
    local.myComponentSlash = createObject("component", local.basePath & local.relativePath); 

    // convert path to the dot-syntax 
    local.dottedPath = Replace(local.basePath & local.relativePath, "/", ".", "ALL"); 
    local.dottedPath = Right(local.dottedPath, Len(local.dottedPath)-1); 

    // initialize with dot-syntax path 
    local.myComponentDot = createObject("component", local.dottedPath); 

</cfscript> 
<cfdump var="#local#"> 

Tôi đã chia quá trình này thành các biến riêng biệt và đổ bình thường chỉ để dễ đọc và hiểu ví dụ này.

Nhưng bất kỳ cách nào, nếu bạn có thể sử dụng ánh xạ động trong Application.cfc - hãy sử dụng nó.

EDIT: Tôi đã thêm ví dụ như vậy, giả sử bạn đã sau Application.cfc trong thư mục mẹ (ví dụ: "../Application.cfc" nếu nhìn từ index.cfm):

<cfcomponent output="false"> 

    <cfset this.mappings["/bin"] = getDirectoryFromPath(getCurrentTemplatePath()) & "bin/" /> 

</cfcomponent> 

Ví dụ "chuyển đổi đường dẫn" của tôi chỉ là một thủ thuật thú vị và chơi với mã không thực sự dễ dàng tiếp cận cho các ứng dụng tốt.

+0

Tôi thực sự thích ví dụ này, cho ra khỏi hộp suy nghĩ vào cuối ngày thứ sáu. :-) Tuy nhiên, tôi đồng ý với bạn: Tôi cần phải đặt ánh xạ trong tệp ứng dụng của mình. Tôi chỉ ngạc nhiên rằng nó rất dễ dàng để tạo ra các đối tượng sâu hơn trong đường dẫn, nhưng không cao hơn. Cảm ơn! –

0

Tôi gặp vấn đề tương tự và đây là giải pháp của tôi. Nó khá thẳng về phía trước nhưng phải mất một vài giờ để nó đánh tôi. Hy vọng rằng điều này sẽ giúp bạn tiết kiệm thời gian.

tôi bắt đầu với

<bean id="ColdBooksConnectionService" class="myservice.model.service.ConnectionService" /> 

và luôn luôn có những lỗi mà nó không có sẵn, vì vậy tôi đã viết ra đường dẫn đầy đủ

<bean id="ColdBooksConnectionService" class="/CFIDE.administrator.myservice.model.service.ConnectionService" /> 

và vấn đề được giải quyết.

Hy vọng điều này sẽ hữu ích.

Các vấn đề liên quan