Monday, March 5, 2012

Part 1: Create Custom Field Type Using Visual Studio 2010


1.       Mở VS 2010 chọn File | New Project | Visual C# | SharePoint | 2010 | Empty SharePoint Project đặt tên CustomFieldType
2.       Hộp thoại SharePoint Customization xuất hiện chọn radio Deploy as a farm solution (không chọn Deploy as a sandboxed solution vì không hỗ trợ)
3.       Click phải vào Project trong Solution chọn Properties, trong tab Application: phần Assembly name bạn nhập Email.SharePoint.Field_Type , phần Default namespace bạn nhập Email.SharePoint, các thuộc tinh khác để mặc định.
4.       Chọn Save và đóng lại
5.       Click phải vào Project trong Solution chọn Add | New Item |Visual C# | Class đặt tên EmailField.cs
6.       Click phải vào Project trong Solution chọn Add | New Item |Visual C# | Class đặt tên EmailFieldControl.cs
7.       Click phải vào Project trong Solution chọn Add | New Item |Visual C# | Class đặt tên EmailValidationRule.cs
8.       Click phải vào Project trong Solution chọn Add | SharePoint Mapped Folder
9.       Hộp thoại xuất hiện bạn chọn TEMPLATE\Control và chọn OK
10.   Click phải thư mục ControlTemplates vừa mới Map chọn Add | New Item | Visual C# | SharePoint | 2010 | User Control đặt tên là EmailControl.ascx (thay vì bạn copy File này vào thư mục ProgramFiles\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\ControlTemplates và Đăng ký vào GAC)
11.   Xoá tập tin EmailFieldControl.ascx.cs
12.   Click phải vào Project trong Solution chọn Add | SharePoint Mapped Folder
13.   Hộp thoại xuất hiện bạn chọn TEMPLATE\XML và chọn OK
14.   Click phải thư mục XML vưa mới Map vừa mới Map chọn Add | New Item | Visual C# | XML File đặt tên Fldtypes_EmailField.xml
15.   Click phải vào Project trong Solution chọn Add | SharePoint Mapped Folder
16.   Hộp thoại xuất hiện bạn chọn TEMPLATE\LAYOUTS\XSL và chọn OK
17.   Click phải thư mục XSL vưa mới Map vừa mới Map chọn Add | New Item | Visual C# | XSLT File đặt tên fldtypes_EmailField.xslt
18.   Click phải vào node Reference trong Solution chọn Add Reference và chọn PresentationFramework.dll trong tab .Net và chọn OK
19.   Mở EmailValidationRule.cs và Using thêm thư viện sau
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Web;
using System.Web.UI;
using Microsoft.SharePoint;
using System.Text.RegularExpressions;
using System.Globalization;
using System.Web.UI.WebControls;
using System.Web.SessionState;
using System.Windows.Controls;
using System;

20.   Thay thế code
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Web;
using System.Web.UI;
using Microsoft.SharePoint;
using System.Text.RegularExpressions;
using System.Globalization;
using System.Web.UI.WebControls;
using System.Web.SessionState;
using System.Windows.Controls;
using System;

namespace Email.SharePoint
{
    public class EmailValidationRule : ValidationRule
    {
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            String Email = (String)value;
            bool result = isEmailID(Email);
            if (result != true)
            {
                return new ValidationResult(false"Enter valid Email.");
            }
            else
            {
                return new ValidationResult(true"Email Entered is correct.");
            }
        }
        public static bool isEmailID(string inputEmail)
        {
            string strRegex = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
                  @"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" +
                  @".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";
            Regex re = new Regex(strRegex);
            if (re.IsMatch(inputEmail))
                return (true);
            else
                return (false);
        }
    }
}


21.   Mở EmailField.cs và Using thêm thư viện sau


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.Security;
using System.Windows.Controls;
using System.Globalization;
using System.Runtime.InteropServices;
using System.Security.Permissions;
using System.IO;
using System.Web;
using System.Web.UI;

22.   Thay thế code (bạn thấy có lỗi ở new EmailFieldControl() bạn bỏ qua nhé và tiếp tục làm theo hướng dẫn)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.Security;
using System.Windows.Controls;
using System.Globalization;
using System.Runtime.InteropServices;
using System.Security.Permissions;
using System.IO;
using System.Web;
using System.Web.UI;

namespace Email.SharePoint
{
    public class EmailField : SPFieldText
    {
        public EmailField(SPFieldCollection fields, string fieldName)
            : base(fields, fieldName)
        {
        }
        public EmailField(SPFieldCollection fields, string typeName, string displayName)
            : base(fields, typeName, displayName)
        {
        }
        public override BaseFieldControl FieldRenderingControl
        {
            [SharePointPermission(SecurityAction.LinkDemand, ObjectModel = true)]
            get
            {
                BaseFieldControl fieldControl = new EmailFieldControl();
                fieldControl.FieldName = this.InternalName;
                return fieldControl;
            }
        }
        public override string GetValidatedString(object value)
        {
            if ((this.Required == true) && ((value == null) || ((String)value == "")))
            {
                throw new SPFieldValidationException(this.Title + " must have a value.");
            }
            else
            {
                EmailValidationRule rule = new EmailValidationRule();
                ValidationResult result = rule.Validate(value, CultureInfo.InvariantCulture);
                if (!result.IsValid)
                {
                    throw new SPFieldValidationException((String)result.ErrorContent);
                }
                else
                {
                    return base.GetValidatedString(value);
                }
            }
        }
    }
}



