SharePoint Service Accounts and Term Store Management for end users

SharePoint Service Accounts

1. CA –> Security –> Configure Service Accounts

2. User Profile Synchronization Service Account need permission to User Profile Service; otherwise, UPS sync won’t work properly.

Term Store Management for end users

1. To allow end users manage Term Store through UI, they need to be the contributor of the target Term Group.

2. Also, the sharepoint site related Application Pool ID need Full Access permission to Managed Metadata Service.

SharePoint开发中可能用到的各种Context

一、HttpContext

SharePoint运行在标准的ASP.NET框架下,所以这个对象的使用和ASP.NET没有任何区别。

二、SPContext

从名字就可以看出来,这个是SharePoint自己的上下文对象,它除了封装了HttpContext之外,提供了很多和SharePoint相关的上下文信息。

SPContext 包含一个我们最经常使用的静态属性:SPContext.Current,用于获取当前的上下文信息(和HttpContext.Current类似,如 果程序是运行在Web上的,就可以使用这个)。我见过不少初学SharePoint开发的人,在写WebPart的时候,还在使用new SPSite的方式来获取当前网站集,这即没有必要,也是对服务器资源的浪费(SPSite、SPWeb对象都包含非托管资源,而Current中的 Site和Web是被SharePoint自己的运行时环境所管理的,可以快速取用)。

下面看一下这个SPContext中包含哪些常用的属性,可以在开发过程中使用(有些属性其实内部逻辑很复杂,这里简要介绍一些基本场景):

属性 说明
Site SPSite类型,次常用到的属性,当前的网站集
Web SPWeb类型,最常用到的属性,当前的网站。
很多程序都是用SPContext.Current.Web来开头的……
List / ListId SPList / Guid类型,当前列表。
不论你是在列表的视图页面上、表单页面上还是设置页面上,都可以通过这个属性取得当前的列表。其实只要Url查询里面有一个有效的List参数,参数的值是列表的Guid就可以。
ListItem / ItemId SPListItem / Int32类型,当前的列表条目。
一般用于列表的查看和编辑表单(当然新建表单其实也可以,只不过没有ID),或者用于获取存放在页面库里的当前页面对应的条目。此外,如果当前的List属性有效的话,只要Url查询里面有一个有效的ID参数,就可以使用这个属性得到对应条目。
ListItemVersion SPListItemVersion类型,当前列表条目对应的版本。
如果是从历史版本查看页面中,查看某个版本的条目时,在那个查看页面,可以用这个属性直接取到相应的版本。
ListItemDisplayName /
ListItemServerRelativeUrl
string / string类型,当前条目的显示名称(如果是普通列表,就是Title字段的值;如果是文档库,就是不带扩展名的文件名;或者是文件夹名称),以及Url。
File SPFile类型,如果当前条目是一个文件的话,这个属性可以直接得到文件对象。
相当于SPContext.Current.ListItem.File
RootFolderUrl string类型,当前视图对应的Url地址。
如果当前列表视图是处于列表的某个子文件夹中,可以通过这个属性得到这个文件夹的地址;否则的话,就是当前列表的根文件夹地址。
IsPopUI Boolean类型,判断当前页面是否在对话框中。
仅限SharePoint 2010那种对话框,不包括浏览器的那种模态对话框。
FormContext SPFormContext类型,当前列表表单上下文(用于列表表单页面)
一般可以使用这么几个属性:
FormMode:表单类型,New / Edit / Display
FieldControlCollection:表单上字段控件的集合
ViewContext SPViewContext类型,当前视图上下文(用于ListView页面)
一般可以使用这么几个属性:
View:SPView对象,当前的视图
ViewId:视图的Guid
ContextPageInfo SPContextPageInfo类型,当前页面上下文(用于页面库中的页面)
一般可以使用这么几个属性:
ListId:页面所在文档库的Id
ItemId:当前页面作为列表条目的Id
BasePermissions:当前用户对当前页面的权限
IsWebWelcomePage:当前页面是否是网站的首页

三、JavaScript中的“ctx”

这个在微软的SDK里面是没有提及到的,在所有包含ListView的Web Part Page上,每个ListView都会对应一个ctx[***]的JavaScript变量,后面那个[***]是一个数字,这个数字 也是这个变量的ctxId属性。这些ctx变量都放在一个全局JavaScript变量g_ctxDict这个对象中,其key就是变量名字符 串,value就是这个变量,因此遍历这个全局变量,就能通过JavaScript找到当前页面中的所有视图。

ctx变量名义上是一个叫ContextInfo的JavaScript“类”,它包含非常丰富的属性,常用的一些如下:

