في محرر سير العمل الخاص بمصمم Sharepoint، كيف يمكنني الحصول على اسم مستخدم بادئ سير العمل؟

StackOverflow https://stackoverflow.com/questions/131238

سؤال

في محرر سير عمل Sharepoint Designer، أرغب في استرداد اسم المستخدم/اسم بادئ سير العمل (أي.الذي بدأ تشغيله أو قام بتشغيل سير العمل) - من السهل نسبيًا القيام بذلك باستخدام منتجات الطرف الثالث مثل Nintex Workflow 2007 (حيث سأستخدم شيئًا مثل {Common:Initiator}) - ولكن يبدو أنني لا أستطيع العثور على أي طريقة للخروج من المربع للقيام بذلك باستخدام Share Point Designer وMOSS 2007.

تحديث

لا يبدو أن هذه الميزة الواضحة مدعومة بـ OOTB، لذا انتهى بي الأمر بكتابة نشاط مخصص (كما اقترحت إحدى الإجابات).لقد قمت بإدراج رمز الأنشطة هنا كمرجع على الرغم من أنني أظن أن هناك على الأرجح بعض الأمثلة على ذلك على المدونات لأنه حل تافه جدًا:

public partial class LookupInitiatorInfo : Activity
{
    public static DependencyProperty __ActivationPropertiesProperty =
        DependencyProperty.Register("__ActivationProperties",
        typeof(Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties),
        typeof(LookupInitiatorInfo));

    public static DependencyProperty __ContextProperty =
        DependencyProperty.Register("__Context", typeof (WorkflowContext),
        typeof (LookupInitiatorInfo));

    public static DependencyProperty PropertyValueVariableProperty =
        DependencyProperty.Register("PropertyValueVariable", typeof (string),    
        typeof(LookupInitiatorInfo));

    public static DependencyProperty UserPropertyProperty = 
        DependencyProperty.Register("UserProperty", typeof (string),
        typeof (LookupInitiatorInfo));

    public LookupInitiatorInfo()
    {
        InitializeComponent();
    }

