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

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

Всем привет,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Dmitry Shnyrev
лайфхак

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

Den Brown
Dmitry Shnyrev
лайфхак

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

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

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

Interesting information? Help us, post link to social media..