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

Получить данные из компонентов

У нас есть три компонента на визуал форсепейдж,нужно получить все данные в контроллер страницы из компонентов.Этот вопрос был с одного собеседования, тогда я сразу предложил написать серелизатор на javascript и передать в контроллер,на что мне сказали что да это можно сделать да, А какие вы знаете Salesforce style решения для этой задачи ? Какие есть еще варианты ?

У нас есть три компонента на визуал форсепейдж,нужно получить все данные в контроллер страницы из компонентов.Этот вопрос был с одного собеседования, тогда я сразу предложил написать серелизатор на javascript и передать в контроллер,на что мне сказали что да это можно сделать да, А какие вы знаете Salesforce style решения для этой задачи ? Какие есть еще варианты ?

у ВФ компонента может быть собственный контроллер. МОжет ли это как то помочь?
А что если контроллер для компонента и оснонвой страницы - один и тот же, просто компонент использует один из его дополнительных возможностей контроллер. МОжно ли так сделать?
А что если тот код в контроллере, который работает с компонентом, вывести в его расширение?
я практически не работал с компонентами, поэтому это все догадки.

у ВФ компонента может быть собственный контроллер. МОжет ли это как то помочь?
А что если контроллер для компонента и оснонвой страницы - один и тот же, просто компонент использует один из его дополнительных возможностей контроллер. МОжно ли так сделать?
А что если тот код в контроллере, который работает с компонентом, вывести в его расширение? 
я практически не работал с компонентами, поэтому это все догадки.

А глянь вот этот документ

https://developer.salesforce.com/page/Controller_Component_Communication

Только что нашел, не было времени вчитываться, но первый абзац уже цепляет.

А глянь вот этот документ

[url]https://developer.salesforce.com/page/Controller_Component_Communication[/url]

Только что нашел, не было времени вчитываться, но первый абзац уже цепляет.

The first step is to create a virtual class that every controller that needs to communicate with a component controller will extend.

В принципе этот подход - усложненный вариант решения который предложил Den Brown с общим контроллером

The first step is to create a virtual class that every controller that needs to communicate with a component controller will extend.

В принципе этот подход - усложненный вариант решения который предложил Den Brown с общим контроллером

Немного не в тему...но связанное с компонентами (скорее даже элементами VF-странички)

https://developer.salesforce.com/page/Dynamic_Visualforce_Components

Немного не в тему...но связанное с компонентами (скорее даже элементами VF-странички)

[url]https://developer.salesforce.com/page/Dynamic_Visualforce_Components[/url]

это не ссылки, а настоящие разминки для мозгов.

Код в Controller Component Communication - это просто квинсистенция ООП, просто нужно читать и запоминать навсегда.

обратите внимание, что в разметке в переменную компонента передается что-то, но это:
- не переменная в разметке, а поле в контроллере компонента.
- и не просто поле, а свойство с сетом - и этот сет делает что-то еще кроме как прописывает поле.

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

в данном случае делается следующее: контроллер страницы заставляет контроллер компонента заставить этот контроллера страницы взять этот самый контроллер компонета себе в поле.
просто прекрасно

это не ссылки, а настоящие разминки для мозгов.

Код в Controller Component Communication - это просто квинсистенция ООП, просто нужно читать и запоминать навсегда.

обратите внимание, что в разметке в переменную компонента передается что-то, но это:
- не переменная в разметке, а поле в контроллере компонента.
- и не просто поле, а свойство с сетом - и этот сет делает что-то еще кроме как прописывает поле.

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

в данном случае делается следующее: контроллер страницы заставляет контроллер компонента заставить этот контроллера страницы взять этот самый контроллер компонета себе в поле. 
просто прекрасно

Den Brown
это не ссылки, а настоящие разминки для мозгов.

Код в Controller Component Communication - это просто квинсистенция ООП, просто нужно читать и запоминать навсегда.

обратите внимание, что в разметке в переменную компонента передается что-то, но это:
- не переменная в разметке, а поле в контроллере компонента.
- и не просто поле, а свойство с сетом - и этот сет делает что-то еще кроме как прописывает поле.

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

