Umbraco 7, Как изменить пользовательское свойство в MemberService.Saved - PullRequest
0 голосов
/ 30 августа 2018

Я борюсь с изменением простого флага true / false в свойствах элемента, как только флаг Is Approved впервые установлен в true. Я могу изменить свойство, но значение не сохраняется / фиксируется. Я пробовал и MemberService.Saved и MemberService.Saving. Я совсем новичок в Umbraco, поэтому, возможно, пропустил что-то очевидное.

protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
    MemberService.Saved += MemberService_Saved;
}

void MemberService_Saved(IMemberService sender, Umbraco.Core.Events.SaveEventArgs<IMember> e)
{ 
    foreach (var member in e.SavedEntities)
    {
        if (!member.IsNewEntity())
        {
            var dirtyProperties = member.Properties.Where(x => x.WasDirty()).Select(p => p.Alias);
            if (dirtyProperties.Contains("umbracoMemberApproved"))
            {
                if (member.IsApproved && !member.GetValue<bool>("approvalEmailSent"))
                {
                    //Send Email to Customer
                    //new SmtpClient().Send(mail);

                    var prop = member.Properties["approvalEmailSent"];
                    prop.Value = true;

                    var propValue = member.GetValue<bool>("approvalEmailSent");
                    //Have verified propValue is now true

                    sender.Save(member);
                } 
            }
        }
    }
}

Странно, но я могу найти другого участника, изменить свойство и сохранить его в порядке, только не член, отправленный через e.SavedEntities.

ТИА

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Мне кажется, это какая-то ошибка, после долгих отладок я обнаружил следующее:

  • Даже если при сохранении флаг поднятия событий имеет значение false, он все равно возвращается через метод.
  • На втором проходе вы должны установить значение свойства, которое вы снова изменяете, даже если оно уже было сохранено / зафиксировано. Мне не нужно было сохранять снова. Я считаю, что это ошибка
  • Оригинал, измененный свойством пользователя - флаг dirty, больше не устанавливается во второй раз. Таким образом, первоначальной проверкой этого была остановка свойства, которое я хочу изменить, и снова установить его.
  • Мне нужно было проверить грязь, чтобы при втором проходе я больше не отправлял письмо.
  • Как примечание, даже изменение чего-либо, не связанного с членом с помощью интерфейса umbraco, приведет к тому, что мой метод запустится дважды.
protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
    MemberService.Saved += MemberService_Saved;
}

void MemberService_Saved(IMemberService sender, Umbraco.Core.Events.SaveEventArgs<IMember> e)
{
    foreach (var member in e.SavedEntities)
    {
        if (!member.IsNewEntity())
        {
            if (member.IsApproved && !member.GetValue<bool>("approvalEmailSent"))
            {
                member.SetValue("approvalEmailSent", true);

                var dirtyProperties = member.Properties.Where(x => x.WasDirty()).Select(p => p.Alias);
                if (dirtyProperties.Contains("umbracoMemberApproved"))
                {
                    //Email Customer
                    //new SmtpClient().Send(mail);

                    sender.Save(member, false);
                }
            }
        }
    }
}
0 голосов
/ 30 августа 2018

Может, попытаться сделать это вместо этого?

member.SetValue("approvalEmailSent", true);
sender.Save(member, false);

Когда в MemberService.Saved, сообщите .Save методу, чтобы он не вызывал никаких дальнейших событий, просто чтобы убедиться, что бесконечные циклы не произойдут.

...