Регистрация  |  Вход

Custom Buttons стандартных Layouts

Заглянул сегодня под одну кастомную кнопку, и удивился тем, что там обнаружил.

Представьте ситуацию: на детайл пейдж нужно создать кнопку, которая создают и вносит запись другого объекта, затем делает редирект на дитэл страницу той записи.

Что первое приходит в голову новичка? сделать кастомную VF дитейл стрраницу с кнопкой и функционалом заложенным в кастомный или расширенный контроллер, откуда и делается редирект.

Второе что приходит в голову чуть более опытному новичку: оставь стандарную дитэйл страницу как есть, парень, но создай на ней кастомную кнопку которая ведет на VF страницу с единственным методом на он-лоад, который создает запись и делает редирект.

Но сегодня я увидел другой путь и он меня сильно удивил:
под кастомной кнопкой на стандарной дитейл странице лежит JS скрипт со сл содержанием (кратко):

{!REQUIRESCRIPT("/soap/ajax/22.0/connection.js")}
var connection = sforce.connection;
var bp = new sforce.SObject("MyCustomObject__c");
....заполняются поля, вносится запись, получаем ее ID...и все это в браузере...
window.location.href = "/"+rs[0].id;

получается что JS скрипт в данном случае выполняет функцию расширения страндарного контроллера!!! при этом мы все делаем в пределах стандарной дитейл или лист страницы и при стандарном контроллере! Моя удивляться...
Где можно почитать об этом?

Также более простые вопросы, подскажите кракто:
- в чем механизм работы кастомной кнопки, если ее Content Source - URL (не разобрал, как это создается и работает);
- и зачем нужны New Action - это находится в том же разделе описания кастомного объекта, где и кастомные кнопки.

Спасибо

Заглянул сегодня под одну кастомную кнопку, и удивился тем, что там обнаружил.

Представьте ситуацию: на детайл пейдж нужно создать кнопку, которая создают и вносит запись другого объекта, затем делает редирект на дитэл страницу той записи.

Что первое приходит в голову новичка? сделать кастомную VF дитейл стрраницу с кнопкой и функционалом заложенным в кастомный или расширенный контроллер, откуда и делается редирект.

Второе что приходит в голову чуть более опытному новичку: оставь стандарную дитэйл страницу как есть, парень, но создай на ней кастомную кнопку которая ведет на VF страницу с единственным методом на он-лоад, который создает запись и делает редирект.

Но сегодня я увидел другой путь и он меня сильно удивил:
под кастомной кнопкой на стандарной дитейл странице лежит JS скрипт со сл содержанием (кратко):

{!REQUIRESCRIPT("/soap/ajax/22.0/connection.js")}
var connection = sforce.connection;
var bp = new sforce.SObject("MyCustomObject__c"); 
....заполняются поля, вносится запись, получаем ее ID...и все это в браузере...
window.location.href = "/"+rs[0].id; 

получается что JS скрипт в данном случае выполняет функцию расширения страндарного контроллера!!! при этом мы все делаем в пределах стандарной дитейл или лист страницы и при стандарном контроллере! Моя удивляться...
Где можно почитать об этом?

Также более простые вопросы, подскажите кракто:
- в чем механизм работы кастомной кнопки, если ее Content Source - URL (не разобрал, как это создается и работает);
- и зачем нужны New Action - это находится в том же разделе описания кастомного объекта, где и кастомные кнопки.

Спасибо

Да, custom buttons это замечательная и очень нужная штука для стандартных салесфорсовских страниц.
Если в приложении делается упор на standard layouts, а не на Visualforce страницы, то без custom buttons не обойтись.

Кастомные кнопки позволяют открыть Visualforce страницу, любой URL, а также выполнить Javascript. В теле кнопки можно реализовать очень сложную логику с помощью javascript и FORMULA. Иногда получается жуткая, не читаемая вермишель из кода. Те кто сталкивался поймут о чем я. Но там действует ограничение по количеству символов. Так что вставить в тело кнопки БОЛЬШОЙ код не получится.

Почитать про custom buttons можешь здесь - Understanding Custom Buttons and Links
или посмотреть здесь

На счет action каюсь, так руки и не дошли изучить что это такое. Так что буду признателен, если ты прочитаешь и в двух словах расскажешь о своих впечатлениях.

Да,[b] custom buttons[/b] это замечательная и очень нужная штука для стандартных салесфорсовских страниц.
Если в приложении делается упор на [b]standard layouts[/b], а не на Visualforce страницы, то без custom buttons не обойтись.

Кастомные кнопки позволяют открыть Visualforce страницу, любой URL, а также выполнить Javascript. В теле кнопки можно реализовать очень сложную логику с помощью [b]javascript и FORMULA[/b]. Иногда получается жуткая, не читаемая вермишель из кода. Те кто сталкивался поймут о чем я. Но там действует [b]ограничение по количеству символов[/b]. Так что вставить в тело кнопки БОЛЬШОЙ код не получится.

