Следующим курсом в рамках программы «Вечерний ABAP» для меня стал курс об основах Web Dynpro – NET310. Курс рассматривает базовые понятия WDP, такие как типы контроллеров, окна, ракурсы, базовые элементы UI, приложения и взаимодействия между всеми этими объектами. Одной из самых любопытных для меня тем была возможность изменения существующих WDP приложений.
Когда заходит речь об изменении WDP приложений, можно рассматривать эти изменения с разных точек зрения:
- с одной стороны нам может понадобиться изменить какую-либо WDP сущность или создать новую (расширить контекст, изменить ABAP код и т.п., добавить UI элемент в ракурс, создать ракурс);
- с другой стороны мы можем захотеть скрыть ненужные поля в рамках ракурса, прописать значения для конфигурационного контроллера, изменить прочие UI свойства, т.е. все те изменения, которые не затрагивают непосредственно изменение каких-либо базовых WDP сущностей.
В первом случае речь будет идти о расширении приложения (с помощью Enhancement Framework), во втором случае об адаптации. Далее в статье рассматриваются возможности адаптации WDP приложений. Более подробно о расширениях вы можете узнать из курса NET310 и официальной документации. Статья подразумевает, что читатель знает основы WDP.
Адаптация WDP приложений может подразделяться на три подуровня, за каждый из которых может отвечать отдельный специалист:
Каждый следующий уровень может влиять на адаптацию, выполненную на предыдущем. Каждый предыдущий уровень может ограничивать возможности адаптации на последующих уровнях.
Рассмотрим уровни более подробно:
- Уровень конфигурации. На уровне конфигурации программисты, которые разрабатывают приложение WDP, создают наборы настроек (конфигурации) для компонентов (конфигурация компонента) и приложений (конфигурация приложения). Созданные конфигурации являются объектами репозитария, они, как правило, лежат в одном пакете с приложением и переносятся с помощью транспортной системы. Конфигурации, как и приложения не зависят от манданта.
- Уровень кастомизации. На данном уровне администраторы могут адаптировать UI элементы конкретного приложения во время его выполнения. Кастомизация для приложения всегда одна в рамках клиента (манданта) и текущей конфигурации, при этом эти настройки так же можно перенести через транспортную систему, пример объектов из такого запроса:
- Уровень персонализации. На данном этапе пользователь WDP приложения может поменять некоторые настройки UI элементов под себя, при этом настройки сохраняются только для конкретного пользователя.
Подготовка
В качестве примера рассмотрим простейшее приложение WDP, которое содержит внутри себя один ракурс с текстовым полем и кнопкой. В контексте контроллера компонента объявим следующий узел:
Где атрибуты TEXT_ONE и TEXT_TWO имеют тип STRING.
Создадим контроллер конфигурации для нашего компонента:
Пометим его как конфигурационный контроллер:
Конфигурационный контроллер необходим для того чтобы иметь возможность настраивать его контекст из конфигурации компонента для последующей передачи значений из его контекста в контекст контроллера компонента.
Для передачи в контроллер компонента данных из конфигурационного контроллера необходимо добавить его в качестве используемых контроллеров:
Далее скопируем в контекст конфигурационного контроллера созданный узел TEXTS из контекста контроллера компонента, для этого можно воспользоваться мастером:
На последующем экране необходимо выбрать контроллер компонента и узел TEXTS, таким образом, мы получим копию узла в нашем конфигурационном контроллере.
После создания узла контекста привяжем его к узлу контроллера компонента, делается это в контексте контроллера компонента:
Следует отметить, что конфигурационный контроллер в рамках компонента может быть только один.
После создания конф. контроллера, привяжем узел TEXTS из контроллера компонента к контексту ракурса и привяжем свойство TEXT из UI элемента Caption к атрибуту TEXT_ONE:
На текущем этапе у нас будет выводиться следующий экран:
Далее проходя по всем уровням адаптации, будем изменять значения текста и свойства UI элементов.
Уровень конфигурации
На данном этапе адаптации, основными объектами с которыми мы будем работать будут:
- Конфигурация компонента
- Конфигурация приложения
- Конфигурационный контроллер
Конфигурация компонента необходима для хранения значений для конфигурационного контроллера и адаптации внешнего вида у ракурсов компонента.
Чтобы создать конфигурацию компонента, можно использовать контекстное меню в SE80:
После чего автоматически стартует WDP приложение — CONFIGURE_COMPONENT.
Приложение довольно простое, в нем необходимо задать имя конфигурации и нажать на кнопку создать:
Далее следует указать пакет, в котором она будет сохранена, а так же транспорт через который будет осуществлен перенос (в моем случае это локальный пакет, запрос на транспорт не потребуется):
В зависимости от версии системы следующий экран может выглядеть по-разному. В моей версии системы (7.31) появляется экран с тремя вкладками: attributes, component-defined, web Dynpro built-in. В более старых версиях вкладки назывались: properties, explicit configuration, implicit configuration.
На закладке Component-Defined можно задать значения для контекста конфигурационного контроллера:
Запустив наше приложение с такой конфигурацией, мы бы уже увидели измененный экран:
Однако для того чтобы запустить приложение с конфигурацией компонента, необходимо создать конфигурацию приложения, об этом будет рассказано чуть позже.
Галочка Final (Окон.) обозначает то, что на последующих уровнях настройки контекст не должен изменяться. Предположим у нас в приложении есть дополнительная инициализация после того как значения из контекста конфигурационного контроллера будут перенесены в контекст контроллера компонента. Для этого мы можем в событии инициализации контроллера компонента (WDDOINIT) добавить следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
DATA lo_nd_texts TYPE REF TO if_wd_context_node. DATA lo_el_texts TYPE REF TO if_wd_context_element. DATA ls_texts TYPE wd_this->element_texts. lo_nd_texts = wd_context->get_child_node( name = wd_this->wdctx_texts ). lo_el_texts = lo_nd_texts->get_element( ). TRY. lo_el_texts->set_attribute( name = `TEXT_ONE` value = `Значение по умолчанию 1` ). CATCH cx_wd_context. ENDTRY. TRY. lo_el_texts->set_attribute( name = `TEXT_TWO` value = `Значение по умолчанию 2` ). CATCH cx_wd_context. ENDTRY. |
В случае установки галочки «final» в конфигурации напротив какого-либо атрибута, код по его изменению будет приводить к особой ситуации CX_WD_CONTEXT.
На вкладке Web Dynpro Built-In находятся настройки к привязке к UI элементам (в дереве отражены все ракурсы компонента), например таким образом можно изменить текст еще раз:
В результате получим:
Вместо непосредственно текста можно прописать ссылку из OTR репозитария.
Галочка Final по аналогии с такой же на закладе Component-Defined обозначает, что на последующих уровнях адаптации, это значение не должно меняться.
С помощью кнопки «Reset» можно сбросить измененное значение на начальное.
Для компонента можно создать неограниченное количество конфигураций.
Создав конфигурацию компонента её нужно каким-то образом запустить. Для этого, создается конфигурация приложения, опять воспользуемся контекстным меню (с узла WDP приложения) из SE80:
Создадим новую конфигурацию приложения:
Укажем пакет и описание:
В зависимости от версии системы следующий экран может отличаться.
На вкладке structure укажем, с какой конфигурацией компонента будет запускаться наша конфигурация приложения:
Кроме присваивания конфигурации компонента, в конфигурации приложения можно так же настроить параметры приложения – те самые, что настраиваются на закладке Parameters, когда вы редактируете WDP приложение в SE80:
Делается это на вкладке Application Parameters:
В параметрах так же можно задать пользовательские параметры, определенные в Startup Inbound Plug.
С помощью кнопки «Test» можно запустить приложение с обрабатываемой конфигурацией.
Вообще сам запуск WDP приложения с конфигурацией может быть осуществлен либо динамически, либо статически. При динамическом запуске в URL к приложению необходимо добавить указание на имя конфигурации, в нашем случае: sap-wd-configId=ZAPP_CONFIG. При статическом запуске ID конфигурации указывается в параметрах приложения:
После чего запуск приложения всегда будет осуществляться с указанной конфигурацией приложения. Для приложения WDP можно создать сколько угодно конфигураций приложения.
Уровень кастомизации
На уровне кастомизации, администраторы могут адаптировать UI элементы WDP приложения для текущей конфигурации компонента в рамках клиента. Если приложение запущено без конфигурации, адаптация происходит непосредственно для него. Для каждой конфигурации компонента может быть выполнена и сохранена только одна настройка кастомизации.
Настройки кастомизации сохраняются в специальных настроечных таблицах, после чего их можно переносить через транспортную систему. Пример содержимого запроса:
В данном случае была произведена кастомизация приложения без конфигурации и приложения с конфигурацией ZCOMP_CONFIG.
Для того чтобы начать производить кастомизацию, необходимо добавить к URL следующий параметр: SAP-CONFIG-MODE=X. В результате чего, в контекстном меню появится следующий пункт:
Нажав на пункт меню, откроется окно изменений кастомизации:
Диалог аналогичен рассматриваемому ранее диалогу на закладке Web Dynpro Built-In в конфигурации компонента. Напомню, если в конфигурации компонента выставлена галочка «Final», изменить значение в кастомизации не получится:
Галочка Final (или окон.) в данном же диалоге означает, что на уровне персонализации пользователь не сможет переопределить свойство UI элемента.
Уровень персонализации
На этапе персонализации пользователь может изменить те настройки пользовательского интерфейса, которые ему не запретили изменять на предыдущих уровнях адаптации (флаг Окон. Final). Данный шаг является самым ограниченным в плане адаптации, т.к. далеко не все может быть изменено пользователем (В основном пользователь может скрывать не нужные ему элементы, менять позиции столбцов в таблицах и т.п.). Персонализация может быть запрещена путем настройки параметра приложения:
В связи с тем, что настройки персонализации не отображаются в транзакции SE80, может возникнуть проблема с их поиском и определением. К счастью для нас существует специальное WDP приложение, где мы можем посмотреть их, а так же все конфигурации к компоненту WD_ANALYZE_CONFIG_USER:
При просмотре персонализации мы можем понять, какие свойства UI элементов были изменены:
Уровень глобальных настроек
Кроме перечисленных уровней адаптации, администраторы могут так же задавать глобальные параметры для WDP приложений в рамках текущего манданта. Делается это путём запуска приложения WD_GLOBAL_SETTING: