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

Как вместо Record Name получить ID записи из Lookup инпута прямо на VisualForce page

Всем привет,

ситуация простая и думаю многим знакомым: VisualForce с Lookup инпутом, позволяющим использовать стандартный функционал для поиска связанной записи. Все как обычно. Пользователь кликает на иконку лукапа, открывается вспомогательное окно, выбирает нужную запись, ее имя появляется в лукап поле.

Но тут тебе нужно что-то узнать о выбранной записи, отправив асинхронный запрос в контроллер (запрос основан на RemoteAction - т.е. отправить могу только параметры, а целиком Форму как например при асинхронном вызове обычного контроллерного метода с последующим частичным ререндерингом). И можно получить из лукап имя выбранной записи и отправить как параметр, да вот проблема - для имени на объекте используется текст без требования уникальности. То есть там может быть несколько записей с таким именем.

Вот если бы из лукапа можно было бы получить ID записи прям на VisualForce page , то проблем бы было меньше

Всем привет,

ситуация простая и думаю многим знакомым: VisualForce с Lookup инпутом, позволяющим использовать стандартный функционал для поиска связанной записи. Все как обычно. Пользователь кликает на иконку лукапа, открывается вспомогательное окно, выбирает нужную запись, ее имя появляется в лукап поле.

Но тут тебе нужно что-то узнать о выбранной записи, отправив асинхронный запрос в контроллер (запрос основан на RemoteAction - т.е. отправить могу только параметры, а целиком Форму как например при асинхронном вызове обычного контроллерного метода с последующим частичным ререндерингом). И можно получить из лукап имя выбранной записи и отправить как параметр, да вот проблема - для имени на объекте используется текст без требования уникальности. То есть там может быть несколько записей с таким именем. 

Вот если бы из лукапа можно было бы получить ID записи прям на VisualForce page , то проблем бы было меньше

Да, была помню такая проблема со стандартным лукап. Но очень давно так что ответ не вспомню точный.

Но как вариант.

Когда ты выбрал в лукап запись - попробуй вызвать какой-нибудь метод в Apex контроллере - точно также как делать c rerender. Нужно чтобы ушел view state. Тогда на стороне SF в поле лукап наверное получишь нужный тебе ID и можешь вернуть его обратно на страницу. Гемор конечно. Но если не удастся получить ID в JS, можно замутить и через View State

Да, была помню такая проблема со стандартным лукап. Но очень давно так что ответ не вспомню точный.

Но как вариант. 

Когда ты выбрал в лукап запись - попробуй вызвать какой-нибудь метод в Apex контроллере - точно также как делать c rerender. Нужно чтобы ушел view state. Тогда на стороне SF в поле лукап наверное получишь нужный тебе ID и можешь вернуть его обратно на страницу. Гемор конечно. Но если не удастся получить ID в JS, можно замутить и через View State

СФ же знает ID, он ID передает из дочернего окна, инфа 100%
джава скриптом достать точно можно
может можно какими то стандартными способами, я уже не помню. Вроде такая же проблема легко решилась.

СФ же знает ID, он ID передает из дочернего окна, инфа 100%
джава скриптом достать точно можно
может можно какими то стандартными способами, я уже не помню. Вроде такая же проблема легко решилась.
[img]https://i.ibb.co/bKSJPPR/image.png[/img]

Dmitry Shnyrev
попробуй вызвать какой-нибудь метод в Apex контроллере - точно также как делать c rerender. Нужно чтобы ушел view state. Тогда на стороне SF в поле лукап наверное получишь нужный тебе ID и можешь вернуть его обратно на страницу

если отправлять ID в контроллер через view state, то можно во время вызова стандартного метода всю работу и сделать и вернуть результат на страницу через скрытый ререндеринг, откуда JS и "подберет" результат.

или же если отправлять ID в контроллер через view state, то после вызова метода новый ID уже находится в контроллерной переменной, то есть его и возвращать на фронт не обязательно, просто после вызова метода вызывай RemoteAction без аргумента

выглядит как-то костыльно

но использовать кастомный "лукап" инпут лень

Андрей
он ID передает из дочернего окна, инфа 100%

ID, конечно, где-то там сидит в скрытом поле, жаль что нет "стандартного" способа получить его

[quote="Dmitry Shnyrev"]попробуй вызвать какой-нибудь метод в Apex контроллере - точно также как делать c rerender. Нужно чтобы ушел view state. Тогда на стороне SF в поле лукап наверное получишь нужный тебе ID и можешь вернуть его обратно на страницу[/quote]

