Всем привет,
ситуация простая и думаю многим знакомым: VisualForce с Lookup инпутом, позволяющим использовать стандартный функционал для поиска связанной записи. Все как обычно. Пользователь кликает на иконку лукапа, открывается вспомогательное окно, выбирает нужную запись, ее имя появляется в лукап поле.
Но тут тебе нужно что-то узнать о выбранной записи, отправив асинхронный запрос в контроллер (запрос основан на RemoteAction - т.е. отправить могу только параметры, а целиком Форму как например при асинхронном вызове обычного контроллерного метода с последующим частичным ререндерингом). И можно получить из лукап имя выбранной записи и отправить как параметр, да вот проблема - для имени на объекте используется текст без требования уникальности. То есть там может быть несколько записей с таким именем.
Вот если бы из лукапа можно было бы получить ID записи прям на VisualForce page , то проблем бы было меньше
Да, была помню такая проблема со стандартным лукап. Но очень давно так что ответ не вспомню точный.
Но как вариант.
Когда ты выбрал в лукап запись - попробуй вызвать какой-нибудь метод в Apex контроллере - точно также как делать c rerender. Нужно чтобы ушел view state. Тогда на стороне SF в поле лукап наверное получишь нужный тебе ID и можешь вернуть его обратно на страницу. Гемор конечно. Но если не удастся получить ID в JS, можно замутить и через View State
СФ же знает ID, он ID передает из дочернего окна, инфа 100%
джава скриптом достать точно можно
может можно какими то стандартными способами, я уже не помню. Вроде такая же проблема легко решилась.
если отправлять ID в контроллер через view state, то можно во время вызова стандартного метода всю работу и сделать и вернуть результат на страницу через скрытый ререндеринг, откуда JS и "подберет" результат.
или же если отправлять ID в контроллер через view state, то после вызова метода новый ID уже находится в контроллерной переменной, то есть его и возвращать на фронт не обязательно, просто после вызова метода вызывай RemoteAction без аргумента
выглядит как-то костыльно
но использовать кастомный "лукап" инпут лень
ID, конечно, где-то там сидит в скрытом поле, жаль что нет "стандартного" способа получить его
Андрей выше ж написал со скрином что ID на странице есть. Просто бери его и используй.
Вот к примеру решение
https://salesforce.stackexchange.com/questions/70833/get-selected-lookup-id-from-javascript-method
Я просто вспомнил что я делал.
У меня не было самого лукапа, но я изловчился и замутил свой JS метод чтобы открывать стандартное Lookup окно и написал метод который перехватывает данные которые из этого окна приходят. Вот там был косяк потому что в метод приходило именно SObject Name но не ID. И я не мог найти ID на самой странице в lookup элементе потому что его у меня тупо не было. Я просто вызывал JS метод, который открывал окно и в другом методе ловил выбранное значение. Тот еще костыль! Но проблема, что я уже не вспомню и тем более не посмотрю как работает потому что забыл где это было ![]()
OK, вот решение:
var SalesOrgId = document.getElementById('{!$Component.lookupfield}_lkid').value;то есть, если я могу полагаться, что СФ не изменят свой "нейминг" для данного типа полей _lkid, то тогда можно попробовать
Да, это недокументированная возможность, а точнее лайфхак, поэтому остается только надеяться ("надеяться" в программировании крайне нежелательное занятие) ![]()
вот это подходящее название для подобных решений
ну а какие еще есть варианты кроме хаков ?
сдавай клиенту пока работает
если честно я не думаю что это когда либо перестанет работать. Шанс нулевой. Особенно учитываячто СФ забили на развитие вижуалфорса