2016-08-03 32 views
2

Ich muss ein Datum-Zeit-Feld in Sitecore aktualisieren, kurz bevor das Element veröffentlicht wird. Dies verhält sich wie eine "Veröffentlichungsdatumszeit", wenn der Artikel tatsächlich veröffentlicht wird. Ich habe dies erfolgreich im Workflow implementiert und funktioniert für Elemente im Workflow, indem eine benutzerdefinierte Aktion hinzugefügt wird.Sitecore-Aktualisierungsfeld kurz vor Veröffentlichung

Für Elemente, die sich nicht im Arbeitsablauf befinden und vom Veröffentlichungsagenten abgerufen werden sollen, habe ich in die Pipeline getippt und einen Prozessor direkt vor dem PerformAction-Prozessor hinzugefügt. Das Feld wird in der Master-Datenbank aktualisiert, aber vom Veröffentlichungsagenten nie in der Web-Datenbank veröffentlicht. Das Element mit allen anderen Werten vor dem Feldupdate wird ordnungsgemäß ausgeführt.

Ich habe versucht, das Problem zu debuggen und das Gefühl zu haben, dass es passiert, weil das aktualisierte Element nicht als Teil der Veröffentlichungswarteschlange wiedergegeben wird. Gibt es eine Möglichkeit, die Aktualisierung des Datumszeitfelds, das ebenfalls im selben Prozess veröffentlicht wurde, zu erzwingen, anstatt es zur Veröffentlichung zwingen zu müssen?

Alle Vorschläge sind willkommen.

Antwort

2

Sie haben Recht Das aktualisierte Element ist nicht Teil der Veröffentlichungswarteschlange. Sie müssen Ihren Code in publish einfügen: itemProcessing-Ereignis. Sie müssen die nächsten Schritte folgen:

  1. eine Handler-Klasse hinzufügen in
<event name="publish:itemProcessing" help="Receives an argument of type ItemProcessingEventArgs (namespace: Sitecore.Publishing.Pipelines.PublishItem)"/> 

Ihre veröffentlichen: itemProcessing Ereignis wird wie folgt aussehen

<event name="publish:itemProcessing" help="Receives an argument of type ItemProcessingEventArgs (namespace: Sitecore.Publishing.Pipelines.PublishItem)"> 
     <handler type="YourNameSpace.SetPublishDate, YourAssembly" method="UpdatePublishingDate"/> 
    </event> 
  1. Erstellen Sie Ihre eigene Klasse für die Verarbeitung von Artikeln auf veröffentlichen:
public class SetPublishDate 
    { 
    /// <summary> 
    /// Gets from date. 
    /// </summary> 
    /// <value>From date.</value> 
    public DateTime FromDate { get; set; } 

    /// <summary> 
    /// Gets to date. 
    /// </summary> 
    /// <value>To date.</value> 
    public DateTime ToDate { get; set; } 

    public void UpdatePublishingDate(object sender, EventArgs args) 
    { 
     var arguments = args as Sitecore.Publishing.Pipelines.PublishItem.ItemProcessingEventArgs; 
     var db = Sitecore.Configuration.Factory.GetDatabase("master"); 
     Item item = db.GetItem(arguments.Context.ItemId); 
     if (item != null) 
     { 
      using (new Sitecore.Data.Events.EventDisabler()) 
      { 
       using (new EditContext(item)) 
       { 
        //PublishDateFieldName must be datetime field 
        item["PublishDateFieldName"] = DateTime.Now; 
       } 
      } 
     } 
    } 
2

Je nachdem, für was Sie dieses Datum verwenden möchten, könnte ein etwas anderer Ansatz besser sein. Die vorherige Antwort ist gültig und wird wahrscheinlich gut funktionieren. Wenn Sie jedoch die Master-Datenbank beim Veröffentlichen aktualisieren, kann die Veröffentlichungs-Engine denken, dass sich das Master-Element geändert hat und erneut veröffentlicht werden muss. (EventDisabler usw. wird dies verhindern, sowie einen Re-Index auslösen und so weiter ... Dinge können sehr knifflig werden)

Alternativ können Sie das Veröffentlichungsdatum stattdessen auf das Element in der Web-Datenbank schreiben.

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"> 
    <sitecore> 
    <pipelines> 
     <publishItem> 
     <processor type="Sitecore.Publishing.Pipelines.PublishItem.PerformAction, Sitecore.Kernel"> 
      <patch:attribute name="type">Your.Namespace.PerformAction, Your.Assembly</patch:attribute> 
     </processor> 
     </publishItem> 
    </pipelines> 
    </sitecore> 
</configuration> 

Und eine Implementierung ähnlich wie diese:

public class PerformAction : Sitecore.Publishing.Pipelines.PublishItem.PerformAction 
{ 
    public override void Process(PublishItemContext context) 
    { 
     base.Process(context); 

     if (context.Aborted || context.VersionToPublish == null || context.VersionToPublish.Source == null) 
      return; 

     var target = context.PublishOptions.TargetDatabase.GetItem(context.VersionToPublish.ID, context.VersionToPublish.Language); 

     if (target == null) 
      return; 

     using (new EditContext(target, false /*updateStatistics*/, true /*silent*/)) 
     { 
      DateField lastPublished = target.Fields["LastPublished"] 
      lastPublished.Value = Sitecore.DateUtil.IsoNo; 
     } 
    } 
} 

John West haben einen Blog-Post über diese hier:

http://www.sitecore.net/learn/blogs/technical-blogs/john-west-sitecore-blog/posts/2011/08/intercept-item-publishing-with-the-sitecore-aspnet-cms.aspx

Nachdem das Datum in der Web-Datenbank gespeichert veröffentlichen, Sie können es stattdessen entweder von dort lesen oder ein berechnetes Indexfeld für die Master-Datenbank erstellen, das stattdessen das Datum aus der Web-DB enthält.

Dies kann vielleicht eine robustere Lösung sein, aber wieder hängt es davon ab, wofür Sie das Feld verwenden und ob Sie den Code kontrollieren, der den Wert liest.