в данном случае делается следующее: контроллер страницы заставляет контроллер компонента заставить этот контроллера страницы взять этот самый контроллер компонета себе в поле.
просто прекрасно

А теперь....внимание.....сможете ли вы найти баг в этой логике ?

[quote="Den Brown"]это не ссылки, а настоящие разминки для мозгов.

Код в Controller Component Communication - это просто квинсистенция ООП, просто нужно читать и запоминать навсегда.

обратите внимание, что в разметке в переменную компонента передается что-то, но это:
- не переменная в разметке, а поле в контроллере компонента.
- и не просто поле, а свойство с сетом - и этот сет делает что-то еще кроме как прописывает поле.

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

в данном случае делается следующее: контроллер страницы заставляет контроллер компонента заставить этот контроллера страницы взять этот самый контроллер компонета себе в поле. 
просто прекрасно[/quote]

А теперь....внимание.....сможете ли вы найти баг в этой логике ?

wilder
А теперь....внимание.....сможете ли вы найти баг в этой логике ?

Баг (неточность, недопонимание) в логике того, как я представляю себе работу кода, или баг в самом коде примеров?

Работу самого кода я не проверял, а ошибок в логике я пока не нашел .

сначала не было понятно, зачем нужен getThis() - потом понял - чтобы получить this на фронте, иначе никак к нему не обратится в разметке (так получается?).

не совсем понятно зачем в вирт комп контрол есть проверка на нул пришедшего аргумента\переменной - ведь он обязателен, без него не возможно заставить компонент работать. или можно в аргумент компонента передать 'null'? и тогда компонент будет работать сам по себе без связки с основным контроллером страницы. или этот аоргумент станет Нул если в него передать контр страницы, который не PageControllerBase, и тогда компонент будет работать без связки? а можно ли передать в аргумент переменную другого типа? эта деталь не понятна

[quote="wilder"]
А теперь....внимание.....сможете ли вы найти баг в этой логике ?[/quote]

Баг (неточность, недопонимание) в логике того, как я представляю себе работу кода, или баг в самом коде примеров?

Работу самого кода я не проверял, а ошибок в логике я  пока не нашел .

сначала не было понятно, зачем нужен getThis() - потом понял - чтобы получить this на фронте, иначе никак к нему не обратится в разметке (так получается?).

не совсем понятно зачем в вирт комп контрол есть проверка на нул пришедшего аргумента\переменной - ведь он обязателен, без него не возможно заставить компонент работать. или можно в аргумент компонента передать 'null'? и тогда компонент будет работать сам по себе без связки с основным контроллером страницы. или этот аоргумент станет Нул если в него передать контр страницы, который не PageControllerBase, и тогда компонент будет работать без связки? а можно ли передать в аргумент переменную другого типа?  эта деталь не понятна

Den Brown
wilder
А теперь....внимание.....сможете ли вы найти баг в этой логике ?

Баг (неточность, недопонимание) в логике того, как я представляю себе работу кода, или баг в самом коде примеров?

Работу самого кода я не проверял, а ошибок в логике я пока не нашел .

сначала не было понятно, зачем нужен getThis() - потом понял - чтобы получить this на фронте, иначе никак к нему не обратится в разметке (так получается?).

не совсем понятно зачем в вирт комп контрол есть проверка на нул пришедшего аргумента\переменной - ведь он обязателен, без него не возможно заставить компонент работать. или можно в аргумент компонента передать 'null'? и тогда компонент будет работать сам по себе без связки с основным контроллером страницы. или этот аоргумент станет Нул если в него передать контр страницы, который не PageControllerBase, и тогда компонент будет работать без связки? а можно ли передать в аргумент переменную другого типа? эта деталь не понятна

А теперь посмотри сколько раз реально вызывается каждый компонент в дебаг логе.

[quote="Den Brown"][quote="wilder"]
А теперь....внимание.....сможете ли вы найти баг в этой логике ?[/quote]

