Событие Sitecore - Сохраненный элемент вызывает исключение TargetInvocation -> IconChange - PullRequest
0 голосов
/ 12 сентября 2011

Я работаю над механизмом изменения элементов и Icon на основе проверки поля этого элемента.Если в поле ссылки, которое я проверяю, есть targetItem, а в targetItem есть содержимое, я хочу изменить значок сохраняемого элемента.Это мой текущий код:

Sitecore.Data.Items.Item currentItem = Sitecore.Events.Event.ExtractParameter(args, 0) as Sitecore.Data.Items.Item;

if (ValidForIconChange(currentItem))
{
    using (new EventDisabler())
    {
        if (HelperClasses.SharedContentHelper.itemHasSharedContent(currentItem))
        {
            currentItem.Editing.BeginEdit();
            currentItem.Appearance.Icon = "Applications/32x32/document_out.png";
            currentItem.Editing.EndEdit();
        }
        else
        {
            currentItem.Editing.BeginEdit();
            currentItem.Appearance.Icon = currentItem.Template.Icon;
            currentItem.Editing.EndEdit();
        }
    }

    RefreshScreen(currentItem);                
}

И вспомогательные функции:

    /// <summary>
    /// Checks if the item is valid to change the icon of the item
    /// </summary>
    /// <param name="currentItem">The current item.</param>
    /// <returns></returns>
    private static bool ValidForIconChange(Sitecore.Data.Items.Item currentItem)
    {
        return currentItem != null && ItemHelper.DoesItemImplementTemplate(currentItem, "_gedeelde inhoud") && currentItem.Language.Name == "nl-NL";
    }

    /// <summary>
    /// Refreshes the screen.
    /// </summary>
    /// <param name="currentItem">The current item.</param>
    private void RefreshScreen(Sitecore.Data.Items.Item currentItem)
    {
        if (Sitecore.Context.ClientPage != null)
        {
            if (currentItem.Parent != null)
            {
                if (!currentItem.Editing.IsEditing)
                {
                    //TODO: set to the appropriate item 
                    String refresh = String.Format("item:refreshchildren(id={0})", currentItem.Parent.ID);
                    Sitecore.Context.ClientPage.SendMessage(this, refresh); 
                }                                       
            }
        }
    }

В настоящее время я просто немного догадываюсь, как работать с этим событием.В основном я пытаюсь выяснить, как работать с EventDisabler, потому что я хочу создать свое собственное событие для обновления родительских детей после того, как я изменил значок, но это доставляет мне проблемы, когда я публикую сайт,Я думаю, что должен знать, когда я работаю с действием публикации, а не с сохранением одного элемента.Я хочу, чтобы этот код срабатывал только при сохранении элемента, а не при публикации сайта.Действия публикации приводят к следующей ошибке (которая, как я полагаю, связана с тем, что я отключаю события и после публикации события возникает):

