EricWang

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

前天要做个让SPD在设计工作流的时候能添加的Activity .

场景是这样的,当流程走到某一步的时候,必须设置当前列表项的权限为部分人只读,部分人可修改,完了再走几步后恢复权限(先前没自定义权限,所以直接恢复继承就OK).

最后做完的效果应该是这样,SPD里设计工作流时可以在操作里找到我们自定义的Activity.


下面两张图是我们的
Activity被加到工作流里的界面.




 

那么,是怎么做到跟SPD集成的呢?其实很简单.

第一步,首先我们得先做好这个Activity.

建项目添加Activity之后.要添加两个引用




 

然后一堆的namespace.

然后一堆的DependencyProperty.

然后一堆的功能代码.

Activity的实现代码就不贴了,严重影响页面.^_^最下面有下载整个项目的连接
第二步,强签名程序集,因为我们要把它装到GAC.

签名过后Rebuild.DLL拖到GAC里去.

第三步,修改站点对应的目录里的web.config文件,搜索到</authorizedTypes>在这行上面加入一行:

 

<authorizedType Assembly="ItemRole, Version=1.0.0.0, Culture=neutral, PublicKeyToken=810fc8cb8b152837" Namespace="ItemRole" TypeName="*" Authorized="True" />

 

Assembly的值可以用Reflector来看程序集
 

第四步, 在服务器上注册我们的Activity

定位到路径C:\Program Files\Common Files\Microsoft Sharedweb server extensions\12\TEMPLATE\2052\Workflow

里面有个wss.actions,可以通过修改这个文件来注册我们的Activity

更推荐的做法是,参考wss.actions新建一个action后缀的文件 custom.actions

也可以直接修改wss.actions actions 节里加上下面两段:

<Action Name="设置列表项的权限"
      ClassName
="ItemRole.SetRoleActivity"
      Assembly
="ItemRole, Version=1.0.0.0, Culture=neutral, PublicKeyToken=810fc8cb8b152837"
      AppliesTo
="all"
      Category
="Sample">
      
<RuleDesigner Sentence="将%1的权限设置为%2用户只读,%3可写">         
    
<FieldBind Field="ListId,ListItem" Text="此列表" Id="1" DesignerType="ChooseListItem" />
    
<FieldBind Field="Reader" DesignerType="Person" Text="只读用户" Id="2"/>
    
<FieldBind Field="Editor" DesignerType="Person" Text="可写用户" Id="3"/>
    
</RuleDesigner>
    
<Parameters>
    
<Parameter Name="__Context" Type="Microsoft.SharePoint.WorkflowActions.WorkflowContext" Direction="In" />
    
<Parameter Name="ListId" Type="System.String, mscorlib" Direction="In" />
    
<Parameter Name="ListItem" Type="System.Int32, mscorlib" Direction="In"  />
    
<Parameter Name="Reader" Type="System.Collections.ArrayList, mscorlib" Direction="In" />
    
<Parameter Name="Editor" Type="System.Collections.ArrayList, mscorlib" Direction="In" />
      
</Parameters>
    
</Action>

    
<Action Name="恢复列表项的权限继承"
      ClassName
="ItemRole.ResetRoleInheritanceActivity"
      Assembly
="ItemRole, Version=1.0.0.0, Culture=neutral, PublicKeyToken=810fc8cb8b152837"
      AppliesTo
="all"
      Category
="Sample">
      
<RuleDesigner Sentence="将%1 恢复为继承父权限">         
    
<FieldBind Field="ListId,ListItem" Text="此列表" Id="1" DesignerType="ChooseListItem" />
    
</RuleDesigner>
    
<Parameters>
    
<Parameter Name="__Context" Type="Microsoft.SharePoint.WorkflowActions.WorkflowContext" Direction="In" />
    
<Parameter Name="ListId" Type="System.String, mscorlib" Direction="In" />
    
<Parameter Name="ListItem" Type="System.Int32, mscorlib" Direction="In"  />
      
</Parameters>
    
</Action>

来解释一下上面的代码

Action 的Name很好理解,就是在SPD里显示的名字,
ClassName指定类名,
Assembly不用说了,
AppliesTo,应用的对象,all就是全部,还可以是list,doclib
Category,在SPD里显示时的分类名
RuleDesigner 定义了在SPD添加了Activity后显示的东西。
FieldBind里有两个重要的的属性,Field跟DesignerType
有好多个DesignerType可用,对应着不同的弹出框和不同的功能。比如这里用到的Person ChooseListItem分别是用来选择用户和列表项的。
至于别的DesignerType和功能,最好的查阅地方我觉得还是wss.actions,对应着SPD显示出来的效果和功能去wss.actions里查看用的哪个Type.都用到什么Field等等。
Parameters里的每一个parameter对应着RuleDesigner里的Field,里面的各个属性也不难理解。
其中有一个__Context很重要。传递工作流运行时的上下文用的。
//其实没什么可解释的,一看就明白的那种。

第五步
,重启IIS.OK

现在用SPD在站点上创建工作流的时候就可以用到我们自己定制的Activity.(Activity一样是可以调试的,附加到正确的w3wp里就可以了)



完整项目下载

posted on 2008-05-08 11:34  EricWang  阅读(1082)  评论(6编辑  收藏  举报