动态控制SAP CRM附件的可编辑性
In production code it is ususally necessary to also have authorization control on attachment maintenance. Most of the time it is done via authorization object. In this example I just use a checkbox to control it during the whole session, in the screenshot below all buttons are disable since the “Allow Edit” checkbox is not selected.
The idea of control is, in GS_CM component controller there is a value node ATTRIBUTES which could be bound by consuming component.
in the controller class below, Content management framework will firstly check whether the current BOR type is valid ( line 13 ~ line 18), an invalid type will lead to read only mode.
then the display mode flag will be set according to the field display of value node. based on these findings, we can start development in our ui component.
step1: create an event handler for checkbox status change and just use a global variable to store the flag:
step2: create a new value node ATTRIBUTE in custom controller
redefine INIT. here we buffer the collection wrapper reference into a global variable of component controller for later usage.
method IF_BSP_MODEL~INIT.
super->if_bsp_model~init( id = id
owner = owner ).
mr_owner ?= owner.
DATA: lv_struct_ref TYPE REF TO crmt_cm_comp_st,
lv_value_node TYPE REF TO cl_bsp_wd_value_node,
lv_bo_coll TYPE REF TO if_bol_bo_col.
CREATE DATA lv_struct_ref.
CREATE OBJECT lv_value_node
EXPORTING
iv_data_ref = lv_struct_ref.
CREATE OBJECT lv_bo_coll
TYPE
cl_crm_bol_bo_col.
lv_bo_coll->add( lv_value_node ).
set_collection( lv_bo_coll ).
CL_ZSMCATT_BSPWDCOMPONENT_IMPL=>GO_ATTR_WRAPPER = me->collection_wrapper.
endmethod.
redefine ON_NEW_FOCUS. The bufferred collection wrapper for ATTRIBUTE node is used here:
method ON_NEW_FOCUS.
DATA:
lr_entity TYPE REF TO cl_crm_bol_entity,
lr_parent TYPE REF TO cl_crm_bol_entity,
lv_entity_name TYPE string,
ls_cm_attr TYPE crmt_cm_comp_st,
lv_product_type TYPE comt_product_type,
lr_bo_attr TYPE REF TO if_bol_bo_property_access,
ls_prtyp_cust TYPE coms_prtyp_cust,
lv_object_guid TYPE ib_recno_16,
lv_current TYPE flag,
ls_button TYPE crmt_thtmlb_button.
CHECK focus_bo IS BOUND.
lr_entity ?= focus_bo.
lv_entity_name = lr_entity->get_name( ).
IF CL_ZSMCATT_BSPWDCOMPONENT_IMPL=>gv_can_edit = 'X'.
ls_cm_attr-display = ''.
ELSE.
ls_cm_attr-display = 'X'.
ENDIF.
CHECK CL_ZSMCATT_BSPWDCOMPONENT_IMPL=>GO_ATTR_WRAPPER IS NOT INITIAL.
lr_bo_attr = CL_ZSMCATT_BSPWDCOMPONENT_IMPL=>GO_ATTR_WRAPPER->get_current( ).
CHECK lr_bo_attr IS BOUND.
lr_bo_attr->set_properties( ls_cm_attr ).
endmethod.
step3: in WD_USAGE_INITIALIZE method of ZSMCATTR component controller, bind the context node of custom controller to GS_CM’s attributes node.
CALL METHOD iv_usage->bind_context_node
EXPORTING
iv_controller_type = cl_bsp_wd_controller=>co_type_custom
iv_name = 'ZSMCATT/CMBO'
iv_target_node_name = 'ATTRIBUTE' "#EC NOTEXT
iv_node_2_bind = 'ATTRIBUTES'. "#EC NOTEXT
lr_cuco_attachement ?= get_custom_controller( 'ZSMCATT/CMBO' ).
IF lr_cuco_attachement IS BOUND.
lr_property = me>typed_context->socialpost->collection_wrapper->get_current( ).
lr_cuco_attachement->typed_context->cmbo->on_new_focus( lr_property ).
lr_cuco_attachement->typed_context->attribute->on_new_focus( lr_property ).
ENDIF.
- WCF后续之旅(10): 通过WCF Extension实现以对象池的方式创建Service Instance
- Silverlight菜单控件 — CurveMenu
- 实力终端撑腰 两枚域名均五位数被秒
- Silverlight制作逐帧动画 v2 - part2
- Nodejs学习笔记(四)--- 与MySQL交互(felixge/node-mysql)
- 学习Spark——环境搭建(Mac版)
- 离线网络环境下一键式部署
- WCF后续之旅(17):通过tcpTracer进行消息的路由
- Linux同步机制(一) - 线程锁
- Silverlight类库介绍-FJCore
- 大型网站的自强之路
- 人工智能:浮现
- 机器人进化 如何确保 安全概率?
- Nodejs学习笔记(七)--- Node.js + Express 构建网站简单示例
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Rstudio支持可视化的Markdown编辑了?
- (八)python3 只需3小时带你轻松入门——List 与 dict 的常用操作
- (九)python3 只需3小时带你轻松入门——函数自定义
- (十)python3 只需3小时带你轻松入门——模块与包
- (十一)python3 只需3小时带你轻松入门——面向对象
- 一文读懂KEGG数据库
- (创建模式 上)设计模式——工厂、抽象工厂 C++/Python3实现
- 【新手宝典】一篇博文带萌新建站并了解建站体系流程和对萌新友好的便捷方式,这篇博文很有可能是你的启蒙文
- 一种不需要敲代码的Python 画图方法
- 【一】Windows API 零门槛编程指南——MessageBox 基本使用及基础讲解
- 【二】Windows API 零门槛编程指南——CreateWindow 窗口创建 “万字长篇专业术语全解”
- 「零门槛多语言 Python/C/C# 通用思想学习系列」第一篇:经典HelloWorld
- 直播系统定制,判断数据连接是否可用
- VS Code 编辑器入门指南上篇-核心概念与组件
- Python turtle库实现基本剖析