Пользовательская кнопка или ссылка на страницу Visualforce с пользовательским контроллером - PullRequest
6 голосов
/ 14 декабря 2011

У меня есть страница Visualforce, использующая настраиваемый контроллер, который используется для редактирования нескольких записей при наличии возможности.

Я хотел бы создать настраиваемую кнопку или ссылку из Возможности на эту страницу Visualforce.

В настоящее время ссылка выглядит следующим образом:

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

Это прекрасно работает в изолированной программной среде разработки, но когда она развернута как часть управляемого пакета, ссылка разрывается, так как ссылка на страницу не имеет пространства именпрефикс.

Я обнаружил сообщение Проблема перенаправления управляемых пакетов на досках обсуждений Force.com, которое подразумевало, что должна быть возможность использовать $ Page для ссылки на страницу Visualforce в URL.Например,

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

Но при этом появляется только синтаксическая ошибка:

Ошибка: поле $ Page.MyExamplePage не существует.Проверьте орфографию.

В посте есть еще одна часть, в которой предлагается использовать класс Apex и выполнить Javascript для его обхода.Но мне кажется, что это только что переместило проблему пространства имен в Javascript.

Как можно безопасно ссылаться на страницу Visualforce для работы как внутри, так и вне управляемого пакета?

Ответы [ 4 ]

7 голосов
/ 14 декабря 2011

Лучше всего сделать это из возвращаемого значения Apex PageReference. Примерно так будет работать:

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

Затем вызовите это из Visualforce:

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

Вызов Apex Page обработает перевод для вас.

[EDIT]

Создайте голую страницу Visualforce, как это:

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

Добавьте указанный выше метод returnPage () в новый класс TheController (или любой другой). Ему даже не нужен конструктор. Класс может выглядеть так:

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

Затем на странице настроек Opportunity перейдите в «Кнопки и ссылки» и создайте новую пользовательскую кнопку Visualforce, выбрав новую страницу, которую вы только что создали.

Это должно сделать это.

0 голосов
/ 20 марта 2013

Кажется, ответ просто /apex/package__Page, как указано здесь @zachelrath.Я могу подтвердить, что это работает в управляемых пакетах как в производственных организациях, так и в разработке.

0 голосов
/ 15 декабря 2011

Мне пришло в голову, что один вариант, который не является идеальным, заключается в создании двух пользовательских кнопок в каждом случае. Один с пространством имен управляемого пакета и один без.

При сборке пакета можно выбрать правильную пользовательскую кнопку.

Одной из проблем этого подхода является необходимость поддержки двух пользовательских кнопок.

0 голосов
/ 14 декабря 2011

В сообщении на форумах разработчиков, на которое вы ссылаетесь, показан следующий javascript, используемый для кнопки:

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

т.е. они используют javascript для вызова метода веб-сервиса в классе, который они определили, чтобы получить ссылку на страницу. Это позволит вам получить URL страницы в вершине, где управляемый пакет не будет играть важную роль.

Тем не менее, первый параметр - это полностью определенное имя класса, так что вы, вероятно, можете проверить возвращаемое значение на наличие ошибки (я не знаю возвращаемого значения ошибки, поэтому я предполагаю, что оно null здесь) :

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

Очевидно, что вам нужно проверить, что происходит при сбое sforce.apex.execute(), и вам, скорее всего, понадобится дополнительная обработка ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...