Баг (неточность, недопонимание) в логике того, как я представляю себе работу кода, или баг в самом коде примеров?

Работу самого кода я не проверял, а ошибок в логике я  пока не нашел .

сначала не было понятно, зачем нужен getThis() - потом понял - чтобы получить this на фронте, иначе никак к нему не обратится в разметке (так получается?).

не совсем понятно зачем в вирт комп контрол есть проверка на нул пришедшего аргумента\переменной - ведь он обязателен, без него не возможно заставить компонент работать. или можно в аргумент компонента передать 'null'? и тогда компонент будет работать сам по себе без связки с основным контроллером страницы. или этот аоргумент станет Нул если в него передать контр страницы, который не PageControllerBase, и тогда компонент будет работать без связки? а можно ли передать в аргумент переменную другого типа?  эта деталь не понятна[/quote]

А теперь посмотри сколько раз реально вызывается каждый компонент в дебаг логе.

сегодня нет времени это пробовать - замучен с СФ1. буду подробно изучать на выходных.

я думаю там один контроллер страницы и один комп контроллер, которые используют this (передать себя, взять меня). в моем описании возможно выглядит что там 2 вызова контроллера страницы и 2 вызова контроллера компонента - но я думаю, что это не так. Там все те же лица, только в профиль.

сегодня нет времени это пробовать - замучен с СФ1. буду подробно изучать на выходных.

я думаю там один контроллер страницы и один комп контроллер, которые используют this (передать себя, взять меня). в моем описании возможно выглядит что там  2 вызова контроллера страницы  и 2 вызова контроллера компонента - но я думаю, что это не так. Там все те же лица, только в профиль.

Art Vegas
Немного не в тему...но связанное с компонентами (скорее даже элементами VF-странички)

https://developer.salesforce.com/page/Dynamic_Visualforce_Components

вот это тоже очень интересная статья.
вот теперь хоть понятно, что такое Динамические ВФ компоненты (ДВФК).

я думал, это что-то вроде кастомных компонентов, к которым можно обращаться из кода контроллера, манипулировать ими.

но ДВФК - это динамические создаваемые в контроллере фрагменты разметки.
при этом в примере приведено как можно создавать в контроллере фрагменты с апекс:тегами, что само по себе интересно, хотя в такой ДВФК можно поместить и HTML и JS.
интересная тема.

но не уловил, в чем разница в конечном результате здесь:

Component.Apex.OutputField outTxt = new Component.Apex.OutputField();
outTxt.value = rec.Name;

и здесь:
Component.Apex.InputField inTxt = new Component.Apex.InputField(value=rec.name);
inTxt.expressions.value = ‘{!rec.name}’;


Notice that we set value and expressions.value. The first will ensure we display the value in the input field when the page loads, the second will bind the data to the variable.

Просто отличные статьи, можно отдельную тему создать "Статьи которые стоит прочитать" и прикрепить вверху.

[quote="Art Vegas"]Немного не в тему...но связанное с компонентами (скорее даже элементами VF-странички)

[url]https://developer.salesforce.com/page/Dynamic_Visualforce_Components[/url][/quote]

вот это тоже очень интересная статья. 
вот теперь хоть понятно, что такое Динамические ВФ компоненты (ДВФК).

я думал, это что-то вроде кастомных компонентов, к которым можно обращаться из кода контроллера, манипулировать ими.

но ДВФК - это динамические создаваемые в контроллере фрагменты разметки. 
при этом в примере приведено как можно создавать в контроллере фрагменты с апекс:тегами, что само по себе интересно, хотя в такой ДВФК можно поместить и HTML и JS. 
интересная тема.

но не уловил, в чем разница в конечном результате здесь:
[code]Component.Apex.OutputField outTxt = new Component.Apex.OutputField();
outTxt.value = rec.Name;[/code]
и здесь:
[code]Component.Apex.InputField inTxt = new Component.Apex.InputField(value=rec.name);
inTxt.expressions.value = ‘{!rec.name}’;[/code]
[i]
Notice that we set value and expressions.value. The first will ensure we display the value in the input field when the page loads, the second will bind the data to the variable. [/i]