    [Description("ActivationProperties")]
    [ValidationOption(ValidationOption.Required)]
    [Browsable(true)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    public Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties __ActivationProperties
    {
        get { return ((Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties)(base.GetValue(__ActivationPropertiesProperty))); }
        set { base.SetValue(__ActivationPropertiesProperty, value); }
    }

    [Description("Context")]
    [ValidationOption(ValidationOption.Required)]
    [Browsable(true)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    public WorkflowContext __Context
    {
        get { return ((WorkflowContext)(base.GetValue(__ContextProperty))); }
        set { base.SetValue(__ContextProperty, value); }
    }

    [Description("UserProperty")]
    [ValidationOption(ValidationOption.Required)]
    [Browsable(true)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    public string UserProperty
    {
        get { return ((string) (base.GetValue(UserPropertyProperty))); }
        set { base.SetValue(UserPropertyProperty, value); }
    }

    [Description("PropertyValueVariable")]
    [ValidationOption(ValidationOption.Required)]
    [Browsable(true)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    public string PropertyValueVariable
    {
        get { return ((string) (base.GetValue(PropertyValueVariableProperty))); }
        set { base.SetValue(PropertyValueVariableProperty, value); }
    }

    protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
    {
        // value values for the UserProperty (in most cases you
        // would use LoginName or Name)

        //Sid
        //ID
        //LoginName
        //Name
        //IsDomainGroup
        //Email
        //RawSid
        //Notes

        try
        {
            string err = string.Empty;

            if (__ActivationProperties == null)
            {
                err = "__ActivationProperties was null";
            }
            else
            {
                SPUser user = __ActivationProperties.OriginatorUser;

                if (user != null && UserProperty != null)
                {
                    PropertyInfo property = typeof (SPUser).GetProperty(UserProperty);
                    if (property != null)
                    {
                        object value = property.GetValue(user, null);
                        PropertyValueVariable = (value != null) ? value.ToString() : "";
                    }
                    else
                    {
                        err = string.Format("no property found with the name \"{0}\"", UserProperty);
                    }
                }
                else
                {
                    err = "__ActivationProperties.OriginatorUser was null";
                }
            }
            if (!string.IsNullOrEmpty(err))
                Common.LogExceptionToWorkflowHistory(new ArgumentOutOfRangeException(err), executionContext,
                                                     WorkflowInstanceId);
        }
        catch (Exception e)
        {
            Common.LogExceptionToWorkflowHistory(e, executionContext, WorkflowInstanceId);
        }

        return ActivityExecutionStatus.Closed;
    }
}

ثم قم بتوصيله بملف .action xml التالي:

<?xml version="1.0" encoding="utf-8"?>
<WorkflowInfo Language="en-us">
<Actions>
    <Action Name="Lookup initiator user property"
 ClassName="XXX.ActivityLibrary.LookupInitiatorInfo"
 Assembly="XXX.ActivityLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=XXX"
 AppliesTo="all"
 Category="WormaldWorkflow Custom Actions">
        <RuleDesigner Sentence="Lookup initating users property named %1 and store in %2">
            <FieldBind Field="UserProperty" DesignerType="TextArea" Id="1" Text="LoginName" />              
            <FieldBind Field="PropertyValueVariable" DesignerType="ParameterNames" Text="variable" Id="2"/>
        </RuleDesigner>
        <Parameters>
            <Parameter Name="__Context" Type="Microsoft.Sharepoint.WorkflowActions.WorkflowContext, Microsoft.SharePoint.WorkflowActions" Direction="In"/>
            <Parameter Name="__ActivationProperties" Type="Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties, Microsoft.SharePoint" Direction="In"/>
            <Parameter Name="UserProperty" Type="System.String, mscorlib" Direction="In" />
            <Parameter Name="PropertyValueVariable" Type="System.String, mscorlib" Direction="Out" />
        </Parameters>
    </Action>
</Actions>
</WorkflowInfo>
هل كانت مفيدة؟

المحلول

لا أعتقد أن هذا ممكن القيام به في SharePoint Designer خارج الصندوق.ربما يمكنك كتابة إجراء مخصص للحصول على المنشئ، لكنني لا أعتقد أنه تم كشفه من خلال واجهة سير عمل SPD على الإطلاق.

أفضل ما يمكنك فعله هو الحصول على المستخدم الذي قام بإنشاء العنصر في القائمة أو تعديله، ولكن هذا لن يعالج الحالات التي يتم فيها تشغيل سير العمل يدويًا.

نصائح أخرى

بالنسبة لأولئك الذين بحثوا في هذه المقالة على Google ويستخدمون الآن SharePoint 2010، أصبح متغير بادئ سير العمل مدعومًا الآن OOTB في SharePoint Designer.

سيكون مصدر البيانات هو "سياق سير العمل" والحقل هو بالطبع "البادئ" ويمكنك اختيار إعادته كـ "اسم العرض" أو "البريد الإلكتروني" أو "اسم تسجيل الدخول" أو "رقم معرف المستخدم"

يمكنني التفكير في حل بسيط ولكن ليس متطورًا جدًا لهذا الحل باستخدام SPD فقط.فقط في خطوات سير العمل، قم بإنشاء عنصر اختبار في قائمة ثانوية (ربما قائمة مهام تخزن خصائص WorkflowId و itemId للرجوع إليها مرة أخرى) ثم قم بإجراء بحث في سير العمل الخاص بك في تلك القائمة لمعرفة من هو منشئ هذا العنصر، ذلك ستكون القيمة هي بادئ سير العمل الحالي.

لا يعمل حل النشاط المخصص إلا إذا كنت تعمل مع moss، وإذا كان لديك wss 3.0 فقط، فيمكنك وضع خطوة أخرى في سير العمل الخاص بك وتعيين حقل تعليق مخصص بأي معلومات، مما يجعل آخر شخص تم تعديله يتغير ويصبح هو نفسه باعتبارك بادئ سير العمل، يمكنك استخدام الحقل ModifiedBy لاتخاذ أي قرار تحتاجه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top