2011-12-13 72 views
6

Tôi có trang Visualforce bằng bộ điều khiển tùy chỉnh được sử dụng để chỉnh sửa nhiều bản ghi trong một cơ hội.Nút tùy chỉnh hoặc Liên kết đến trang Visualforce với bộ điều khiển tùy chỉnh

Tôi muốn tạo nút hoặc liên kết tùy chỉnh từ trang Cơ hội đến trang Visualforce này.

Hiện nay vào liên kết trông giống như:

/apex/ExamplePage?oppId={!Opportunity.Id} 

này hoạt động tốt trong vùng bảo vệ phát triển, nhưng khi nó được triển khai như một phần của gói quản lý các vi phạm liên kết như các tài liệu tham khảo trang không có tiền tố namespace .

Tôi đã tìm thấy bài đăng Managed Package Redirecting Problem trên Bảng thảo luận Force.com ngụ ý rằng có thể sử dụng $ Page để tham chiếu trang Visualforce trong URL. Ví dụ.

{!URLFOR($Page.MyExamplePage,'',[objectId = campaign.id])} 

Nhưng làm như vậy chỉ mang lại cho tôi những lỗi cú pháp:

Error: Field $Page.MyExamplePage does not exist. Check spelling.

Có một phần vào bài đăng đó đề nghị sử dụng một lớp Apex và Execute Javascript để làm việc xung quanh nó. Nhưng nó xuất hiện với tôi rằng điều này vừa chuyển vấn đề không gian tên vào Javascript.

Làm cách nào tôi có thể tham khảo an toàn trang Visualforce để làm việc cả bên trong và bên ngoài gói được quản lý?

+1