если отправлять ID в контроллер через view state, то можно во время вызова стандартного метода всю работу и сделать и вернуть результат на страницу через скрытый ререндеринг, откуда JS и "подберет" результат.

или же если отправлять ID в контроллер через view state, то после вызова метода новый ID уже находится в контроллерной переменной, то есть его и возвращать на фронт не обязательно, просто после вызова метода вызывай RemoteAction без аргумента

выглядит как-то костыльно

но использовать кастомный "лукап" инпут лень :)

[quote="Андрей"]он ID передает из дочернего окна, инфа 100% [/quote]
ID, конечно, где-то там сидит в скрытом поле, жаль что нет "стандартного" способа получить его

Андрей выше ж написал со скрином что ID на странице есть. Просто бери его и используй.

Вот к примеру решение
https://salesforce.stackexchange.com/questions/70833/get-selected-lookup-id-from-javascript-method

Андрей выше ж написал со скрином что ID на странице есть. Просто бери его и используй.

Вот к примеру решение
https://salesforce.stackexchange.com/questions/70833/get-selected-lookup-id-from-javascript-method

Я просто вспомнил что я делал.

У меня не было самого лукапа, но я изловчился и замутил свой JS метод чтобы открывать стандартное Lookup окно и написал метод который перехватывает данные которые из этого окна приходят. Вот там был косяк потому что в метод приходило именно SObject Name но не ID. И я не мог найти ID на самой странице в lookup элементе потому что его у меня тупо не было. Я просто вызывал JS метод, который открывал окно и в другом методе ловил выбранное значение. Тот еще костыль! Но проблема, что я уже не вспомню и тем более не посмотрю как работает потому что забыл где это было

Я просто вспомнил что я делал. 

У меня не было самого лукапа, но я изловчился и замутил свой JS метод чтобы открывать стандартное Lookup окно и написал метод который перехватывает данные которые из этого окна приходят. Вот там был косяк потому что в метод приходило именно SObject Name но не ID. И я не мог найти ID на самой странице в lookup элементе потому что его у меня тупо не было. Я просто вызывал JS метод, который открывал окно и в другом методе ловил выбранное значение. Тот еще костыль! Но проблема, что я уже не вспомню и тем более не посмотрю как работает потому что забыл где это было :( 

Dmitry Shnyrev
Андрей выше ж написал со скрином что ID на странице есть.

OK, вот решение:

var SalesOrgId = document.getElementById('{!$Component.lookupfield}_lkid').value;

то есть, если я могу полагаться, что СФ не изменят свой "нейминг" для данного типа полей _lkid, то тогда можно попробовать

[quote="Dmitry Shnyrev"]Андрей выше ж написал со скрином что ID на странице есть.[/quote]

OK, вот решение:

[code]var SalesOrgId = document.getElementById('{!$Component.lookupfield}[b]_lkid[/b]').value;[/code]

то есть, если я могу полагаться, что СФ не изменят свой "нейминг" для данного типа полей [b]_lkid[/b], то тогда можно попробовать

Den Brown
то есть, если я могу полагаться, что СФ не изменят свой "нейминг"

Да, это недокументированная возможность, а точнее лайфхак, поэтому остается только надеяться ("надеяться" в программировании крайне нежелательное занятие)

[quote="Den Brown"]то есть, если я могу полагаться, что СФ не изменят свой "нейминг" [/quote]
Да, это недокументированная возможность, а точнее лайфхак, поэтому остается только надеяться ("надеяться" в программировании крайне нежелательное занятие) :) 

Dmitry Shnyrev
лайфхак

вот это подходящее название для подобных решений

[quote="Dmitry Shnyrev"]лайфхак[/quote]
вот это подходящее название для подобных решений

Den Brown
Dmitry Shnyrev
лайфхак

вот это подходящее название для подобных решений

ну а какие еще есть варианты кроме хаков ?
сдавай клиенту пока работает

если честно я не думаю что это когда либо перестанет работать. Шанс нулевой. Особенно учитываячто СФ забили на развитие вижуалфорса

[quote="Den Brown"][quote="Dmitry Shnyrev"]лайфхак[/quote]
вот это подходящее название для подобных решений[/quote]

ну а какие еще есть варианты кроме хаков ? :)
сдавай клиенту пока работает

если честно я не думаю что это когда либо перестанет работать. Шанс нулевой. Особенно учитываячто СФ забили на развитие вижуалфорса