Просто отличные статьи, можно отдельную тему создать "Статьи которые стоит прочитать" и прикрепить вверху.

Итак вести с полей (дебажим пример Illustrating How to Establish Communication Between Page and Component)

Запуск страницы:

DEBUG|You are in getThis of PageControllerBase

DEBUG|You are in setComponentController of MyPageController // здесь и следующий: очередность не та, что ожидал

DEBUG|You are in pageController SET after value != null of ComponentControllerBase

DEBUG|You are in setComponentController of MyPageController // еще раз??

DEBUG|You are in pageController SET after value != null of ComponentControllerBase

DEBUG|You are in getIntValue of MyComponentController

Жмем на кнопку "Call Component Controller Method":

DEBUG|You are in getThis of PageControllerBase

DEBUG|You are in setComponentController of MyPageController

DEBUG|You are in pageController SET after value != null of ComponentControllerBase

DEBUG|You are in setComponentController of MyPageController

DEBUG|You are in pageController SET after value != null of ComponentControllerBase

DEBUG|You are in incrementValue of MyComponentController // здесь и следующий: очередность не та, что ожидал - ведь вроде жмем на callComponentControllerMethod

DEBUG|You are in callComponentControllerMethod of MyPageController

DEBUG|You are in getThis of PageControllerBase // как сюда снова попали??

DEBUG|You are in setComponentController of MyPageController

DEBUG|You are in pageController SET after value != null of ComponentControllerBase

DEBUG|You are in getIntValue of MyComponentController


Этот мир сложнее, чем я ожидал...

Итак вести с полей (дебажим пример Illustrating How to Establish Communication Between Page and Component)

[b]Запуск страницы:[/b]

DEBUG|You are in getThis of PageControllerBase

DEBUG|You are in setComponentController of MyPageController /[i]/ здесь и следующий: очередность не та, что ожидал [/i]

DEBUG|You are in pageController SET after value != null of ComponentControllerBase

DEBUG|You are in setComponentController of MyPageController [i]// еще раз??[/i]

DEBUG|You are in pageController SET after value != null of ComponentControllerBase

DEBUG|You are in getIntValue of MyComponentController



[b]Жмем на кнопку "Call Component Controller Method":[/b]

DEBUG|You are in getThis of PageControllerBase

DEBUG|You are in setComponentController of MyPageController

DEBUG|You are in pageController SET after value != null of ComponentControllerBase

DEBUG|You are in setComponentController of MyPageController 

DEBUG|You are in pageController SET after value != null of ComponentControllerBase

DEBUG|You are in incrementValue of MyComponentController [i]// здесь и следующий: очередность не та, что ожидал - ведь вроде жмем на callComponentControllerMethod [/i]

DEBUG|You are in callComponentControllerMethod of MyPageController

DEBUG|You are in getThis of PageControllerBase [i][b]// как сюда снова попали??[/b][/i]

DEBUG|You are in setComponentController of MyPageController

DEBUG|You are in pageController SET after value != null of ComponentControllerBase

DEBUG|You are in getIntValue of MyComponentController


Этот мир сложнее, чем я ожидал...

Cпасибо за обсуждение. :)

Cпасибо за обсуждение. :)

Сегодня ночью думал об этом примере с контроллерами страницы и компонента.
И понял что это пример реализации ООП патерна Стратегия.

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

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

Но с очередностью, как происходит инициализация этого "компонентного" поля в контроллере страницы так и разобрал до конца. вероятно нужно понимае как на сервере выполняется код разметки и код контроллера.

Сегодня ночью думал об этом примере с контроллерами страницы и компонента.
И понял что это пример реализации ООП патерна Стратегия.

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

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

Но с очередностью, как происходит инициализация этого "компонентного" поля в контроллере страницы так и разобрал до конца. вероятно нужно понимае как на сервере выполняется код разметки и код контроллера.