属性 说明
ctxId 一 个标识此变量的数字,比如185,那么这个变量就是ctx185。使用的时候可以用ctx185或者g_ctxDict[‘ctx185’]来找到这个变 量(某些情况下有种更简便的方法,后面再说)。需要注意的是,每次刷新页面的时候,这个标识可能是会变的,具体原理我暂时木有去深究。
listBaseType 列表的基础类型,相当于SPList的BaseType属性
listTemplate 列表的模版Id(比如文档库是101、通知是104),相当于SPList的BaseTemplate属性
listName 列表的Id,不要被变量名混淆了
view 列表视图的Id
listUrlDir 列表的根路径,相当于spList.RootFolder.ServerRelativeUrl
HttpRoot 当前网站的根路径(绝对路径)
SiteTitle 当前网站的标题
ListTitle 列表的标题(这个才是标题,listName不是)
CurrentUserId 当前用户的Id
wpq[*] 渲染视图那个WebPart的ID,比如WPQ2
ListData[*] 这个就厉害了,这个属性指向一个数组,而这个数组就是当前视图显示的那些列表条目,包含各个字段的值,JSON格式。
ListSchema[*] 列表各个字段的定义(包含字段名称、字段类型等等),JSON格式。
BasePermissions[*] 当前用户对这个列表的基本权限,形如下面这种样子:
{ManageLists: true, ManagePersonalViews: true, OpenItems: true}

后面加[*]的那几个是SharePoint 2013新增的属性。

其实在包含ListView的页面中,还有一个名字就叫“ctx”的变量,它指向这个页面中最后一个ctx[***]变量,因此如果页面中只有一个列表视图的 话,就可以直接使用ctx。比如在某个列表视图页面中,你想看一下这个列表模版的Id是多少,就可以直接在浏览器地址栏里输 入:javascript:alert(ctx.listTemplate) ,嗯。

ctx变量最主要的作用,就是生成列表项的那个下拉菜单(ECB – Edit Control Block),如果你去翻那个corev4.js的话,就可以看到在创建那个下拉菜单的时候,ctx是作为参数传进去的。如果需要自定义列表项菜单的话, 除了使用Feature的方式、或者2010新增的那个通过SPD添加Custom Action的方式,还可以使用从2007时代延续下来的JavaScript方式:在页面中添加Custom_AddListMenuItems方法或者Custom_AddDocLibMenuItems方法(具体使用请自行搜索),而ctx就是这两个方法的参数之一。

除此之外,作为ListView中重要的JavaScript变量,通过在页面中嵌入的一些脚本中使用ctx,还可以完成各种比较邪恶的事情,请大家自行发挥想象。

四、JavaScript中的_spPageContextInfo变量

同样是一个没有文档的JavaScript变量,虽然名字和前面提到的某个服务器端类型差不多,但是这个JavaScript变量里面所包含的内容,要比SPContextPageInfo多很多,它包含如下一些常用属性:

属性 说明
webServerRelativeUrl 网站的相对服务器路径(“/”开头)
currentLanguage 当前网站的语言LCID
webUIVersion 当前网站的UI风格(2010/2013风格是4,如果母板页是2007风格是3)
pageListId 页面库的列表Id
pageItemId 如果当前页面是在页面库中的话,当前页面作为列表条目的Id
webAbsoluteUrl[*] 网站绝对路径(“http://”或者“https://”开头)
siteAbsoluteUrl[*] 网站集绝对路径(“http://”或者“https://”开头)
layoutsUrl[*] layouts的相对服务器路径(2013其实有两个layouts root路径,一个是15,一个是14)
webTitle[*] 网站标题
webPermMasks[*] 当前用户对当前网站的权限,形如:{High:2147483647,Low:4294967295}
(因为JavaScript不支持64位整数,所以把高位和地位拆开了)
siteServerRelativeUrl[*] 网站集的相对服务器路径(“/”开头)

后面加[*]的那几个是SharePoint 2013新增的属性。

_spPageContextInfo变量主要的使用场景,就是在JavaScript中获取当前页面的一些基本信息,尤其在发布页面中,会有比较多的使用价值。

五、其他JavaScript全局变量

页面中其实还有一些全局的JavaScript变量,也可以获取到当前的一些上下文信息:

变量 说明
g_wsaLCID 当前的语言,相当于_spPageContextInfo.currentLanguage
g_wsaSiteTemplateId 当前网站所使用的站点模版,比如“STS#1”表示工作组网站
_spUserId 当前用户的Id,这个JavaScript变量其实是右上角那个欢迎菜单渲染出来的
_spWebPermMasks 当前用户对当前网站的权限,相当于_spPageContextInfo.webPermMasks

Reference: http://www.cnblogs.com/erucy/archive/2012/08/25/2655600.html

Blog content body not searchable

We encounter this issue several times, so I think it’s best to make a note here. 

1. Check the content body source code

if below tag exists, that means the search visibility setting is not correct

<META NAME=”ROBOTS” CONTENT=”NOHTMLINDEX”/>
 
Always index must be checked. 
Image
2. Check Metadata Properties on Central Admin
Make sure the contentBody in Crawled Property is configured correctly.
Include values for this property in the search index must be checked. 

找回RTF字段的“插入链接”按钮

Good to know

Kaneboy's WordPress

在SharePoint 2010中,如果你为列表或文档库添加了一个字段,将字段类型设置为“多行文本”,然后将文本类型设置为“RTF”,就像这样:

image

当添加或编辑列表项时,你就会看到下面这个富文本编辑框。一切看起来都很好,通过这个编辑界面,可以很容易的设置文本的字体、颜色、格式,还可以插入图片、插入链接…等等,插入链接这个操作的按钮在哪里??

image

然后,你会发现,这个富文本编辑框既然没有一个“插入链接”按钮!虽然实际上在富文本中,是支持超链接的,但是却缺少一个插入超链接按钮,这会使得用户的操作变得异常的麻烦。

在页面上,用来展现这个富文本编辑框的操作,是由layouts\2052(或1033,取决于SharePoint的语言版本)文件夹中的FORM.js文件中所包含的JavaScript脚本,来进行的。在FORM.js文件中,有一个名为RTE_ConvertTextAreaToRichEdit的函数,它的作用就是渲染出用户看到的那个富文本编辑器。注意这个函数的第3个参数,fAllowHyperlink,从这个参数的名字你就能看出来,它是用来控制富文本编辑器是否允许超链接的。

image

但是,在List Form页面上,调用RTE_ConvertTextAreaToRichEdit函数来渲染富文本编辑框时,总是会给第3个参数,传入false值。这样就导致了出现的富文本编辑框,没有插入按钮的按钮。

image

知道了导致问题的原因,要解决就容易了,我们只需要让页面上的脚本在调用RTE_ConvertTextAreaToRichEdit函数时,为第3个参数传入true就好了。下面将讲述一个使用Template Control来解决此问题的方法(你也可以用其他不同的解决方案)。

新建一个.ascx文件,给它一个不容易同名的文件名,比如:RichTextFieldWithHyperlink.ascx,让它的内容如下:

<%@ Control Language=”C#” AutoEventWireup=”false” %>
<%@ Assembly Name=”Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c” %>
<%@ Register TagPrefix=”SharePoint” Assembly=”Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c” Namespace=”Microsoft.SharePoint.WebControls” %>
<%@ Register TagPrefix=”ApplicationPages” Assembly=”Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c” Namespace=”Microsoft.SharePoint.ApplicationPages.WebControls” %>
<%@ Register TagPrefix=”SPHttpUtility” Assembly=”Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c” Namespace=”Microsoft.SharePoint.Utilities” %>
<%@ Register TagPrefix=”wssuc” TagName=”ToolBar” Src=”~/_controltemplates/ToolBar.ascx” %>
<%@ Register TagPrefix=”wssuc” TagName=”ToolBarButton” Src=”~/_controltemplates/ToolBarButton.ascx” %>

<SharePoint:RenderingTemplate ID=”RichTextField” runat=”server”>
<Template>
<span dir=”<%$Resources:wss,multipages_direction_dir_value%>” runat=”server”>
<asp:TextBox id=”TextField” TextMode=”MultiLine” runat=”server”/>
<input id=”TextField_spSave” type=”HIDDEN” name=”TextField_spSave” runat=”server”/>
</span>
<script type=”text/javascript”>

            if (typeof RTE_ConvertTextAreaToRichEdit !== “undefined”) {
if (typeof RTE_ConvertTextAreaToRichEdit.hooked === “undefined”) {
var RTE_ConvertTextAreaToRichEdit2 = RTE_ConvertTextAreaToRichEdit;
var RTE_ConvertTextAreaToRichEdit = function (
strBaseElementID,
fRestrictedMode,
fAllowHyperlink,
strDirection,
strWebLocale,
fSimpleTextOnly,
fEditable,
fUseDynamicHeightSizing,
iMaxHeightSize,
iMinHeightSize,
strMode,
urlWebRoot,
strThemeUrl,
strBodyClassName,
fAllowRelativeLinks,
strBaseUrl,
fUseDynamicWidthSizing,
iMaxWidthSize,
iMinWidthSize,
fEnforceAccessibilityMode,
fPreserveScript,
fHookUpEvents,
fGenerateToolbar
) {
window.console && console.log(“RTE_ConvertTextAreaToRichEdit is called.”);
RTE_ConvertTextAreaToRichEdit2(
strBaseElementID,
fRestrictedMode,
true,
strDirection,
strWebLocale,
fSimpleTextOnly,
fEditable,
fUseDynamicHeightSizing,
iMaxHeightSize,
iMinHeightSize,
strMode,
urlWebRoot,
strThemeUrl,
strBodyClassName,
fAllowRelativeLinks,
strBaseUrl,
fUseDynamicWidthSizing,

View original post 25 more words

SharePoint Feature and Solution Example

Feature.xml

<?xml version="1.0" encoding="utf-8"?>
<Feature xmlns="http://schemas.microsoft.com/sharepoint/"
    Description="Adds a link to Site Actions"
    Hidden="FALSE"
    Id="1234364565758769879" /* GUID */
    ImageUrl=""
    Scope="Site" /* Farm, WebApplication, Site(Site Collection), Web */
    Title="Central Admin Link">
    <ElementManifests>
       <ElementManifest Location="Elements.xml" />
    </ElementManifests>
</Feature>

Element.xml

<?xml version="1.0" encoding="utf-8"?>
<Elements xmls="http://schemas.microsoft.com/sharepoint/">
     <CustomAction Id=""  /* GUID */
         Description="Open Central Admin"
         Location="Microsoft.SharePoint.StandardMenu"
         GroupId="SiteActions"
         ImageUrl=""
         Sequence="50"
         Title="Central Admin Link">
        <UrlAction Url="http://centraladmin:25550" />
     </CustomAction>
</Elements>

Install Feature Command:
stsadm -o installfeature -name <feature folder>

Deploy Solution Command:
stsadm -o AddSolution -filename <.wsp file>
stsadm -o DeploySolution -filename <.wsp file>

Add new site pages by feature

ReceiverAssembly 
ReceiverClass 
/* Module is element you would use to deploy anything into the content database in this feature */ <Elements> 
    <Module Path="OriginalFolder" Url="NewFolder"> 
       <File Path="Original.aspx" Url="NewPage1.aspx" NavBarPage ......
          <NavBarPage ID="" Name="" Position="" /> 
       </File> 
       <File Path="Original.aspx" Url="NewPage2.aspx" /> /* Copy to a new page name */ 
       /* Add web part to page by Feature */        
       <AllUsersWebPart WebPartZoneId="Left" WebPartOrder="0"> 
          <![CDATA[ 
              <WebPart xmlns="http://schemas.microsoft.com/WebPart/v2" 
                   xmlns:cewp="http://schemas.microsoft.com/WebPart/v2/ContentEditor"> 
                   <Assembly>Microsoft.SharePonint, Version=12.0.0.0, Culture=neutral, PublicKey.... 
                   <TypeName>Microsoft.SharePont.WebPartPages.ContentEditorWebPart</TypeName> 
                   <Title>WebPart in the left zone</Title> 
                   <FrameType>TitleBarOnly</FrameType> 
                   <cewp:Content> Webpart added using CAML </cewp:Content> 
             </WebPart>  
          ]]> 
       </AllUsersWebPart> 
    </Module> 
</Elements> 

/* Add web part to page by C# */
/* This feature is deployed to Web (site) level. */
SPWeb web = properties.Feature.Parent as SPWeb; 
if(web!=null) 
{ 
SPFile page = web.GetFile("MyPages/WPPage.aspx"); 
SPLimitedWebPartManager mgr = page.GetLimitedWebPartManager(PersonalizationScope.Shared); 
ContentEditorWebPart ceWP = new ContentEditorWebPart(); 
ceWP.Title = "WebPart in right zone"; 
XmlDocument doc = new XmlDocument(); 
XmlElement ceWPContent = doc.CreateElement("Content"); 
ceWPContent.InnerText = "WebPart added using c#"; 
ceWP.Content = ceWPContent; mgr.AddWebPart(ceWP, "Right", 0); 
}

Change Master Page through Site Setting

SharePoint 2010 Change Master Page

Prerequisite:

(1)Make sure ‘SharePoint Server Publishing Infrastructure’ feature is activated

Site Actions -> Site Settings -> Site Collection Administration -> Site Collection Features

(2) Make sure ‘SharePoint Server Publishing’ feature is activated

Site Actions -> Site Settings -> Site Actions -> Manage Site Features

Steps:

(1) Proceed to master page option under look and feel

(2) Make the changes