Почитать про custom buttons можешь здесь - [url=http://help.salesforce.com/apex/HTViewHelpDoc?id=customize_enterprise.htm&language=en_US]Understanding Custom Buttons and Links[/url]
или посмотреть [url=http://www.youtube.com/watch?v=_WHpTOF3bFo]здесь[/url]

На счет [b]action [/b]каюсь, так руки и не дошли изучить что это такое. Так что буду признателен, если ты прочитаешь и в двух словах расскажешь о своих впечатлениях.

А то что у тебя в примере

{!REQUIRESCRIPT("/soap/ajax/22.0/connection.js")}

Это AJAX Toolkit

Тоже мощный инструмент для работы с Salesforce напрямую из javascript.

В общем поднял ты отдельную огромную тему Удачи в изучении.

А то что у тебя в примере

{!REQUIRESCRIPT("/soap/ajax/22.0/connection.js")}

Это [url=http://www.salesforce.com/us/developer/docs/ajax/]AJAX Toolkit[/url]

Тоже мощный инструмент для работы с Salesforce напрямую из javascript.

В общем поднял ты отдельную огромную тему :) Удачи в изучении.

Невероятно интересно. JS это как раз то что я люблю. Буду изучать.

И сразу забавные вопросы, ответы на которые конечно найду позже в том Руководстве, но вам просто для размышления:
(1) а лимиты по DML операциям и прочему при обращении к API через JS те же?
(2) JS работает с API, а вот тестировать перед размещением в прод то и не нужно?
надеюсь скоро сам найди ответы на это.

Невероятно интересно. JS это как раз то что я люблю. Буду изучать.

И сразу забавные вопросы, ответы на которые конечно найду позже в том Руководстве, но вам просто для размышления:
(1) а лимиты по DML операциям и прочему при обращении к API через JS те же?
(2) JS работает с API, а вот тестировать перед размещением в прод то и не нужно? :)

надеюсь скоро сам найди ответы на это.

Ajax toolkit - это javascript обертка для работы с Salesforce API.
Т.е. обычного программирования оно не заменит.

Большой недостаток Ajax toolkit в том что он жрет API Calls а их не так много. Например на Developer Edition их всего 5000 и это на сутки. Поверь они съедаются очень хорошо.

Поэтому использовать Ajax toolkit надо в крайних (или экзотических) случаях, когда нельзя использовать Visualforce page.

Ajax toolkit - это javascript обертка для работы с Salesforce API.
Т.е. обычного программирования оно не заменит.

Большой недостаток Ajax toolkit в том что он жрет API Calls а их не так много. Например на Developer Edition их всего 5000 и это на сутки. Поверь они съедаются очень хорошо.

Поэтому использовать Ajax toolkit надо в крайних (или экзотических) случаях, когда нельзя использовать Visualforce page.

В "том самом" начальном workbookе есть пример создания класса с вебметодом, который вызывается через AJAX API с кнопки. Мне понравилось.
Воодушевленный этим я решил одну из рабочих задач именно через AJAX API, не взирая на то, что он ест вызовы. Все работает.
А потом я подумал, подумал и согласился с Дмитрием, что все нужно делать по человечески, т.е. через VF страницы и их контроллеры.

Задача была: на детальной странице записи создать кнопку при нажатии на которую всплывает запрос "Сколько дочерних записей создать?" (от 1 до 10). После ввода, создаются записи, перегружается текущая страница (чтобы видеть новые дочерние записи), отрывается новое окно, где в ПДФ выводятся (на пример) ID созданных записей. Код ниже.

Но как только я это сделал, на меня навалилась параноя:
- а что если в браузере заблокировано открытие alert/prompt/confirm? (впрочем SFDC их по-любому использует в работе - попробуйте удалить какую-нибудь запись);
- а что если JS отключен? (впрочем не уверен что в таком случае интерфейс SFDC вообще будет работать);
- а что если будет сделан вредителський ввод, который не остановят мои проверки? (впрочем, вместо промпта можно поднимать дивчик с селектом и фиксированными значениями, которые и читать)

Вобщем, наверное, будет более правильно сделать кнопку не с JS AJAX API логикой, а кнопку "КастомнаяКнопка" окрывающее новое окно с VF страницей с стандартно-расширенным контроллером, где есть только дроп-даун лист с числом требуемых записей и кнопкой "создать записи", после нажатия на которую создаются записи и данное окно уходит на страницу с ПДФ распечаткой. Вот как только при нажатии на "создать записи" перегрузить родительское окно с (перегружать его при нажатии на кнопку "КастомнаяКнопка" нет смысла, так как в тот момет новых дочерних записей еще нет).

Вот JS код:

/*

{!REQUIRESCRIPT("/soap/ajax/29.0/connection.js")}

function isNumeric(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}

var URL="apex/СтраницаКотораяВыводитПДФ?";

var quantity = prompt('How many records do you want to create? (Choose from 1 to 10)', '');

if (!isNumeric(quantity)) { // проверяем на число

quantity=null;

alert("Please enter a number from 1 to 10");

} else {

quantity=Math.floor(+quantity); //округляем вниз


if (quantity<=0||quantity>10) { //проверям диапазон

quantity=null;

alert("Please enter a number from 1 to 10");

}
}

if(quantity!=null){

var connection = sforce.connection;

// циклом создаем требуемое кол-во записей, НЕ уверен что можно создать несколько записей за один вызов, хотя это было бы гораздо более правильное решение
// также можно было бы написать апекс класс с вебметодом, который на вход получал бы кол-во записей и возвращал бы их ID, а здесь просто бы вызвать метод.

for (var i=0; i<quantity; i++) {


var Item = new sforce.SObject("кастомный_объект__c");
Item.ПолесIDмастерЗаписи = "{!текущая запись.Id}";

var rs = connection.create([Item]);
if (rs[0].success=='false')
alert("Message"+rs[0].errors.message);
else
{

URL+=i+"="+rs[0].id+"&"; //собираем URL со всеми необходимыми параметрами
}

}

window.open().location.href = "/"+URL; //открываем в новом окне страницу с распечаткой
window.location.reload(); // перегружаем текущее окно, чтобы видеть появившиеся дочерние записи

}

*/

В "том самом" начальном workbookе есть пример создания класса с вебметодом, который вызывается через AJAX API с кнопки. Мне понравилось.
Воодушевленный этим я решил одну из рабочих задач именно через AJAX API, не взирая на то, что он ест вызовы. Все работает.
А потом я подумал, подумал и согласился с Дмитрием, что все нужно делать по человечески, т.е. через VF страницы и их контроллеры.

Задача была: на детальной странице записи создать кнопку при нажатии на которую всплывает запрос "Сколько дочерних записей создать?" (от 1 до 10). После ввода, создаются записи, перегружается текущая страница (чтобы видеть новые дочерние записи), отрывается новое окно, где в ПДФ выводятся (на пример) ID созданных записей. Код ниже.

Но как только я это сделал, на меня навалилась параноя: 
- а что если в браузере заблокировано открытие alert/prompt/confirm? (впрочем SFDC их по-любому использует в работе - попробуйте удалить какую-нибудь запись);
- а что если JS отключен? (впрочем не уверен что в таком случае интерфейс SFDC вообще будет работать);
- а что если будет сделан вредителський ввод, который не остановят мои проверки? (впрочем, вместо промпта можно поднимать дивчик с селектом и фиксированными значениями, которые и читать)

Вобщем, наверное, будет более правильно сделать кнопку не с JS AJAX API логикой, а кнопку "КастомнаяКнопка" окрывающее новое окно с VF страницей с стандартно-расширенным контроллером, где есть только дроп-даун лист с числом требуемых записей и кнопкой "создать записи", после нажатия на которую создаются записи и данное окно уходит на страницу с ПДФ распечаткой. Вот как только при нажатии на "создать записи" перегрузить родительское окно с (перегружать его при нажатии на кнопку "КастомнаяКнопка" нет смысла, так как в тот момет новых дочерних записей еще нет).

Вот JS код:

/*

{!REQUIRESCRIPT("/soap/ajax/29.0/connection.js")}
      
function isNumeric(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
  }
      
var URL="apex/СтраницаКотораяВыводитПДФ?";
      
var quantity = prompt('How many records do you want to create? (Choose from 1 to 10)', '');
              
      if (!isNumeric(quantity)) { // проверяем на число
  
quantity=null;
  
alert("Please enter a number from 1 to 10"); 
  
} else {

  quantity=Math.floor(+quantity); //округляем вниз
 
    
  if (quantity<=0||quantity>10) { //проверям диапазон
  
quantity=null;
  
alert("Please enter a number from 1 to 10"); 
  
} 
}
      
      if(quantity!=null){ 
        
        var connection = sforce.connection;
 
// циклом создаем требуемое кол-во записей, НЕ уверен что можно создать несколько записей за один вызов, хотя это было бы гораздо более правильное решение 
// также можно было бы написать апекс класс с вебметодом, который на вход получал бы кол-во записей и возвращал бы их ID, а здесь просто бы вызвать метод.     
        
        for (var i=0; i<quantity; i++) { 


var Item = new sforce.SObject("кастомный_объект__c");
Item.ПолесIDмастерЗаписи = "{!текущая запись.Id}";

var rs = connection.create([Item]);
if (rs[0].success=='false')
alert("Message"+rs[0].errors.message);
else
{
 
  URL+=i+"="+rs[0].id+"&"; //собираем URL со всеми необходимыми параметрами
}
   
}
    
        window.open().location.href = "/"+URL;  //открываем в новом окне страницу с распечаткой
        window.location.reload();   // перегружаем текущее окно, чтобы видеть появившиеся дочерние записи
 
      }

*/