Job started: Publish to 'web'|Items created: 0|Items deleted: 0|Items updated: 1|Items skipped: 0|Job ended: Publish to 'web' (units processed: 1)|Job started: Publish to 'web'|#Exception: System.Reflection.TargetInvocationException: Het doel van een aanroep heeft een uitzondering veroorzaakt. ---> System.NullReferenceException: De objectverwijzing is niet op een exemplaar van een object ingesteld.
   bij Sitecore.Web.UI.Sheer.ClientPage..ctor()
   bij Sitecore.Context.get_ClientPage()
   bij CommandTemplates.Classes.SharedContentIconChanger.RefreshScreen(Item currentItem)
   bij CommandTemplates.Classes.SharedContentIconChanger.OnItemSaved(Object sender, EventArgs args)
   bij Sitecore.Events.Event.EventSubscribers.RaiseEvent(String eventName, Object[] parameters, EventResult result)
   bij Sitecore.Events.Event.EventSubscribers.RaiseEvent(String eventName, Object[] parameters)
   bij Sitecore.Events.Event.RaiseEvent(String eventName, Object[] parameters)
   bij Sitecore.Events.Event.RaiseItemSaved(Object sender, ItemSavedEventArgs args)
   bij Sitecore.Events.Event.DataEngine_ItemSaved(Object sender, ExecutedEventArgs`1 e)
   bij System.EventHandler`1.Invoke(Object sender, TEventArgs e)
   bij Sitecore.Data.Engines.EngineCommand`2.RaiseExecuted()
   bij Sitecore.Data.Engines.EngineCommand`2.Executed()
   bij Sitecore.Data.Engines.EngineCommand`2.Execute()
   bij Sitecore.Data.Engines.DataEngine.SaveItem(Item item)
   bij Sitecore.Data.Managers.ItemProvider.SaveItem(Item item)
   bij Sitecore.Data.Managers.ItemManager.SaveItem(Item item)
   bij Sitecore.Data.Items.ItemEditing.AcceptChanges(Boolean updateStatistics, Boolean silent)
   bij Sitecore.Data.Items.ItemEditing.EndEdit(Boolean updateStatistics, Boolean silent)
   bij Sitecore.Data.Items.EditContext.Dispose()
   bij Sitecore.Publishing.PublishHelper.CopyToTarget(Item sourceVersion)
   bij Sitecore.Publishing.PublishHelper.PublishVersionToTarget(Item sourceVersion, Item targetItem, Boolean targetCreated)
   bij Sitecore.Publishing.PublishHelper.PublishVersion(Item sourceVersion)
   bij Sitecore.Publishing.Pipelines.PublishItem.PerformAction.PublishVersion(PublishItemContext context)
   bij Sitecore.Publishing.Pipelines.PublishItem.PerformAction.ExecuteAction(PublishItemContext context)
   bij Sitecore.Publishing.Pipelines.PublishItem.PerformAction.Process(PublishItemContext context)
   bij (Object , Object[] )
   bij Sitecore.Pipelines.PipelineMethod.Invoke(Object[] parameters)
   bij Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args)
   bij Sitecore.Pipelines.CorePipeline.Run(String pipelineName, PipelineArgs args, String pipelineDomain)
   bij Sitecore.Pipelines.CorePipeline.Run(String pipelineName, PipelineArgs args)
   bij Sitecore.Publishing.Pipelines.PublishItem.PublishItemPipeline.Run(PublishItemContext context)
   bij Sitecore.Publishing.Pipelines.Publish.ProcessQueue.ProcessEntries(IEnumerable`1 entries, PublishContext context)
   bij Sitecore.Publishing.Pipelines.Publish.ProcessQueue.Process(PublishContext context)
   bij (Object , Object[] )
   bij Sitecore.Pipelines.PipelineMethod.Invoke(Object[] parameters)
   bij Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args)
   bij Sitecore.Pipelines.CorePipeline.Run(String pipelineName, PipelineArgs args, String pipelineDomain)
   bij Sitecore.Pipelines.CorePipeline.Run(String pipelineName, PipelineArgs args)
   bij Sitecore.Publishing.Pipelines.Publish.PublishPipeline.Run(PublishContext context)
   bij Sitecore.Publishing.Publisher.PerformPublish()
   bij Sitecore.Publishing.Publisher.Publish()
   --- Einde van intern uitzonderingsstackpad ---
   bij System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
   bij System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
   bij System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
   bij System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   bij Sitecore.Reflection.ReflectionUtil.InvokeMethod(MethodInfo method, Object[] parameters, Object obj)
   bij Sitecore.Reflection.MethodInstance.Invoke()
   bij Sitecore.Jobs.JobRunner.RunMethod(JobArgs args)
   bij (Object , Object[] )
   bij Sitecore.Pipelines.PipelineMethod.Invoke(Object[] parameters)
   bij Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args)
   bij Sitecore.Pipelines.CorePipeline.Run(String pipelineName, PipelineArgs args, String pipelineDomain)
   bij Sitecore.Jobs.Job.ThreadEntry(Object state)

У кого-нибудь здесь есть идеи относительно другого подхода или какие-либо советы?Спасибо!

1 Ответ

1 голос
/ 12 сентября 2011

Решил эту проблему, проверив, был ли элемент: сохраненный вызван публикацией или просто сохранением элемента:

if(Sitecore.Context.Job != null &&Sitecore.Context.Job.Category == "publish") 
{
  // Do nothing
} else {
  // Change Icon code here`enter code here`
}

Таким образом, вы можете определить, находитесь ли вы в процессе публикации.

...