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

The AJAX Toolkit - не все так просто

Не так давно сталкнулся с интерестной проблемой в Salesforce при использовании The AJAX Toolkit.

Пробема состояла в следующем:
Когда весь код был протестирован и собран пакет (которому был дан ПРЕФИКС!), то после этого, все SOQL запросы. а так же DML операции выполняемые при помощи connection.js (The AJAX Toolkit) перестали работать, глянув dev console браузера, вот что увидел - клик.

Оказалось, что данному API плевать, в пакете он или нет, он обращается именно к на данный мамент существующему API Name пакета (который уже содержит префикс).

Решение:
перебил соклы и DML на новый API name (с прификсом), пересобрал пакет - профит!

Не так давно сталкнулся с интерестной проблемой в Salesforce при использовании [url=https://developer.salesforce.com/docs/atlas.en-us.ajax.meta/ajax/sforce_api_ajax_introducing.htm]The AJAX Toolkit[/url].

Пробема состояла в следующем:
Когда весь код был протестирован и собран пакет (которому был дан ПРЕФИКС!), то после этого, все SOQL запросы. а так же DML операции выполняемые при помощи connection.js (The AJAX Toolkit) перестали работать, глянув dev console браузера, вот что увидел - [url=http://prntscr.com/9pwpld]клик[/url].

Оказалось, что данному API плевать, в пакете он или нет, он обращается именно к на данный мамент существующему API Name пакета (который уже содержит префикс).

Решение:
перебил соклы и DML на новый API name (с прификсом), пересобрал пакет - профит!


не знаю, о том же ли я подумал, но с дмл запросами, реализованными через The AJAX Toolkit, например в кастомных кнопках, часто бывает такая проблема, так как АПИ имена вписаны прям в JS.

я собрал unmanaged package, задеплоил в дев Орг, в котором активированы использование "префикса" (для АПМ имен объектов), и все JS кнопки "легли", так как после деплоя у объектов, входящих в package уже другие АПИ имена... пришлось править АПИ в JS...

не знаю, о том же ли я подумал, но с дмл запросами, реализованными через The AJAX Toolkit, например в кастомных кнопках, часто бывает такая проблема, так как АПИ имена вписаны прям в JS.

я собрал unmanaged package, задеплоил в дев Орг, в котором активированы использование "префикса" (для АПМ имен объектов), и все JS кнопки "легли", так как после деплоя у объектов, входящих в package уже другие АПИ имена... пришлось править АПИ в JS...

Проще использовать {!$ObjectType.My_Custom_Or_Standard_Object_API_Name__c.Fields.Some_Field_API_Name__c.Name}
Кстати, интересно, а можно ли в контексте VF страницы, которая внутри managed package, использовать local names в такой записи как выше, и если можно - что произойдёт если в target организации будет объект с таким же именем?

UPD: local names использовать можно, по крайней мере внутри package developer org

Проще использовать {!$ObjectType.My_Custom_Or_Standard_Object_API_Name__c.Fields.Some_Field_API_Name__c.Name}
Кстати, интересно, а можно ли в контексте VF страницы, которая внутри managed package, использовать local names в такой записи как выше, и если можно - что произойдёт если в target организации будет объект с таким же именем?

UPD: local names использовать можно, по крайней мере внутри package developer org

ilya leshchuk
Проще использовать {!$ObjectType.My_Custom_Or_Standard_Object_API_Name__c.Fields.Some_Field_API_Name__c.Name}
Кстати, интересно, а можно ли в контексте VF страницы, которая внутри managed package, использовать local names в такой записи как выше, и если можно - что произойдёт если в target организации будет объект с таким же именем?

UPD: local names использовать можно, по крайней мере внутри package developer org

Если не ошибаюсь, если есть 2 объекта с одинаковыми именами, то будет выбран тот что без префикса, если в коде не указан префикс.

[quote="ilya leshchuk"]Проще использовать {!$ObjectType.My_Custom_Or_Standard_Object_API_Name__c.Fields.Some_Field_API_Name__c.Name}
Кстати, интересно, а можно ли в контексте VF страницы, которая внутри managed package, использовать local names в такой записи как выше, и если можно - что произойдёт если в target организации будет объект с таким же именем?

UPD: local names использовать можно, по крайней мере внутри package developer org[/quote]

Если не ошибаюсь, если есть 2 объекта с одинаковыми именами, то будет выбран тот что без префикса, если в коде не указан префикс.

ilya leshchuk
Проще использовать {!$ObjectType.My_Custom_Or_Standard_Object_API_Name__c.Fields.Some_Field_API_Name__c.Name}

в таком случае My_Custom_Object_API_Name__c вписан в синтаксис, также как если его просто вписать стрингом в строку SOQL операции.

Но, не хочешь ли ты, Илья, нам сказать что в случае использования

ilya leshchuk
!$ObjectType.My_Custom_Or_Standard_Object_API_Name__c.Fields.Some_Field_API_Name__c.Name}

система автоматом переправит АПИ имя объекта на Prefix_My_Custom_Object_API_Name__c, как она это делает в АПЕКС коде?

[quote="ilya leshchuk"]Проще использовать {!$ObjectType.My_Custom_Or_Standard_Object_API_Name__c.Fields.Some_Field_API_Name__c.Name} [/quote]

в таком случае My_Custom_Object_API_Name__c вписан в синтаксис, также как если его просто вписать стрингом в строку SOQL операции.

Но, не хочешь ли ты, Илья, нам сказать что в случае использования
[quote="ilya leshchuk"]!$ObjectType.My_Custom_Or_Standard_Object_API_Name__c.Fields.Some_Field_API_Name__c.Name} [/quote]
система автоматом переправит АПИ имя объекта на [b]Prefix_[/b]My_Custom_Object_API_Name__c, как она  это делает в АПЕКС коде?

