بسم الله الرحمن الرحیم


ساختن Workflow  یکی از امتیازات مهم شیرپونته که باعث می شه اتوماسیون های پیشرفته و خوبی رو  پیاده سازی کنیم و از هزینه های گزاف این گونه نرم افزارها خلاص بشیم.در این مورد متاسفانه منابع فارسی خوبی رو پیدا نکردم ولی بعد از کلی جستجو یه مقاله خیلی خوب و مفید پیدا کردم که سعی می کنم ترجمه ی قسمت های مهم اش  رو اینجا بذارم تا مورد استفاده قرار بگیره.اصل این مقاله در این ادرس قابل دریافته .
این رو هم اضافه کنم که نویسنده این مقاله آقای سرژ لوکا (Serge Luca ) هستن .
یکی از بزرگترین نوآوری ها  در نسخه های قبلی شیرپوینت (MOSS 2007 و WSS V3) ادغام  Net framework  با Windows Workflow Foundation بود.آخرین نسخه از شیرپوینت Microsoft Sharepoint Server 2010 و   Microsoft Foundation 2010 ، بر اساس .Net framework 3.5  است . بخش  Net framework 3.5 ،  Workflow.   تغییرات زیادی نکرده است و مفاهیم تقریبا همان مفاهیم قبلی هستند . 
در این سری از مقالات، من به صورت گام به گام روش ساختن  Workflow  در شیرپوینت را  با هر دو ابزار  مایکروسافت ویژوال استودیو 2010، share point design 2010 و Visio 2010 توضیح خواهم داد . این پست فقط بخش اصلی ماجرا را پوشش می دهد : ایجاد یک  پروژه، راه اندازی یک  Workflow  و توضیح برخی از مفاهیم اصلی .از آنجایی که این یک آموزش گام به گام است کدی که اینجا می آوریم در پست های بعدی بروز آوری خواهد شد .
برای این آموزش بحث تایید  لیست هزینه را در نظر گرفته ایم .

سناریوی اصلی: در این سناریو اپلیکیشنی تولید می شود که کاربران توسط آن لیست هزینه های خود را به تایید مدیر خود می رسانند . به محض اینکه صورت حساب هزینه ها دیده شود ، گردش کار فعال می شود . گردش کار به صورت زیر است : 
- ایجاد یک شناسه منحصر به فرد برای این گزارش هزینه (GUID)
- چک می کند که آیا صورت حساب نیاز به تایید دارد ؟ : در صورتی که هزینه صورت حساب زیر 1000 باشد وضعیت صورتحساب خود به خود به حالت تایید شده تبدیل می شود و گردش کار پایان می یابد .
- مدیر کاربر مشخص می شود 
- یک task برای مدیر ،  تولید می شود که آیا لیست را تایید می کند یا خیر 
- وضعیت  صورت حساب بروز آوری می شود

قبل از شروع شما به یک سایت شیر پوینت (دقت کنید که تمپلیت انتخابی شما از نوع search نباشد ) و لیست های زیر نیاز دارید :
1- یک لیست با عنوان Expense Reports که شامل ستون های زیر است :

2- یک لیست با عنوان Managersکه شامل ستون های زیر است : 

لیست Managers را توسط اطلاعات موجود پر کنید (مشخص کنید مدیر هر کس چه کسی است ) 

 

حواستان باشد که کاربران انتخاب دسترسی های کافی برای کار با سایت و لیست  را داشته باشند .

ساخت Workflow

 ! توجه داشته باشید که Visual studio 2010 و Sharepoint 2010 می بایست در یک دستگاه نصب شده باشند .

برای شروع Visual Studio 2010 را  استارت کنید  و یک پروژه جدید با تمپلیت Sharepoint 2010 از نوع Empty Sharepoint Project template ایجاد نمایید  عنوان پروژه را Litware.ExpenseReport بگذارید :