Tôi đã tìm thấy [Nút tùy chỉnh: Hiển thị $ Trang trong Loại nội dung URL] (https://sites.secure.force.com/success/ideaView?id=08730000000aVIfAAM) trên IdeaExchange sẽ tốt để quảng cáo. –

Trả lời

7

Cách tốt nhất để thực hiện việc này từ giá trị trả về PageReference của Apex. Một cái gì đó như thế này sẽ làm việc:

public PageReference returnPage() 
{ 
    return Page.MyExamplePage; 
} 

Sau đó gọi này từ Visualforce:

<apex:commandButton value="Go To New Page" action="{!returnPage}"/> 

Apex trang cuộc gọi sẽ xử lý các dịch cho bạn.

[EDIT]

Tạo xương trần Visualforce trang như thế này:

<apex:page standardController="Opportunity" extensions="TheController" action="{!returnPage}"/> 

Thêm các phương pháp trên returnPage() để một TheController mới (hoặc bất kỳ) lớp. Nó thậm chí không cần một nhà xây dựng. Lớp học có thể trông giống như thế này:

public TheController 
{ 
    public PageReference returnPage() 
    { 
     return Page.MyExamplePage; 
    } 
} 

Sau đó, từ trang Cài đặt cơ hội, hãy đến Nút và liên kết và tạo nút Visualforce tùy chỉnh mới chọn trang mới bạn vừa tạo.

Điều đó sẽ thực hiện.

+0

Tôi cần hiển thị liên kết đến trang Visualforce từ trang Chi tiết cơ hội tiêu chuẩn. Với Nút Trang chi tiết tùy chỉnh, người dùng được tự do định vị nút này bằng Trình chỉnh sửa bố cục trang. Đề xuất của bạn có hoạt động tương tự như vậy không? Nếu sự hiểu biết của tôi là chính xác tôi cần một bộ điều khiển tùy chỉnh cho phương thức returnPage() và một số cách để đặt commandButton trên trang Chi tiết cơ hội. –

+0

Bộ điều khiển Apex tùy chỉnh sẽ được yêu cầu. Miễn là nó tham chiếu standardController = "Opportunity" và extensions = "NewCustomController" trong đỉnh: định nghĩa trang bạn sẽ ổn thôi. Tôi sẽ sửa đổi câu trả lời của tôi để phù hợp với hoàn cảnh của bạn. Nó liên quan đến một mẹo nhỏ khi khởi chạy trực tiếp từ trang Chi tiết cơ hội. – Adam

+0

Cảm ơn, điều đó hoạt động. Nó tạo ra một sự trả lại nhẹ khi người dùng đi qua trang trung gian nhưng nó giải quyết vấn đề PageReference. Tôi đã có thể thêm các tham số bổ sung vào PageReference bằng cách sử dụng một hàm tạo đã lấy đối số ApexPages.StandardController làm đối số. Mối quan tâm duy nhất của tôi bây giờ là tôi đã thêm một trang bổ sung và lớp đỉnh cho mỗi nút tùy chỉnh. –

0

Các bài trên diễn đàn nhà phát triển mà bạn đã liên kết với thể hiện javascript sau được sử dụng cho các nút:

{!REQUIRESCRIPT("/soap/ajax/15.0/connection.js")} 
{!REQUIRESCRIPT("/soap/ajax/15.0/apex.js")} 
var pageUrl = sforce.apex.execute("mynamespace.PageUrl", "getPageUrl", {objectId:"{!Campaign.Id}"}); 
window.location.href = pageUrl; 

tức là họ đang sử dụng javascript để gọi một phương thức webservice trong lớp họ đã được xác định để có được tham chiếu trang. Làm như vậy sẽ cho phép bạn lấy URL của trang trong đỉnh, nơi gói được quản lý sẽ không đóng vai trò ảnh hưởng.

Điều đó nói rằng, tham số đầu tiên là tên lớp đủ điều kiện, vì vậy bạn có thể kiểm tra giá trị trả về cho lỗi (Tôi không biết giá trị trả về lỗi, vì vậy tôi giả định là null tại đây):

// try the namespace first 
var pageUrl = sforce.apex.execute("mynamespace.myClass", "getPageUrl", {objectId:"{!Campaign.Id}"}); 
if (pageUrl == null) 
{ 
    pageUrl = sforce.apex.execute("myClass", "getPageUrl", {objectId:"{!Campaign.Id}"}); 
} 

window.location.href = pageUrl; 

Rõ ràng bạn cần kiểm tra điều gì xảy ra khi sforce.apex.execute() không thành công và bạn có thể muốn xử lý lỗi nhiều hơn.

+0

Cảm ơn, đây là những gì tôi đã suy nghĩ. Vấn đề với không gian tên gói được quản lý đã được chuyển vào Javascript và cần được xử lý ở đó thay thế. Tôi đoán tôi sẽ thử và xem nó như thế nào. –

0

Điều xảy ra với tôi rằng một tùy chọn ít hơn lý tưởng sẽ là tạo hai nút tùy chỉnh trong mỗi trường hợp. Một với không gian tên gói được quản lý và một không có.

Khi xây dựng gói, bạn có thể chọn nút tùy chỉnh chính xác.

Một vấn đề với phương pháp này là cần phải duy trì hai nút tùy chỉnh.

+0

Công thức URL nút được quản lý sẽ được mã hóa như thế nào ?. Chúng tôi thấy rằng toàn bộ máy chủ lưu trữ cho các trang được đóng gói của chúng tôi khác nhau khi được cài đặt. Chúng ta thấy một cái gì đó như 'ourpackage.cs8.visual.force.com'! – Marc

+0

@Marc, tôi đã đi với giải pháp dựa trên đỉnh vì vậy tôi không cần phải suy nghĩ về tên miền hoặc không gian tên gói được quản lý. –

0

Có vẻ như câu trả lời đơn giản là /apex/package__Page như được cung cấp here bởi @zachelrath. Tôi có thể xác nhận điều này hoạt động trong các gói được quản lý trong tổ chức sản xuất cũng như trong quá trình phát triển.

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