Den Brown
Но, не хочешь ли ты, Илья, нам сказать что в случае использования

ilya leshchuk
!$ObjectType.My_Custom_Or_Standard_Object_API_Name__c.Fields.Some_Field_API_Name__c.Name}
система автоматом переправит АПИ имя объекта на Prefix_My_Custom_Object_API_Name__c, как она это делает в АПЕКС коде?

На вф страницах, такая вставка генерит имя поля с префиксом и если это работает в кастомных кнопка, то это просто замечательно)

[quote="Den Brown"]Но, не хочешь ли ты, Илья, нам сказать что в случае использования

ilya leshchuk
!$ObjectType.My_Custom_Or_Standard_Object_API_Name__c.Fields.Some_Field_API_Name__c.Name}
система автоматом переправит АПИ имя объекта на Prefix_My_Custom_Object_API_Name__c, как она это делает в АПЕКС коде?[/quote]

На вф страницах, такая вставка генерит имя поля с префиксом и если это работает в кастомных кнопка, то это просто замечательно)


wilder
ilya leshchuk
Проще использовать {!$ObjectType.My_Custom_Or_Standard_Object_API_Name__c.Fields.Some_Field_API_Name__c.Name}
Кстати, интересно, а можно ли в контексте VF страницы, которая внутри managed package, использовать local names в такой записи как выше, и если можно - что произойдёт если в target организации будет объект с таким же именем?

UPD: local names использовать можно, по крайней мере внутри package developer org

Если не ошибаюсь, если есть 2 объекта с одинаковыми именами, то будет выбран тот что без префикса, если в коде не указан префикс.

Зависит от контекста, если вызов в apex'е идёт изнутри managed package, то будет использован объект из managed package, в противном случае, можно было бы легко "ломать" пакеты.


Den Brown
в таком случае My_Custom_Object_API_Name__c вписан в синтаксис, также как если его просто вписать стрингом в строку SOQL операции.

Не совсем так же по двум причинам:
1. Если вы будете мигрировать код и создавать новый managed package, не надо будет менять код.
2. Наличие такой записи {!$ObjectType.My_Custom_Or_Standard_Object_API_Name__c.Fields.Some_Field_API_Name__c.Name} не даст вам просто так удалить это поле, чего не скажешь о простой строке

Den Brown
Но, не хочешь ли ты, Илья, нам сказать что в случае использования
ilya leshchuk

!$ObjectType.My_Custom_Or_Standard_Object_API_Name__c.Fields.Some_Field_API_Name__c.Name}

система автоматом переправит АПИ имя объекта на Prefix_My_Custom_Object_API_Name__c, как она это делает в АПЕКС коде?

Да, именно это я и хотел сказать - SF разрезолвит full name, единственное, что есть 1% сомнения что будет в VF в случае совпадения имён, как поведёт себя резолв имён.