در پنجره بعدی آدرس وب سایت خود را وارد کنید و گزینه Deploy as a Farm solution  را انتخاب نمایید . توجه داشته باشید که  Workflow  ساخته شده در Visual Studio نمی تواند در sandbox اجرا شود . 

یک آیتم شیرپوینتی جدید در Sequential Workflow پروژه خود ایجاد نمایید .نامش را ExpenseReportWorkflow بگذارید :

از آنجا که Workflow  برای ایجاد ارتباط میان کاربران از طریق تعیین وظایف  استفاده می شود ، ما معمولا  (اما این اجباری نیست) نیاز به یک لیست وظایف داریم ،من لیست وظایف ساخته شده توسط تمپلیت سایت را در خود شیر پوینت توصیه می کنم .خوب است بدانید اگر هیچ لیست وظایفی در سایت شما تعریف نشده باشد ویژوال استدیو  خطا میدهد :

خیلی نگران این مسئله نباشید ولی آن را در ذهنتان نگه دارید  خب به سراغ مرحله بعدی می رویم 
در پنجره بعدی شما مشخص می کنید که آیا می خواهید گردش کار تعریف شده شما  به لیست آیتم های شیرپوینتی اضافه شود (لیست  Workflow  ) یا نه (به عنوان یک Site Workflow که از گزینه های جدید شیرپوینت 2010 است قرار بگیرد ) از آنجا که صورت حساب های ما در لیست گزارش هزینه های شیرپوینتمان ذخیره می شود گزینه اول را انتخاب می کنیم و روی NEXT کلیک می کنیم 

در پنجره بعدی لیستی را که  Workflow  ما به آن متصل می شود ، انتخاب می کنیم . در این مثال لیست گزارش هزینه ها را انتخاب می کنیم و روی NEXT کلیک می کنیم :

این پنجره این  امکان را می دهد که برخی از پارامتر های انجمنی را تغییر دهیم : وقتی ما یک Workflow را به یک لیست وصل می کنیم (البته بعدا هم  می توانیم آن را به صورت دستی مرتبط کنیم ، این را در آینده  خواهم گفت )، می توانیم مشخص کنیم که  Workflow  به صورت دستی شروع شود یا خود به خود هنگام ایجاد یا تغییر  یک آیتم در لیست اغاز به کار کند .بعدا هم می توانیم این نکته را مشخص کنیمفعلا طبق شکل زیر عمل می کنیم 

Finish را انتخاب می نماییم.با اتمام این عملیات شما باید شکل گرافیکی از Workflow  خود را در    Workflow Disigner پروژه خود ببینید . به صورت زیر :

اولین فعالیت (مرحله ) یکWorkflow شیر پوینتی در ویژوال استودیو می بایست OnWorkflowActivated باشد .حالا بخش Solution Explorer پروژه خود را باز کنید . خواهید دید که یک آیتم جدید از نوع  Workflow  به آیتم های پروژه شما اضافه شده است . کد دات نت  مرتبط با این گردش کار در فایل ExpenseReportWorkflow.cs  ، که درواقع یک کلاس است قابل دسترسی است . ما معمولا این کلاس را  workflow template  می نامیم .

بگذارید کارهایی را که تا کنون انجام داده ایم را به صورت build & deploy  دربیاوریم .به منوی build رفته و گزینه Deploy Solution  را انتخاب نمایید.این کار باعث تولید کدی می شود که workflow template نامیده می شود . نسخه های متعددی از کد این workflow template  می تواند به یک لیست و یا چندین لیست در یک سایت کالکشن مرتبط شود . 

حالا به وب سایت شیرپوینتی خود برگردید . روی Expense Reports  کلیک نمایید تا بخش ریبون لیست آن فعال شود .طبق تصویر زیر  در بخش  list settings  گزینه Workflow Settings  را انتخاب نمایید :

