代码之家  ›  专栏  ›  技术社区  ›  PingCrosby

Orchard CMS仅使用工作流在注册期间请求邀请令牌链接到后端数据

  •  0
  • PingCrosby  · 技术社区  · 8 年前

    我正在使用Orchard CMS v1.9,希望显示一个自定义注册页面,以接受常用的用户名/密码/电子邮件和一个额外的令牌(邀请令牌)。令牌将用于将用户与服务器上的一些自定义数据匹配。

    我已经浏览了这个博客 Customizing User Registation With Dynamic Forms And Workflows 。但是除了在这个博客中实现的之外,我还想强制注册用户输入令牌。令牌用于在服务器上查找数据并创建到用户部件的链接。

    将令牌添加到表单中并不是问题,而是查询并将输入的令牌链接到后端数据,并将其存储在用户部分,这让我觉得很尴尬。

    • 这可能只使用工作流吗?还是我需要一个自定义模块?我没有看到允许我匹配令牌和链接的自定义操作。

    • 是否已经有一个自定义模块可以执行某些操作
      相像的

    1 回复  |  直到 8 年前
        1
  •  0
  •   Xceno    8 年前

    免责声明:此方法目前基于Orchard 1.10,但最初是在1.9.x分支上开发的。它不依赖于动态表单和工作流,但我认为您可以通过这些模块实现类似的功能。

    好的,所以我用我们的扩展用户/激活系统方法构建了一个示例模块。我去掉了很多代码,但也让一些与你的答案没有直接关系的有趣部分加入其中。

    首先,您应该查看 UsersController 它有您正在搜索的激活动作。您可能需要扩展果园登录视图,并包含一些GET&相应的POST操作。

    [AllowAnonymous]
    [HttpGet]
    public ActionResult Activate(string activationCode)
    {
        // validation stuff....
    
        var viewModel = new CustomUserActivate
        {
            // This is the activationCode you're looking for
            ActivationCode = userFromActivationCode.ActivationCode,
            UserName = userFromActivationCode.User.UserName,
            WelcomeText = userFromActivationCode.WelcomeText,
            Email = userFromActivationCode.User.Email
        };
    
        return this.View(viewModel);
    }
    
    [AllowAnonymous]
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Activate(CustomUserActivate input)
    {
        if ( input == null )
        {
            this.ModelState.AddModelError("_form", this.T("The argument cannot be null").Text);
        }
    
        CustomUserPart customUserPart = null;
        if ( this.ModelState.IsValid )
        {
            customUserPart = this.myService.GetCustomUserByActivationCode(input.ActivationCode);
    
            if ( customUserPart == null || customUserPart.User == null || customUserPart.User.UserName != input.UserName )
            {
                this.notifier.Add(NotifyType.Error, this.T("The activation failed"));
            }
    
            if ( string.IsNullOrEmpty(input.Email) )
            {
                this.ModelState.AddModelError("Email", this.T("You must specify an email address.").Text);
            }
            else if ( input.Email.Length >= 255 )
            {
                this.ModelState.AddModelError("Email", this.T("The email address you provided is too long.").Text);
            }
            else if ( !Regex.IsMatch(input.Email, UserPart.EmailPattern, RegexOptions.IgnoreCase) )
            {
                // http://haacked.com/archive/2007/08/21/i-knew-how-to-validate-an-email-address-until-i.aspx    
                this.ModelState.AddModelError("Email", this.T("You must specify a valid email address.").Text);
            }
            else if ( !this.myService.VerifyEmailUnicity(customUserPart.User.Id, input.Email) )
            {
                this.ModelState.AddModelError("Email", this.T("This email address is already in use.").Text);
            }
        }
    
        if ( !this.ModelState.IsValid )
        {
            return this.View(input);
        }
    
        Debug.Assert(customUserPart != null, "customUserPart != null");
        var user = customUserPart.User;
        var userParams = new CreateUserParams(user.UserName, input.Password, input.Email, passwordQuestion: null, passwordAnswer: null, isApproved: true);
        this.myService.ActivateCustomUser(customUserPart.Id, userParams);
    
        this.notifier.Add(NotifyType.Information, this.T("Your account was activated. You can now log in."));
        return this.RedirectToAction("LogOn", "Account", new { area = "Orchard.Users" });
    }
    

    有趣的事情发生在 MyService.cs . 我们设计了激活系统,以便您仍然可以利用Orchard的所有功能。用户模块,如电子邮件验证。 为此,我们实施了一些 CustomSettings ,您可以决定在使用ActivationCode时用户是否被完全激活,或者是否触发正常的Orchard机制。

    我想最好是签出模块并在VisualStudio中逐步完成代码。

    这里是我们的激活视图的两个屏幕截图。

    步骤1-输入激活码 enter image description here

    第2步-填写剩余字段 enter image description here

    利润

    所有额外的源代码都是在工作流、事件、令牌等中使用CustomUser/ActivationCode。但我将这一点留给您去发现。

    如果你想更详细地描述GitHub上的源代码,请告诉我。 希望这有帮助!