[quote="wilder"][quote="ilya leshchuk"]Проще использовать {!$ObjectType.My_Custom_Or_Standard_Object_API_Name__c.Fields.Some_Field_API_Name__c.Name}
Кстати, интересно, а можно ли в контексте VF страницы, которая внутри managed package, использовать local names в такой записи как выше, и если можно - что произойдёт если в target организации будет объект с таким же именем?

UPD: local names использовать можно, по крайней мере внутри package developer org[/quote]

Если не ошибаюсь, если есть 2 объекта с одинаковыми именами, то будет выбран тот что без префикса, если в коде не указан префикс.[/quote]

Зависит от контекста, если вызов в apex'е идёт изнутри managed package, то будет использован объект из managed package, в противном случае, можно было бы легко "ломать" пакеты. 


[quote="Den Brown"]в таком случае My_Custom_Object_API_Name__c вписан в синтаксис, также как если его просто вписать стрингом в строку SOQL операции.[/quote]

Не совсем так же по двум причинам:
1. Если вы будете мигрировать код и создавать новый managed package, не надо будет менять код.
2. Наличие такой записи [b]{!$ObjectType.My_Custom_Or_Standard_Object_API_Name__c.Fields.Some_Field_API_Name__c.Name}[/b] не даст вам просто так удалить это поле, чего не скажешь о простой строке

[quote="Den Brown"]Но, не хочешь ли ты, Илья, нам сказать что в случае использования
ilya leshchuk

    !$ObjectType.My_Custom_Or_Standard_Object_API_Name__c.Fields.Some_Field_API_Name__c.Name}

система автоматом переправит АПИ имя объекта на Prefix_My_Custom_Object_API_Name__c, как она это делает в АПЕКС коде?[/quote]

Да, именно это я и хотел сказать - SF разрезолвит full name, единственное, что есть 1% сомнения что будет в VF в случае совпадения имён, как поведёт себя резолв имён.

ilya leshchuk
Зависит от контекста, если вызов в apex'е идёт изнутри managed package, то будет использован объект из managed package, в противном случае, можно было бы легко "ломать" пакеты.

Мы говорим про AJAX TOOLKIT, а значит вызов из JavaScript. Ну или я чего-то не знаю :)

[quote="ilya leshchuk"]Зависит от контекста, если вызов в apex'е идёт изнутри managed package, то будет использован объект из managed package, в противном случае, можно было бы легко "ломать" пакеты.[/quote]

Мы говорим про AJAX TOOLKIT, а значит вызов из JavaScript. Ну или я чего-то не знаю :)

wilder
ilya leshchuk
Зависит от контекста, если вызов в apex'е идёт изнутри managed package, то будет использован объект из managed package, в противном случае, можно было бы легко "ломать" пакеты.

Мы говорим про AJAX TOOLKIT, а значит вызов из JavaScript. Ну или я чего-то не знаю :)

Я-то как раз сделал оговорку что поведение зависит от контекста и написал как поведёт себя форс во вполне конкретном контексте, а так-то Ajax Toolkit не до конца указывает на контекст - это код изнутри managed package или снаружи? Если снаружи, то 100% будет использоваться именно родной для target organization объект (в случае совпадения имён), если изнутри - 99,9% что будет использоваться объект из managed package.

[quote="wilder"][quote="ilya leshchuk"]Зависит от контекста, если вызов в apex'е идёт изнутри managed package, то будет использован объект из managed package, в противном случае, можно было бы легко "ломать" пакеты.[/quote]

Мы говорим про AJAX TOOLKIT, а значит вызов из JavaScript. Ну или я чего-то не знаю :)[/quote]

Я-то как раз сделал оговорку что поведение зависит от контекста и написал как поведёт себя форс во вполне конкретном контексте, а так-то Ajax Toolkit не до конца указывает на контекст - это код изнутри managed package или снаружи? Если снаружи, то 100% будет использоваться именно родной для target organization объект (в случае совпадения имён), если изнутри - 99,9% что будет использоваться объект из managed package.

ilya leshchuk
SF разрезолвит full name

ну это конечно совсем другое дело, тогда хардкодить АПИ в JS нет смысла даже в самых простых кнопках

[quote="ilya leshchuk"]SF разрезолвит full name[/quote]

ну это конечно совсем другое дело, тогда хардкодить АПИ в JS нет смысла даже в самых простых кнопках

sforce.connection.defaultNamespace - решает наши проблемы

sforce.connection.defaultNamespace - решает наши проблемы

Век живи, век учись!

Век живи, век учись!