در صفحه مربوط به Workflow Settings تمپلیت های قابل استفاده برای لیست در دسترس هستند . (تمپلیت Workflow که ما ساخته بودیم هم اینجا قابل استفاده است چون در هنگام تنظیم ویژگی های شیرپوینتی اش ان را در محدوده همین سایت کالکشن تعریف کرده بودیم) در این باره بعد ها بیشتر صحبت خواهیم کرد .

در این پنجره شما می توانید Workflow مورد نظر خود را به لیست مربوطه متصل کنید . واضح است که در این مرحله ما فقط یک Workflow  ( که توسط ویزوال استودیو درست کردیم ) خواهیم داشت . با توجه به نام گذاری ای که کرده ایم نام آن Litware.ExpenseReports-ExpenseReportWorkflow خواهد بود . البته شما می توانید با کلیک بر روی Workflow ،  Add a workflow های  دیگری را اضافه نمایید .با بازکردن لیست باز شونده شما می توانید لیست  Workflow ها را ببینید . روی لینک ارتباطی Litware.ExpenseReports-ExpenseReportWorkflow کلیک کنید تا وارد بخش زیر شوید . 

خب حالا بر روی ok  کلیک کنید . به سایت برگردید و در لیست هزینه ها،  یک آیتم جدید اضافه نمایید . 

آن را ذخیره کنید . از آنجا که در هنگام مرتبط کردنWorkflow  و لیست  گزینه start when a new item is created  را فعال کرده ایم  یک نمونه از تمپلیت  Workflow  تعریف شده ساخته می شود . در واقع اگر به نمای لیست خود برگردید خواهید دید که یک ستون جدید با همان نام Workflow   شما به لیست اضافه شده است :

اگر بر روی گزینه completed کلیک کنید شما صفحه ای را خواهید دید که وضعیت ، تاریخچه و task های Workflow   شما را نمایش می دهد . 

استفاده از activity هایWorkflow 

