2009-06-18 80 views
2

全部 -SharePoint/WSS:修改「由...創建」字段?

我正在使用WSS 3.0。目前,HR會將員工的內部公司簡歷上載到我們網站的文檔庫中,但出於隱私的原因,我們必須限制訪問該文檔庫,這會迫使用戶每次想要更新簡歷時都要通過HR。

我的想法是創建一個啓用附件的列表,允許用戶只查看/編輯他們自己的項目,然後授予HR權限來管理所有條目。這適用於HR需要創建初始列表項目並附加簡歷的例外情況,這意味着列表項目將由「{hr}創建」,並且不會被附有簡歷的最終用戶看到/編輯。

關於我如何允許HR在上傳中修改「創建者」字段的任何想法,以便最終用戶可以看到並且可以編輯他們的簡歷,或者以不同的方式進行討論?

謝謝!

回答

7

創建一個文檔庫來保存恢復的。然後授予人力資源部門(SharePoint用戶組)對該庫的「讀/寫所有」權限,讓其他人讀/寫自己的「權限」。基於out-of- box文檔內容類型,然後添加一個字段,該字段包含簡歷涉及的Employee(SPUser字段)到內容類型(以及任何其他需要的字段,即名稱,地址等)。在創建列表項時,請讓HR正確填寫(使所需的字段)

然後,寫必將給您剛剛創建的內容類型itemeventreceiver並覆蓋ItemUpdated事件

的代碼將類似如下:。

public override void ItemUpdated(SPItemEventProperties properties) 
{ 
    SPSecurity.RunWithElevatedPrivileges(delegate 
    { 
    using (SPWeb web = properties.OpenWeb()) 
    { 
     web.AllowUnsafeUpdates = true; 
     var item = web.Lists[properties.ListId].GetItemById(properties.ListItemId); 
     if (item != null) 
     { 
     if (item.Fields.ContainsField("Employee")) 
     { 
      item["Author"] = item["Employee"]; 
      // Author is the internal name of the Created by field, 
      // always use Internal Names! 
      DisableEventFiring(); 
      item.SystemUpdate(); 
      EnableEventFiring(); 
     } 
     } 
    } 
    }); 
} 

您可以使用FeatureReceiver內容類型,像這樣綁定ItemEventReceiver:

SPContentType docCt = web.ContentTypes[new SPContentTypeId("CONTENTYPE ID GOES HERE")]; 
docCt.EventReceivers.Add(SPEventReceiverType.ItemUpdated, "ASSEMBLYNAME, Version=1.0.0.0, Culture=neutral, PublicKeyToken=TOKEN", "FULLY QUALIFIED CLASSNAME"); 
docCt.Update(); 
3

爲什麼不簡單地使用文檔庫的簡歷? (而不是附帶附件的列表)。您可以讓HR對其中的所有文檔進行完整讀寫,並且簡歷的所有者將僅爲其自己的簡歷提供權限。

+0

賈森,肯定會工作,但問題仍然是如何告訴SP誰擁有簡歷,如果人力資源總是第一個上傳它? (我們不能指望用戶自己添加最初的簡歷,但我們希望他們能夠保持他們前進。) 在這種情況下,SP將承擔人力資源是所有簡歷的主人,而不是個人用戶。因此,我相信我仍然需要一種方法來修改「創建者」字段或其他創意解決方法... – Mark 2009-06-18 18:36:31

+0

您可以隱藏「創建者」字段,並添加您自己的「人員和組」列,名稱類似「簡歷所有者」或類似的東西。人力資源部門只需簡單地將簡歷與業主姓名貼在一起即可。 – 2009-06-18 19:53:29

+0

傑森 - 也許我錯過了什麼......?我意識到我可以隱藏創建者字段並創建我自己的自定義字段,但據我所知,我無法根據自定義列分配權限(例如,創建新的「人員和組」列,然後一個關聯權限,表示員工只能查看/編輯'登錄名=自定義列名'的項目)。假設我不能分配這些權限,那麼我仍然卡住......我無法讓用戶*只查看/編輯他們的簡歷。請說明我是否漏掉了明顯的東西! – Mark 2009-06-18 20:34:51

0

使用自定義上傳屏幕,您可以在上傳前更改當前用戶的上下文。它需要使用類似下面的內容來查找用戶令牌(這些是工作代碼的片段,其中包含錯誤處理和其他內容)。請注意,EnsureUser將要求當前用戶基本上是管理員/所有者。

using (SPSite site = GetImpersonatedSite(runAsUser)) 
{ 
    using (SPWeb web = site.OpenWeb()) 
    { 
     // Do stuff here 
    } 
} 

private SPSite GetImpersonatedSite(string username) 
{ 
    user = SPContext.Current.Web.EnsureUser(username); 
    SPSite site = new SPSite(SPContext.Current.Web.Url, user.UserToken); 
    return site; 
} 
-1

我有,我必須添加一個文件admin用戶的文檔庫,然後「變」的網友有類似的情況(遷移到SharePoint)。我做了這個樣子,可能會幫助你有點:

using (var root = site.RootWeb) 
{ 
    var users = root.SiteUsers; 
    var user = users["domain\username"]; 
    file.Item[SPBuiltInFieldId.Created_x0020_By] = user.ID; 
    file.Item[SPBuiltInFieldId.Modified_x0020_By] = user.ID; 
    file.Item.UpdateOverwriteVersion(); 
2

我找到了一種方法來改變使用SharePoint Designer創建工作流的創建領域。

  1. 在列表中創建一個帶有易於辨認名稱的虛擬字段,例如, XYZZY。讓它成爲「人或團體」領域。
  2. 在SharePoint Designer中,爲您的列表創建工作流程。創建新項目時,允許手動啓動並自動啓動。
  3. 操作 - >設置場當前項目 - >設置XYZZY到列表中包含要投入到創建用戶帳戶的領域。
  4. 單擊Finish
  5. 現在,打開您的工作流程.xoml用記事本文件。將「XYZZY」替換爲「作者」。保存.xoml文件。
  6. 在Designer中打開工作流程。單擊完成,以便使用新代碼重新處理。
  7. 從列表中刪除虛擬字段。
  8. 在列表中的每個現有項目上運行工作流程。新項目將自動自動更正。