none
カスタマイズしたワークフロータスクフォームの指定方法 RRS feed

  • 質問

  • よろしくお願いします。

     

    現在SharePoint2007とASP.NET(aspx)でワークフローフォームの作成をしています。

    作成したフォームは

    ・初期化フォーム

    ・タスクフォーム1

    ・タスクフォーム2

    です。

    タスクフォーム1とタスクフォーム2はレビュー者1、レビュー者2という想定です(1と2は別のタスク)。

     

    初期化フォームは、workflow.xmlのInstantiationURLの指定をすればいいのですが、

    タスクフォームの指定方法がわかりません。

    いろいろ試してみましたが、既存の画面が表示されてしまいます。

     

    松崎さんのブログ(http://blogs.msdn.com/tsmatsuz/archive/2007/07/26/sharepoint-workflow-form.aspx)

    http://msdn.microsoft.com/ja-jp/library/ms550938.aspx

    に少しは書いてあるのですが、具体的な方法がわからずに困っています。

     

     

    ご教授、よろしくお願いいたします。

     

    2008年11月19日 15:02

回答

  • リスト定義で指定する方法では確認できていませんが

    WSSのオブジェクトに直接パスを指定する方法では動作をしたのでその方法を記述します。

     

      SPList taskList = web.Lists["タスク"];
      taskList.ContentTypesEnabled = true;  // コンテンツ タイプの管理を許可する 
      SPContentType parentType = web.AvailableContentTypes["ワークフロー タスク"];
      SPContentType contentType = new SPContentType(parentType, taskList.ContentTypes, "ワークフロー タスク");
      taskList.ContentTypes.Add(contentType);

      contentType.EditFormUrl = "_layouts/test/MyEditTask.aspx";
      contentType.Update();

      taskList.Update();

     

    タスクリストに対して以下の操作を行っています。

     ・コンテンツタイプの管理を許可する。

      (ワークフローで生成したタスクは、"ワークフロー タスク"で"タスク"とはコンテンツタイプが異なるため)

     ・新たに"ワークフロー タスク"を継承したコンテンツタイプを生成して追加する。

     ・追加したコンテンツタイプの変更フォームのパスを変更する。

     

     

    なお、リスト定義で上記を指定するにはおそらく以下のようになると思いますが

    まだうまく動作していません。

     

    ワークフローのタスクを扱う独自のリスト定義

    ----- schema.xml -----

    <?xml version="1.0" encoding="utf-8"?>
    <List Name="MyTasks" Type="107" EnableContentTypes = "TRUE" ...>
          :

        <ContentTypes>
          <ContentType ID="0x010800<guid>" Name="ワークフロー タスク" ...>
            <FieldRefs>

              :
            </FieldRefs>
            <XmlDocuments>
              <FormUrls xmlns="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms/url"
                <Display>Forms/mydisplayform.aspx</Display>
                <Edit>"_layouts/test/MyEditTask.aspx</Edit>  <-- hare !!
                <New>Forms/myuploadform.aspx</New>
              </FormUrls>

    -----

     

    ワークフロー定義

    ----- workflow.xml -----

    <?xml version="1.0" encoding="utf-8" ?>
    <Elements Id="<feature guid>" xmlns="http://schemas.microsoft.com/sharepoint/">
      <Workflow
         Name="TestWorkflow"
         Description="My SharePoint Workflow"
         Id="<workflow guid>"
         CodeBesideClass="SimpleWorkflow.GeneralWorkflow"
         CodeBesideAssembly="TestWorkflow, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xxx"
         InstantiationUrl="_layouts/test/StartWorkflow.aspx"
         ModificationUrl="_layouts/ModWrkflIP.aspx">
    -----

     

    上記を動作させるとワークフローを動作させたときに

    ワークフロータスクの名前が重複している旨のエラーが発生してうまく動きません。

    おそらく

    「workflow.xmlにコンテンツタイプの指定がないときは

     ワークフローの中で新規に"ワークフロー タスク"のコンテンツタイプを生成して

     そのコンテンツタイプでタスクを生成するのでは?」

    と推測しています。

    なので、workfow.xmlに

         TaskListContentTypeId="<contenttype>"

    として、リスト定義に記述したコンテンツタイプのIDを指定すれば動作するのではと思っています。

    #時間がぜんぜんなくて試せてないですが… (^^;

     

    上記の情報は、WSS SDKのヘルプ(WSS3sdk.chm)から

    Windows SharePoint Services のワークフロー」>「Windows SharePoint Services のワークフローの開発

    >「ワークフロー フォームの概要

    あたりを参照すると参考になると思います。

    #サンプルのxmlがどのファイルに記述するものなのかわからないなど、あまり親切ではありませんが。

     

    長くなってしまいましたが、以上です。

    2008年11月26日 1:47
  •  

    もう解決したかも知れませんが、ご参考まで。

     

    タスクのフォームはコンテンツタイプで設定します。(編集用と表示用が指定可能です)

     

    1つのフォームしか使用しない場合、ワークフローの定義でコンテンツタイプを指定してCreateTaskでタスクを作成することが多いと思います。

     

    複数のタスクフォームを使い分けるにはタスクの作成にCreateTaskWithContentTypeを使うと綺麗に収まると思います。

     

    2008年11月27日 9:37

すべての返信

  • リスト定義で指定する方法では確認できていませんが

    WSSのオブジェクトに直接パスを指定する方法では動作をしたのでその方法を記述します。

     

      SPList taskList = web.Lists["タスク"];
      taskList.ContentTypesEnabled = true;  // コンテンツ タイプの管理を許可する 
      SPContentType parentType = web.AvailableContentTypes["ワークフロー タスク"];
      SPContentType contentType = new SPContentType(parentType, taskList.ContentTypes, "ワークフロー タスク");
      taskList.ContentTypes.Add(contentType);

      contentType.EditFormUrl = "_layouts/test/MyEditTask.aspx";
      contentType.Update();

      taskList.Update();

     

    タスクリストに対して以下の操作を行っています。

     ・コンテンツタイプの管理を許可する。

      (ワークフローで生成したタスクは、"ワークフロー タスク"で"タスク"とはコンテンツタイプが異なるため)

     ・新たに"ワークフロー タスク"を継承したコンテンツタイプを生成して追加する。

     ・追加したコンテンツタイプの変更フォームのパスを変更する。

     

     

    なお、リスト定義で上記を指定するにはおそらく以下のようになると思いますが

    まだうまく動作していません。

     

    ワークフローのタスクを扱う独自のリスト定義

    ----- schema.xml -----

    <?xml version="1.0" encoding="utf-8"?>
    <List Name="MyTasks" Type="107" EnableContentTypes = "TRUE" ...>
          :

        <ContentTypes>
          <ContentType ID="0x010800<guid>" Name="ワークフロー タスク" ...>
            <FieldRefs>

              :
            </FieldRefs>
            <XmlDocuments>
              <FormUrls xmlns="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms/url"
                <Display>Forms/mydisplayform.aspx</Display>
                <Edit>"_layouts/test/MyEditTask.aspx</Edit>  <-- hare !!
                <New>Forms/myuploadform.aspx</New>
              </FormUrls>

    -----

     

    ワークフロー定義

    ----- workflow.xml -----

    <?xml version="1.0" encoding="utf-8" ?>
    <Elements Id="<feature guid>" xmlns="http://schemas.microsoft.com/sharepoint/">
      <Workflow
         Name="TestWorkflow"
         Description="My SharePoint Workflow"
         Id="<workflow guid>"
         CodeBesideClass="SimpleWorkflow.GeneralWorkflow"
         CodeBesideAssembly="TestWorkflow, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xxx"
         InstantiationUrl="_layouts/test/StartWorkflow.aspx"
         ModificationUrl="_layouts/ModWrkflIP.aspx">
    -----

     

    上記を動作させるとワークフローを動作させたときに

    ワークフロータスクの名前が重複している旨のエラーが発生してうまく動きません。

    おそらく

    「workflow.xmlにコンテンツタイプの指定がないときは

     ワークフローの中で新規に"ワークフロー タスク"のコンテンツタイプを生成して

     そのコンテンツタイプでタスクを生成するのでは?」

    と推測しています。

    なので、workfow.xmlに

         TaskListContentTypeId="<contenttype>"

    として、リスト定義に記述したコンテンツタイプのIDを指定すれば動作するのではと思っています。

    #時間がぜんぜんなくて試せてないですが… (^^;

     

    上記の情報は、WSS SDKのヘルプ(WSS3sdk.chm)から

    Windows SharePoint Services のワークフロー」>「Windows SharePoint Services のワークフローの開発

    >「ワークフロー フォームの概要

    あたりを参照すると参考になると思います。

    #サンプルのxmlがどのファイルに記述するものなのかわからないなど、あまり親切ではありませんが。

     

    長くなってしまいましたが、以上です。

    2008年11月26日 1:47
  •  

    もう解決したかも知れませんが、ご参考まで。

     

    タスクのフォームはコンテンツタイプで設定します。(編集用と表示用が指定可能です)

     

    1つのフォームしか使用しない場合、ワークフローの定義でコンテンツタイプを指定してCreateTaskでタスクを作成することが多いと思います。

     

    複数のタスクフォームを使い分けるにはタスクの作成にCreateTaskWithContentTypeを使うと綺麗に収まると思います。

     

    2008年11月27日 9:37
  • その後の調査で若干状況がわかったので報告します。

     

    リスト定義で指定したタスク変更フォーム画面が表示されない件ですが

    WSSのFormUrlsの動作に不具合があるのではないかと思われます。

     

    以下の方法で動作を確認しました。

    1.リスト定義のschema.xmlに以下のようにFormUrlsを設定して、リストを作成しました。

     

    ----- schema.xml -----

              :

        <ContentTypes>
          <ContentType ID="0x010800<guid>" Name="ワークフロー タスク" ...>
            <FieldRefs>

              :
            </FieldRefs>
            <XmlDocuments>
              <XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms">
                <FormUrls xmlns="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms/url"
                  <Display>Forms/mydisplayform.aspx</Display>
                  <Edit>_layouts/test/MyEditTask.aspx</Edit>
                  <New>Forms/myuploadform.aspx</New>
                </FormUrls>

    -----

     

    2.そのリストのオブジェクトからコンテンツタイプを取得してプロパティを確認しました。

     

      SPList list = web.Lists["タスク"];

      SPContentType type = list.ContentTypes["ワークフロー タスク"];

      System.Diagnostics.Debug.WriteLine(type.EditFormUrl);

      System.Diagnostics.Debug.WriteLine(type.EditFormTemplateName);

     

     

    上記の動作を確認したところ

    本来、URLが設定されてほしいEditFormUrlプロパティには値が設定されておらず

    EditFormTemplateNameプロパティに<Edit>タグの値(_layouts/test/MyEditTask.aspx)が設定されていました。

    そのため、カスタマイズしたタスク変更フォームが表示されないようです。

     

     

    上記の不具合(と思われる動作)に関して、Microsoftから公式な情報が公開されていないか

    ご存じの方はいないでしょうか?

     

    ちなみに動作環境は以下の通りです。

    Windows Server 2003 R2 Standard Edition

    Office SharePoint Server 2007 評価版 SP1(OfficeServerwithSP1.exe)

     

    以上、よろしくお願いします。

    2008年12月1日 5:53
  • 自己フォローです。

     

    リスト定義で指定したタスク変更フォーム画面が表示されない件ですが解決しました。

    <XMLDocument>のNamespaceURLが間違っているのが原因でした。

    正しくは、以下のように"/url"の指定が足りていませんでした。

    NamespaceURI="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms/url"

     

    最終的に、リスト定義でタスク変更フォームを指定するには、以下のような指定になりました。

    ----- schema.xml -----

              :

        <ContentTypes>
          <ContentType ID="0x010800<guid>" Name="ワークフロー タスク" ...>
            <FieldRefs>

              :
            </FieldRefs>
            <XmlDocuments>
              <XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms/url"> <-- here
                <FormUrls xmlns="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms/url"
                  <Display>Forms/mydisplayform.aspx</Display>
                  <Edit>_layouts/test/MyEditTask.aspx</Edit>
                  <New>Forms/myuploadform.aspx</New>
                </FormUrls>

    -----

     

    #WSSを疑ってすみません。もう少し調べてから投稿するべきでした。

    2008年12月1日 8:43
  • こんにちは、フォーラムオペレータ大久保です。

     

    シェアポイント勉強中 さん、ワークフローは完成しましたでしょうか?

    アドバイスを下さったお二方の投稿に「回答済み」チェックをつけさせていただきましたが、躓いたところなどありましたらまた投稿をしてください。

    nakayama.hiroshi さん、Hirofumi HARADA さん、アドバイスありがとうございます!

     

    それでは

    2008年12月11日 1:48
  • お礼が遅くなり申し訳ございません。

     

    nakayama.hiroshiさん、Hirofumi HARADAさん

    回答ありがとうございます。

     

    CreateTaskWithContentTypeとリスト定義で出来ました。

    コンテンツタイプの理解が足りていませんでした。

    コンテンツタイプの階層の指定も今回は必要だったみたいです。

    http://msdn.microsoft.com/ja-jp/library/ms452896.aspx

     

     

    ありがとうございました。

    2008年12月13日 12:39