هرWorkflow  مجموعه ای از مراحل است . هر مرحله یک activity است . activity  ها کلاس های دات نت هستند . ما هم می توانیم از activity  های موجود استفاده کنیم و هم می توانیم activity های دلخواه خود را بسازیم .در آینده نشان خواهم داد که چطور این کار را انجام دهید  .زیر ساخت( workflow Foundation ( WF  مجموعه ای از اسمبلی هاست که که در پوشه resorce های پروژه ویژوال استدیو ما قابل مشاهده است .

(workflow Foundation (WF به عنوان بخشی از فریم ورک دات نت 3.5 اکتیویتی های جذاب بسیاری  را فراهم می کند که می توان در شیر پوینت استفاده کرد . (البته تمام اکتیویتی های WF در شیر پوینت قابل استفاده نیستند ) این اکتیویتی ها در اسمبلی System.Workflow.Activities قابل دسترسی است . علاوه بر این ، تیم شیر پوینت ، اکتیویتی هایی را تولید کرده اند که مختص شیر پوینت است . شما می توانید از این اکتیویتی ها تحت اسمبلی Microsoft.Sharepoint.WorkflowActions استفاده نمایید .
این اسمبلی در فولدر 14\ISAPI قابل دسترسی است و به صورت پیشفرض در refrens های ویژوال استدیو 2010  قرار دارد .این اکتویتی ها در پنل شیر پوینت جعبه ابزار قرار دارند که شما می توانید با گرفتن و کشیدن آنها به سطح  Workflow designer آنها را به پروژه خود اضافه نمایید .

قابل توجه دوستداران wf : بیشتر اکتیویتی ها یا از HandleExternalEventActivity مشتق شده اند که یک wf اولیه هستند که منتظر رخ دادن یک رویداد باقی می ماند و یا از CallExternalMethod مشتق می شوند که به عنوان یک کلاس اجرایی از یک اینترفیس مطرح می شوند ( این کلاس local service نامیده می شود )

ارتباط میان میزبان workfllowruntime  ( که در این مقاله شیر پوینت است ) و خود  Workflow  از یک الگوی متداول تبعیت می کند که توسط تیم Windows Workflow Foundation طراحی شده است :
• شیر پوینت از طریق فرستادن رویداد (event) ها با  Workflow  ارتباط برقرار می کند 
•  Workflow  شیر پوینت را از طریق فراخوانی متد های یک اینترفیس اختصاصی که فراخوانی ها را به API شیر پوینت هدایت می کند صدا می زند .

این اینترفیس ها در name space  ، Microsoft.Sharepoint.Workflow از اسمبلی Microsoft.Sharepoint  تعریف شده اند . برای آنکه مطمئن شویم  Workflow  اولیه ما بالاخره می تواند عبارت Hello World را نمایش دهد اکتیویتی LogToHistoryListActivity را به سطح workfllow design خود می کشیم .

حالا در workfllow designer روی logToHistoryActivity کلیک می کنیم . به صفحه مشخصات آن بروید و در بخش HistoryOutcome   عبارت Hello World  را وارد نمایید .

طبق مراحل قبلی از solusion خود یک اجرا بگیرید . به لیست هزینه های خود برگردید ، آیتمی را که دفعه قبل وارد کرده اید انتخاب کنید و در ریبون بالا گزینه  Workflow  را انتخاب نمایید .  

پنجره start workflow  باز می شود :

بر روی کلید workflow کلیک کنید تا گردش کار شما آغاز شود . بعد از استارت شدن خواهید دید که عبارت hello world در ستون outcom قرار گرفته است :

ویژگی های workflow

Workflow هایی که در ویژوال استودیو تولید می شوند منطقا به صورت ویژگی های یک سایت کالکشن بسته بندی می شوند . اگر این ویزگی فعال نباشد ، تمپلیت  Workflow  غیر قابل استفاده خواهد بود .Workflow  هایی که در ویژوال استدیو تولید می شوند به صورت dll هایی ساخته می شوند که می بایست در GAC نصب گردند . بنا بر این ، این workflow ها در محیط sandbox قابل اجرا نیستند . حتی اگر sandbox دلخواه خود را طبق آموزشی که در پست دیگری داده ام بسازیم .

اگر نگاهی به فایل elements.xml که ویژگی های workflow را در بردارد بیاندازید خواهید دید که تگ  <workflow>  که به نام کلاس workflow اشاره می کند به عنوان placeholder  نام اسمبلی عمل می کند .تگ  <AssociationCategories>در شیر پوینت 2010 اضافه شده مشخص می کند که workflow به چه نوع محتوایی اعم از لیست ، سایت و یا انواع دیگر محتوا متصل شده است .

تگ <StatusPageUrl> هم صفحه aspx ای را که دربردارنده وضعیت workflow است ، مشخص می کند . به صورت پیش فرض این صفحه _layouts/WrkStat.aspx است ولی می نواند با صفحات دیگری جایگزین شود .

تغییر تنظیمات ویزارد 

برای تغییر تنظیماتی که به صورت ویزارد توسط ویژوال استدیو ست کردیم  ، می بایست از صفحه properties   workflow خود عمل کنیم . به طور مثال task لیست را عوض کنیم و یا اینکه اتصال اتوماتیک را از طریق Auto Associate   کنسل کنیم .

اگر به طور مثال شما بخواهید لیست task ها را عوض کنید یک پنجره ویزارد نمایش داده خواهد شد :

 

CODE

اگر  فایل ExpoenseReportWorkflow.cs را باز کنید یک کلاس می بینید که توسط SequentialWorkflowActivity که ریشه کلاس های Sequential workflows است درایو شده است . در کل دو نوع workflow  داریم . Sequential workflows و State Machine workflow ها که در پست های بعدی آنها را توضیح خواهم داد .اگر کد بخش دیزاینر را باز کنید خواهید دید که هر اکتیویتی عضوی از یک کلاس است :

در مرحله بعدی به توسعه این work flow  خواهیم پرداخت