Custom Button or Link to a Visualforce page with a custom controller

微笑、不失礼 提交于 2019-12-04 06:15:53

Best to do this from an Apex PageReference return value. Something like this will work:

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

Then call this from Visualforce:

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

The Apex Page call will handle the translation for you.

[EDIT]

Create a bare bones Visualforce page like this:

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

Add the above returnPage() method to a new TheController (or whatever) class. It doesn't even need a constructor. The class can look like this:

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

Then from the Opportunity settings page go to Buttons and Links and create a new custom Visualforce button selecting the new page you just created.

That should do it.

It occurred to me that one less than ideal option would be to create two custom buttons in each case. One with the managed package namespace and one without.

When building the package the correct custom button could be selected.

One issue with this approach is the need to maintain two custom buttons.

Marc

It seems the answer is simply /apex/package__Page as provided here by @zachelrath. I can confirm this works in managed packages in production orgs as well as in development.

Matt Lacey

The post on the developer boards that you've linked to shows the following javascript being used for the button:

{!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;

i.e. they're using javascript to call a webservice method in the class they've defined in order to get the page reference. Doing this would allow you to get the URL of the page in apex, where the managed package won't play an impacting part.

That said, the first parameter is the fully-qualified class name, so you could probably check the return value for an error (I don't know the error return value, so I'm assuming it's null here):

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

Obviously you need to check what happens when sforce.apex.execute() fails, and you'll likely want some more error handling.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!