コンバータの設定の追加コントロール
最終更新日: 2010年3月8日
適用対象: SharePoint Server 2010
ユーザー設定のドキュメント コンバーターを作成する必要がある場合、Microsoft SharePoint Server 2010 ドキュメントの既定の構成設定ページに表示されるオプションより多くの情報を管理者から収集する必要が生じることもあります。この情報を収集するため、既存のコンバーター ページ上にホストするカスタム .ascx コントロールを指定できます。
構成設定のカスタム コントロールを指定するには、ドキュメント コンバータ定義の ConverterSpecificSettingsUI 要素を、使用する .ascx コントロールのファイル名に設定します。これは省略可能な要素です。コンバータ構成設定ページは、コントロールをホストする ConverterSettingsForContentType 要素で指定する必要があります。
ドキュメント コンバータ定義の詳細については、「ドキュメント コンバータ定義スキーマ」を参照してください。
指定する構成設定ページには、次の例で示すように、IDocumentConverterControl インターフェイスを実装するコードを含める必要があります。
さらに、コントロールが返す文字列は、XML ノードとして有効であることが必要です。
public class XslApplicatorSettingsControl : UserControl,
IDocumentConverterControl
{
/// <summary>
/// XSLT asset selector control
/// </summary>
public AssetUrlSelector assetSelectedXsl;
/// <summary>
/// Validator to make sure user picks XSLT
/// </summary>
public FileExtensionValidator fileExtensionValidator;
/// <summary>
/// Input form section, used only to get the display title of the
section.
/// </summary>
public InputFormSection inputSection;
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
this.fileExtensionValidator.ControlToValidate =
this.assetSelectedXsl.ID;
}
private const string ConverterSettingsXmlName =
"XslApplicatorConverterSettings";
/// <summary>
/// Property that is the interface to the outer world - get/set a
string
that persists the settings
/// </summary>
public string ConverterSettings
{
get
{
StringBuilder sb = new StringBuilder("<", 256);
sb.Append(ConverterSettingsXmlName);
sb.Append(" Version=\"1\" >");
sb.Append("<FilePlaceHolder Url=\");
sb.Append(this.assetSelectedXsl.AssetUrl);
sb.Append("\">");
sb.Append("</FilePlaceHolder>");
sb.Append("</");
sb.Append(ConverterSettingsXmlName);
sb.Append(">");
return sb.ToString();
}
set
{
if (!String.IsNullOrEmpty(value))
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(value);
RcaUtilities.FilePlaceHolderElementName;
XmlNodeList cl = xmlDoc.SelectNodes("//FilePlaceHolder");
if (cl.Count > 0)
{
XmlNode node = cl[0];
XmlAttribute attribute = node.Attributes["Url"];
string fileUrl = String.Empty;
if (attribute != null && attribute.Value != null)
{
fileUrl = attribute.Value;
}
this.assetSelectedXsl.AssetUrl = fileUrl;
}
}
}
}
/// <summary>
/// Implement setter to fulfill the interface
/// </summary>
public SPContentType ContentType
{
set
{
}
get
{
return null;
}
}
/// <summary>
/// This control always requires configuration
/// </summary>
public bool RequiresConfiguration
{
get
{
return true;
}
}
/// <summary>
/// Display title, used to direct user to this section in the page in
case of validation errors
/// </summary>
public string SectionDisplayTitle
{
get
{
return this.inputSection.Title;
}
}
Public Class XslApplicatorSettingsControl
Inherits UserControl
Implements IDocumentConverterControl
''' <summary>
''' XSLT asset selector control
''' </summary>
Public assetSelectedXsl As AssetUrlSelector
''' <summary>
''' Validator to make sure user picks XSLT
''' </summary>
Public fileExtensionValidator As FileExtensionValidator
''' <summary>
''' Input form section, used only to get the display title of the
''' section.
''' </summary>
Public inputSection As InputFormSection
Protected Overrides Sub OnLoad(ByVal e As EventArgs)
MyBase.OnLoad(e)
Me.fileExtensionValidator.ControlToValidate = Me.assetSelectedXsl.ID
End Sub
Private Const ConverterSettingsXmlName As String = "XslApplicatorConverterSettings"
''' <summary>
''' Property that is the interface to the outer world - get/set a
''' string
''' that persists the settings
''' </summary>
Public Property ConverterSettings() As String
Get
Dim sb As New StringBuilder("<", 256)
sb.Append(ConverterSettingsXmlName)
sb.Append(" Version=""1"" >")
sb.Append("<FilePlaceHolder Url=\")
sb.Append(Me.assetSelectedXsl.AssetUrl)
sb.Append(""">")
sb.Append("</FilePlaceHolder>")
sb.Append("</")
sb.Append(ConverterSettingsXmlName)
sb.Append(">")
Return sb.ToString()
End Get
Set(ByVal value As String)
If Not String.IsNullOrEmpty(value) Then
Dim xmlDoc As New XmlDocument()
xmlDoc.LoadXml(value)
RcaUtilities.FilePlaceHolderElementName
Dim cl As XmlNodeList = xmlDoc.SelectNodes("//FilePlaceHolder")
If cl.Count > 0 Then
Dim node As XmlNode = cl(0)
Dim attribute As XmlAttribute = node.Attributes("Url")
Dim fileUrl As String = String.Empty
If attribute IsNot Nothing AndAlso attribute.Value IsNot Nothing Then
fileUrl = attribute.Value
End If
Me.assetSelectedXsl.AssetUrl = fileUrl
End If
End If
End Set
End Property
''' <summary>
''' Implement setter to fulfill the interface
''' </summary>
Public Property ContentType() As SPContentType
Set(ByVal value As SPContentType)
End Set
Get
Return Nothing
End Get
End Property
''' <summary>
''' This control always requires configuration
''' </summary>
Public ReadOnly Property RequiresConfiguration() As Boolean
Get
Return True
End Get
End Property
''' <summary>
''' Display title, used to direct user to this section in the page in
''' case of validation errors
''' </summary>
Public ReadOnly Property SectionDisplayTitle() As String
Get
Return Me.inputSection.Title
End Get
End Property
外部ファイルの設定
ユーザーがファイルを参照できるようにする .ascx コントロールには、特別に注意する点があります。コンバーターはそれ自身のプロセス内で実行されるので、サーバー上のファイルにアクセスできません。このため、すべてのファイルの内容が、コンバーターに渡される構成情報の中に読み込まれる必要があります。ドキュメント コンバーターのインフラストラクチャには、コンバーターが呼び出されたときに、ファイルへの参照によって、実際にファイルの内容を構成設定情報の中に取り込むメカニズムが含まれています。
ファイルの内容を構成設定情報の中に読み込むには、構成設定の XML に FilePlaceholder 要素を追加します。この要素には、Url という属性が 1 つあり、この属性が、コンバータに渡す構成設定情報に内容を読み込もうとしているファイルの URL を表します。
次に例を示します。
<FilePlaceHolder Url="myUrlHere"><\FilePlaceHolder>
ドキュメントの変換が開始されると、ドキュメント変換のインフラストラクチャは構成設定内にある FilePlaceHolder 要素ごとに、以下のことを行います。
URL を解決します。
指定されたファイルを開きます。
ファイルの内容を base64 エンコードでエンコードし、エンコードされた内容を FilePlaceHolder 要素のノードに配置します。
コンバータは、構成設定を受け取ったら、ファイルの内容を変換する必要があります。そのためには、コンバータは FilePlaceHolder ノードにアクセスし、その内容を変換する必要があります。たとえば、次のように指定します。
byte[] fileContent = System.Convert.FromBase64String(node.InnerXml);
Dim fileContent() As Byte = System.Convert.FromBase64String(node.InnerXml)
コンバータに渡される構成設定の XML の詳細については、「ドキュメントからページへのコンバーターの構成設定スキーマ」を参照してください。