23.   Mở EmailFieldControl.cs và Using thêm thư viện sau

using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Runtime.InteropServices;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;

24.   Thay thế code

using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Runtime.InteropServices;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;

namespace Email.SharePoint
{
    public class EmailFieldControl : TextField
    {
        protected Label EmailPrefix;
        protected Label EmailValueForDisplay;
        protected override string DefaultTemplateName
        {
            get
            {
                if (this.ControlMode == SPControlMode.Display)
                {
                    return this.DisplayTemplateName;
                }
                else
                {
                    return "EmailFieldControl";
                }
            }
        }
        public override string DisplayTemplateName
        {
            get
            {
                return "EmailFieldControlForDisplay";
            }
            set
            {
                base.DisplayTemplateName = value;
            }
        }
        protected override void CreateChildControls()
        {
            if (this.Field != null)
            {
                base.CreateChildControls();
                //   this.EmailPrefix = (Label)TemplateContainer.FindControl("EmailPrefix");
                this.textBox = (TextBox)TemplateContainer.FindControl("TextField");
                this.EmailValueForDisplay = (Label)TemplateContainer.FindControl("EmailValueForDisplay");
            }
            if (this.ControlMode != SPControlMode.Display)
            {
                if (!this.Page.IsPostBack)
                {
                    if (this.ControlMode == SPControlMode.New)
                    {
                        textBox.Text = "";
                    }
                }
            }
           else
            {
                EmailValueForDisplay.Text = (string)this.ItemFieldValue;
            }
        }
        public override object Value
        {
            get
            {
                EnsureChildControls();
                return base.Value;
            }
            set
            {
                EnsureChildControls();
                base.Value = (string)value;
            }
        }
    }
}


25.   Mở tập tin EmailFieldControl.ascx thêm đoạn code này vào
<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %>
<%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Register Tagprefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Control Language="C#"%>
<SharePoint:RenderingTemplate ID="EmailFieldControl" runat="server">
  <Template>
    <table>
    <tr>
    <td >
    <asp:Label ID="EmailPrefix"  runat="server" />
    </td>
     <td>
   <asp:TextBox id="TextField" runat="server" Width="50%" ></asp:TextBox>
   </td>
     </tr>
     <tr>
   </tr>
   </table>
  </Template>
</SharePoint:RenderingTemplate>
<SharePoint:RenderingTemplate ID="EmailFieldControlForDisplay" runat="server">
  <Template>
    <asp:Label ID="EmailValueForDisplay" runat="server" />
  </Template>
</SharePoint:RenderingTemplate>

26.   Mở tập tin FldtypesEmailField.xml  thêm đoạn code này vào
<?xml version="1.0" encoding="utf-8" ?>
<FieldTypes>
  <FieldType>
    <Field Name="TypeName">Email</Field>
    <Field Name="ParentType">Text</Field>
    <Field Name="TypeDisplayName">Email</Field>
    <Field Name="TypeShortDescription">Email Validation Text</Field>
    <Field Name="UserCreatable">TRUE</Field>
    <Field Name="ShowOnListCreate">TRUE</Field>
    <Field Name="ShowOnSurveyCreate">TRUE</Field>
    <Field Name="ShowOnDocumentLibraryCreate">TRUE</Field>
    <Field Name="ShowOnColumnTemplateCreate">TRUE</Field>
    <Field Name="FieldTypeClass">Email.SharePoint.EmailField,$SharePoint.Project.AssemblyFullName$</Field>
  </FieldType>
</FieldTypes>

27.   Mở tập tin fldtypesEmailField.xslt  thêm đoạn code này vào

<xsl:stylesheet xmlns:x="http://www.w3.org/2001/XMLSchema"
                xmlns:d="http://schemas.microsoft.com/sharepoint/dsp"
                version="1.0"
                exclude-result-prefixes="xsl msxsl ddwrt"
                xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime"
                xmlns:asp="http://schemas.microsoft.com/ASPNET/20"
                xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                xmlns:SharePoint="Microsoft.SharePoint.WebControls"
                xmlns:ddwrt2="urn:frontpage:internal">
  <xsl:template match="FieldRef[@Name = 'Email']" mode="Text_body">
    <xsl:param name="thisNode" select="." />
    <span style="background-color:lightgreen;font-weight:bold">
      <xsl:value-of select="$thisNode/@*[name()=current()/@Name]" />
    </span>
  </xsl:template >
</xsl:stylesheet>

28.   Reset IIS bằng cách nhẩn tổ hợp phím windows + r và gõ iisreset
29.   Mở sharepoint site | Site Actions | Site Setting
30.   Trong mục Site Administration | Site libraries and lists
31.   Chọn Create new content
32.   Chọn mục List | Custom List | điền tên TestMail nhấn Create
33.   Sau khi tạo List bạn tạo column bằng cách nhấn ICon create column
34.   Hộp thoại tạo column xuất hiện bạn thấy Field kiểu Email Validation Text xuất hiện
35.   Sau khi tạo xong Field bạn test thử tạo mới item bạn nhâp Email : quochung thấy báo lỗi
36.   Bạn nhập quochung@gmail.com và thấy kết quả như sau.
37.   Như vậy bạn đã tạo thành công Custom Field trong VS 2010 rồi nhé.

0 comments:

Post a Comment