How to publish items after pipeline is finished?How to add sitecore items with different language version by using Data Exchange frameworkRun Pipeline Batch button disabledGetting errors in Apply Mapping Pipeline Step when running pipeline batchSitecore Data Exchange Framework - Pipeline step to execute after Update Sitecore Item Pipeline StepDon't Index An Item In DEF Until All Items Have Been AddedPipeline Step to Resolve Target ItemCustom Pipeline Step never calledEmpty Pipeline Batch Log file after runningRESTful provider Pipeline Batch error: “One or more errors occurred”Batch Pipeline to sync contact
The last tree in the Universe
Looking for an iPhone app for working out chess problems
The title "Mord mit Aussicht" explained
How did the European Union reach the figure of 3% as a maximum allowed deficit?
New Site Design!
Converting 3x7 to a 1x7. Is it possible with only existing parts?
Idiom for 'person who gets violent when drunk"
Can an open source licence be revoked if it violates employer's IP?
How would Japanese people react to someone refusing to say “itadakimasu” for religious reasons?
SQL Server has encountered occurences of I/O requests taking longer than 15 seconds
Why can't we feel the Earth's revolution?
Fastest path on a snakes and ladders board
Any Volunteers for Card Counting?
Was the Lonely Mountain, where Smaug lived, a volcano?
Is fission/fusion to iron the most efficient way to convert mass to energy?
Arcane Tradition and Cost Efficiency: Learn spells on level-up, or learn them from scrolls/spellbooks?
My parents claim they cannot pay for my college education; what are my options?
How to search for Android apps without ads?
How long would it take for sucrose to undergo hydrolysis in boiling water?
Why is Skinner so awkward in Hot Fuzz?
How can Caller ID be faked?
How many times to repeat an event with known probability before it has occurred a number of times
Should I email my professor to clear up a (possibly very irrelevant) awkward misunderstanding?
What made the Ancient One do this in Endgame?
How to publish items after pipeline is finished?
How to add sitecore items with different language version by using Data Exchange frameworkRun Pipeline Batch button disabledGetting errors in Apply Mapping Pipeline Step when running pipeline batchSitecore Data Exchange Framework - Pipeline step to execute after Update Sitecore Item Pipeline StepDon't Index An Item In DEF Until All Items Have Been AddedPipeline Step to Resolve Target ItemCustom Pipeline Step never calledEmpty Pipeline Batch Log file after runningRESTful provider Pipeline Batch error: “One or more errors occurred”Batch Pipeline to sync contact
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;
I've utilized Data Exchange Framework and built pipeline batches.
Now it's unclear how the created/updated items can be published automatically. I did not find any publishing pipeline steps or even mention of publishing stuff in Sitecore.DataExchange. Publishing seems to be an essential step within pipeline after pulling data but looks like DEF is not responsible for that.
So, what is the right way of doing automatic publish when DEF is used?
data-exchange-framework
New contributor
Igor Evstratov is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
add a comment |
I've utilized Data Exchange Framework and built pipeline batches.
Now it's unclear how the created/updated items can be published automatically. I did not find any publishing pipeline steps or even mention of publishing stuff in Sitecore.DataExchange. Publishing seems to be an essential step within pipeline after pulling data but looks like DEF is not responsible for that.
So, what is the right way of doing automatic publish when DEF is used?
data-exchange-framework
New contributor
Igor Evstratov is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
add a comment |
I've utilized Data Exchange Framework and built pipeline batches.
Now it's unclear how the created/updated items can be published automatically. I did not find any publishing pipeline steps or even mention of publishing stuff in Sitecore.DataExchange. Publishing seems to be an essential step within pipeline after pulling data but looks like DEF is not responsible for that.
So, what is the right way of doing automatic publish when DEF is used?
data-exchange-framework
New contributor
Igor Evstratov is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
I've utilized Data Exchange Framework and built pipeline batches.
Now it's unclear how the created/updated items can be published automatically. I did not find any publishing pipeline steps or even mention of publishing stuff in Sitecore.DataExchange. Publishing seems to be an essential step within pipeline after pulling data but looks like DEF is not responsible for that.
So, what is the right way of doing automatic publish when DEF is used?
data-exchange-framework
data-exchange-framework
New contributor
Igor Evstratov is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
New contributor
Igor Evstratov is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
edited Jun 7 at 13:25
Gatogordo
13.1k21866
13.1k21866
New contributor
Igor Evstratov is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
asked Jun 7 at 12:26
Igor EvstratovIgor Evstratov
1333
1333
New contributor
Igor Evstratov is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
New contributor
Igor Evstratov is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
You can add a custom pipeline step to perform the publishing. Below is an example of one that can publish either a specific item (e.g. the root item below which all your DEF items were imported) or an item in the pipeline context (e.g. each item as it's imported).
As with all custom pipeline steps, you'll need to perform the following steps:
- Add a custom pipeline step template
- Add a plugin for settings
- Add a pipeline step converter
- Add a pipeline step processor
- Update the standard values of your template to reference your step converter and processor
1. Create your template
- Create a new template called Publish Item Pipeline Step
- I created mine at
/sitecore/templates/Data Exchange/Providers/Sitecore/Pipeline Steps/Publish Item Pipeline Step
- I created mine at
- Add
/sitecore/templates/Data Exchange/Framework/Pipeline Steps/Base Pipeline Steps/Base Pipeline Stepas a base template - Add fields
EndpointFrom- Type: Droptree
- Source:
query:./ancestor-or-self::*[@@templateid='327A381B-59F8-4E88-B331-BEBC7BD87E4E']//descendant-or-self::*[@@templateid='CAADA2F1-1D71-452A-87BF-A3AE335CA169']
Item- Type: Droptree
- Short Description: The exact item to publish. A value in this field will override the Item Location field.
ItemLocation- Type: Droplink
- Source:
DD61BBDB-CF41-40F6-9923-3031C7AB47C8 - Short Description: Location within the pipeline's context of the item to publish
Publishing Targets- Type: Checklist
- Source:
/sitecore/system/Publishing targets
Publish Subitems- Type: Checkbox
2. Add plugin
using Sitecore.DataExchange;
using Sitecore.Services.Core.Model;
public class PublishItemSettings : IPlugin
public ItemModel ItemModel get; set;
public string[] TargetDatabaseNames get; set;
public bool PublishSubitems get; set;
3. Add pipeline step converter
using System;
using System.Collections.Generic;
using System.Linq;
using Sitecore.DataExchange;
using Sitecore.DataExchange.Attributes;
using Sitecore.DataExchange.Converters.PipelineSteps;
using Sitecore.DataExchange.Extensions;
using Sitecore.DataExchange.Models;
using Sitecore.DataExchange.Plugins;
using Sitecore.DataExchange.Repositories;
using Sitecore.Services.Core.Model;
[SupportedIds("YOUR-TEMPLATE-ID")]
public class PublishItemPipelineStepConverter : BasePipelineStepConverter
public PublishItemPipelineStepConverter(IItemModelRepository repository) : base(repository)
private void AddPublishItemSettings(ItemModel source, PipelineStep pipelineStep)
!publishingTargets.Any())
Context.Logger.Error($"No publishing targets were selected for the pipeline step. (pipeline step: pipelineStep.Name, pipeline step item: source.GetItemId(), field: Publishing Targets)");
return;
var settings = new PublishItemSettings
ItemModel = GetReferenceAsModel(source, "Item"),
TargetDatabaseNames = publishingTargets.Select(model => GetStringValue(model, "Target database")).ToArray(),
PublishSubitems = GetBoolValue(source, "Publish Subitems")
;
pipelineStep.AddPlugin(settings);
private void AddDataLocationSettings(ItemModel source, PipelineStep pipelineStep)
if (pipelineStep == null)
throw new ArgumentNullException(nameof(pipelineStep));
var settings = new DataLocationSettings
DataLocation = GetGuidValue(source, "ItemLocation")
;
pipelineStep.AddPlugin(settings);
private void AddEndpointSettings(ItemModel source, PipelineStep pipelineStep)
var settings = new EndpointSettings();
var endpoint = ConvertReferenceToModel<Endpoint>(source, "EndpointFrom");
if (endpoint != null)
settings.EndpointFrom = endpoint;
pipelineStep.AddPlugin(settings);
protected override void AddPlugins(ItemModel source, PipelineStep pipelineStep)
this.AddPublishItemSettings(source, pipelineStep);
this.AddDataLocationSettings(source, pipelineStep);
this.AddEndpointSettings(source, pipelineStep);
4. Add pipeline step processor
using System;
using System.Collections.Generic;
using System.Linq;
using Sitecore.Data;
using Sitecore.Data.Items;
using Sitecore.DataExchange.Attributes;
using Sitecore.DataExchange.Contexts;
using Sitecore.DataExchange.Extensions;
using Sitecore.DataExchange.Models;
using Sitecore.DataExchange.Plugins;
using Sitecore.DataExchange.Providers.Sc.Extensions;
using Sitecore.DataExchange.Providers.Sc.Processors.PipelineSteps;
using Sitecore.Publishing;
using Sitecore.Services.Core.Diagnostics;
using Sitecore.Services.Core.Model;
[RequiredPipelineStepPlugins(typeof(PublishItemSettings), typeof(DataLocationSettings), typeof(EndpointSettings))]
public class PublishItemPipelineStepProcessor : UpdateSitecoreItemStepProcessor
protected override void ProcessPipelineStep(PipelineStep pipelineStep, PipelineContext pipelineContext, ILogger logger)
if (pipelineStep == null) throw new ArgumentNullException(nameof(pipelineStep));
if (pipelineContext == null) throw new ArgumentNullException(nameof(pipelineContext));
if (logger == null) throw new ArgumentNullException(nameof(logger));
PublishItemSettings publishItemSettings = pipelineStep.GetPlugin<PublishItemSettings>();
IEnumerable<ItemModel> itemsToPublish;
if (publishItemSettings.ItemModel != null)
itemsToPublish = new [] publishItemSettings.ItemModel ;
else
logger.Debug($"No direct item reference was specified in the pipeline step, so we are looking in the DataLocation field instead. (pipeline step: pipelineStep.Name, pipeline step identifier: pipelineStep.Identifier)");
itemsToPublish = GetTargetObjectAsItemModels(pipelineStep, pipelineContext, logger);
if (itemsToPublish == null
5. Update standard values
- In Sitecore, navigate to the standard values of your custom pipeline step template you created back in step 1
- Populate the Converter Type and Processor Type fields with your custom types, for example:
Custom.DataExchange.Providers.Sc.PipelineSteps.PublishItemPipelineStepConverter,Custom.DataExchangeCustom.DataExchange.Providers.Sc.PipelineSteps.PublishItemPipelineStepProcessor,Custom.DataExchange
Thank you for sharing your approach with codes! Makes perfect sense for me.
– Igor Evstratov
Jun 8 at 15:55
add a comment |
Your Answer
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "664"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Igor Evstratov is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsitecore.stackexchange.com%2fquestions%2f19237%2fhow-to-publish-items-after-pipeline-is-finished%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
You can add a custom pipeline step to perform the publishing. Below is an example of one that can publish either a specific item (e.g. the root item below which all your DEF items were imported) or an item in the pipeline context (e.g. each item as it's imported).
As with all custom pipeline steps, you'll need to perform the following steps:
- Add a custom pipeline step template
- Add a plugin for settings
- Add a pipeline step converter
- Add a pipeline step processor
- Update the standard values of your template to reference your step converter and processor
1. Create your template
- Create a new template called Publish Item Pipeline Step
- I created mine at
/sitecore/templates/Data Exchange/Providers/Sitecore/Pipeline Steps/Publish Item Pipeline Step
- I created mine at
- Add
/sitecore/templates/Data Exchange/Framework/Pipeline Steps/Base Pipeline Steps/Base Pipeline Stepas a base template - Add fields
EndpointFrom- Type: Droptree
- Source:
query:./ancestor-or-self::*[@@templateid='327A381B-59F8-4E88-B331-BEBC7BD87E4E']//descendant-or-self::*[@@templateid='CAADA2F1-1D71-452A-87BF-A3AE335CA169']
Item- Type: Droptree
- Short Description: The exact item to publish. A value in this field will override the Item Location field.
ItemLocation- Type: Droplink
- Source:
DD61BBDB-CF41-40F6-9923-3031C7AB47C8 - Short Description: Location within the pipeline's context of the item to publish
Publishing Targets- Type: Checklist
- Source:
/sitecore/system/Publishing targets
Publish Subitems- Type: Checkbox
2. Add plugin
using Sitecore.DataExchange;
using Sitecore.Services.Core.Model;
public class PublishItemSettings : IPlugin
public ItemModel ItemModel get; set;
public string[] TargetDatabaseNames get; set;
public bool PublishSubitems get; set;
3. Add pipeline step converter
using System;
using System.Collections.Generic;
using System.Linq;
using Sitecore.DataExchange;
using Sitecore.DataExchange.Attributes;
using Sitecore.DataExchange.Converters.PipelineSteps;
using Sitecore.DataExchange.Extensions;
using Sitecore.DataExchange.Models;
using Sitecore.DataExchange.Plugins;
using Sitecore.DataExchange.Repositories;
using Sitecore.Services.Core.Model;
[SupportedIds("YOUR-TEMPLATE-ID")]
public class PublishItemPipelineStepConverter : BasePipelineStepConverter
public PublishItemPipelineStepConverter(IItemModelRepository repository) : base(repository)
private void AddPublishItemSettings(ItemModel source, PipelineStep pipelineStep)
!publishingTargets.Any())
Context.Logger.Error($"No publishing targets were selected for the pipeline step. (pipeline step: pipelineStep.Name, pipeline step item: source.GetItemId(), field: Publishing Targets)");
return;
var settings = new PublishItemSettings
ItemModel = GetReferenceAsModel(source, "Item"),
TargetDatabaseNames = publishingTargets.Select(model => GetStringValue(model, "Target database")).ToArray(),
PublishSubitems = GetBoolValue(source, "Publish Subitems")
;
pipelineStep.AddPlugin(settings);
private void AddDataLocationSettings(ItemModel source, PipelineStep pipelineStep)
if (pipelineStep == null)
throw new ArgumentNullException(nameof(pipelineStep));
var settings = new DataLocationSettings
DataLocation = GetGuidValue(source, "ItemLocation")
;
pipelineStep.AddPlugin(settings);
private void AddEndpointSettings(ItemModel source, PipelineStep pipelineStep)
var settings = new EndpointSettings();
var endpoint = ConvertReferenceToModel<Endpoint>(source, "EndpointFrom");
if (endpoint != null)
settings.EndpointFrom = endpoint;
pipelineStep.AddPlugin(settings);
protected override void AddPlugins(ItemModel source, PipelineStep pipelineStep)
this.AddPublishItemSettings(source, pipelineStep);
this.AddDataLocationSettings(source, pipelineStep);
this.AddEndpointSettings(source, pipelineStep);
4. Add pipeline step processor
using System;
using System.Collections.Generic;
using System.Linq;
using Sitecore.Data;
using Sitecore.Data.Items;
using Sitecore.DataExchange.Attributes;
using Sitecore.DataExchange.Contexts;
using Sitecore.DataExchange.Extensions;
using Sitecore.DataExchange.Models;
using Sitecore.DataExchange.Plugins;
using Sitecore.DataExchange.Providers.Sc.Extensions;
using Sitecore.DataExchange.Providers.Sc.Processors.PipelineSteps;
using Sitecore.Publishing;
using Sitecore.Services.Core.Diagnostics;
using Sitecore.Services.Core.Model;
[RequiredPipelineStepPlugins(typeof(PublishItemSettings), typeof(DataLocationSettings), typeof(EndpointSettings))]
public class PublishItemPipelineStepProcessor : UpdateSitecoreItemStepProcessor
protected override void ProcessPipelineStep(PipelineStep pipelineStep, PipelineContext pipelineContext, ILogger logger)
if (pipelineStep == null) throw new ArgumentNullException(nameof(pipelineStep));
if (pipelineContext == null) throw new ArgumentNullException(nameof(pipelineContext));
if (logger == null) throw new ArgumentNullException(nameof(logger));
PublishItemSettings publishItemSettings = pipelineStep.GetPlugin<PublishItemSettings>();
IEnumerable<ItemModel> itemsToPublish;
if (publishItemSettings.ItemModel != null)
itemsToPublish = new [] publishItemSettings.ItemModel ;
else
logger.Debug($"No direct item reference was specified in the pipeline step, so we are looking in the DataLocation field instead. (pipeline step: pipelineStep.Name, pipeline step identifier: pipelineStep.Identifier)");
itemsToPublish = GetTargetObjectAsItemModels(pipelineStep, pipelineContext, logger);
if (itemsToPublish == null
5. Update standard values
- In Sitecore, navigate to the standard values of your custom pipeline step template you created back in step 1
- Populate the Converter Type and Processor Type fields with your custom types, for example:
Custom.DataExchange.Providers.Sc.PipelineSteps.PublishItemPipelineStepConverter,Custom.DataExchangeCustom.DataExchange.Providers.Sc.PipelineSteps.PublishItemPipelineStepProcessor,Custom.DataExchange
Thank you for sharing your approach with codes! Makes perfect sense for me.
– Igor Evstratov
Jun 8 at 15:55
add a comment |
You can add a custom pipeline step to perform the publishing. Below is an example of one that can publish either a specific item (e.g. the root item below which all your DEF items were imported) or an item in the pipeline context (e.g. each item as it's imported).
As with all custom pipeline steps, you'll need to perform the following steps:
- Add a custom pipeline step template
- Add a plugin for settings
- Add a pipeline step converter
- Add a pipeline step processor
- Update the standard values of your template to reference your step converter and processor
1. Create your template
- Create a new template called Publish Item Pipeline Step
- I created mine at
/sitecore/templates/Data Exchange/Providers/Sitecore/Pipeline Steps/Publish Item Pipeline Step
- I created mine at
- Add
/sitecore/templates/Data Exchange/Framework/Pipeline Steps/Base Pipeline Steps/Base Pipeline Stepas a base template - Add fields
EndpointFrom- Type: Droptree
- Source:
query:./ancestor-or-self::*[@@templateid='327A381B-59F8-4E88-B331-BEBC7BD87E4E']//descendant-or-self::*[@@templateid='CAADA2F1-1D71-452A-87BF-A3AE335CA169']
Item- Type: Droptree
- Short Description: The exact item to publish. A value in this field will override the Item Location field.
ItemLocation- Type: Droplink
- Source:
DD61BBDB-CF41-40F6-9923-3031C7AB47C8 - Short Description: Location within the pipeline's context of the item to publish
Publishing Targets- Type: Checklist
- Source:
/sitecore/system/Publishing targets
Publish Subitems- Type: Checkbox
2. Add plugin
using Sitecore.DataExchange;
using Sitecore.Services.Core.Model;
public class PublishItemSettings : IPlugin
public ItemModel ItemModel get; set;
public string[] TargetDatabaseNames get; set;
public bool PublishSubitems get; set;
3. Add pipeline step converter
using System;
using System.Collections.Generic;
using System.Linq;
using Sitecore.DataExchange;
using Sitecore.DataExchange.Attributes;
using Sitecore.DataExchange.Converters.PipelineSteps;
using Sitecore.DataExchange.Extensions;
using Sitecore.DataExchange.Models;
using Sitecore.DataExchange.Plugins;
using Sitecore.DataExchange.Repositories;
using Sitecore.Services.Core.Model;
[SupportedIds("YOUR-TEMPLATE-ID")]
public class PublishItemPipelineStepConverter : BasePipelineStepConverter
public PublishItemPipelineStepConverter(IItemModelRepository repository) : base(repository)
private void AddPublishItemSettings(ItemModel source, PipelineStep pipelineStep)
!publishingTargets.Any())
Context.Logger.Error($"No publishing targets were selected for the pipeline step. (pipeline step: pipelineStep.Name, pipeline step item: source.GetItemId(), field: Publishing Targets)");
return;
var settings = new PublishItemSettings
ItemModel = GetReferenceAsModel(source, "Item"),
TargetDatabaseNames = publishingTargets.Select(model => GetStringValue(model, "Target database")).ToArray(),
PublishSubitems = GetBoolValue(source, "Publish Subitems")
;
pipelineStep.AddPlugin(settings);
private void AddDataLocationSettings(ItemModel source, PipelineStep pipelineStep)
if (pipelineStep == null)
throw new ArgumentNullException(nameof(pipelineStep));
var settings = new DataLocationSettings
DataLocation = GetGuidValue(source, "ItemLocation")
;
pipelineStep.AddPlugin(settings);
private void AddEndpointSettings(ItemModel source, PipelineStep pipelineStep)
var settings = new EndpointSettings();
var endpoint = ConvertReferenceToModel<Endpoint>(source, "EndpointFrom");
if (endpoint != null)
settings.EndpointFrom = endpoint;
pipelineStep.AddPlugin(settings);
protected override void AddPlugins(ItemModel source, PipelineStep pipelineStep)
this.AddPublishItemSettings(source, pipelineStep);
this.AddDataLocationSettings(source, pipelineStep);
this.AddEndpointSettings(source, pipelineStep);
4. Add pipeline step processor
using System;
using System.Collections.Generic;
using System.Linq;
using Sitecore.Data;
using Sitecore.Data.Items;
using Sitecore.DataExchange.Attributes;
using Sitecore.DataExchange.Contexts;
using Sitecore.DataExchange.Extensions;
using Sitecore.DataExchange.Models;
using Sitecore.DataExchange.Plugins;
using Sitecore.DataExchange.Providers.Sc.Extensions;
using Sitecore.DataExchange.Providers.Sc.Processors.PipelineSteps;
using Sitecore.Publishing;
using Sitecore.Services.Core.Diagnostics;
using Sitecore.Services.Core.Model;
[RequiredPipelineStepPlugins(typeof(PublishItemSettings), typeof(DataLocationSettings), typeof(EndpointSettings))]
public class PublishItemPipelineStepProcessor : UpdateSitecoreItemStepProcessor
protected override void ProcessPipelineStep(PipelineStep pipelineStep, PipelineContext pipelineContext, ILogger logger)
if (pipelineStep == null) throw new ArgumentNullException(nameof(pipelineStep));
if (pipelineContext == null) throw new ArgumentNullException(nameof(pipelineContext));
if (logger == null) throw new ArgumentNullException(nameof(logger));
PublishItemSettings publishItemSettings = pipelineStep.GetPlugin<PublishItemSettings>();
IEnumerable<ItemModel> itemsToPublish;
if (publishItemSettings.ItemModel != null)
itemsToPublish = new [] publishItemSettings.ItemModel ;
else
logger.Debug($"No direct item reference was specified in the pipeline step, so we are looking in the DataLocation field instead. (pipeline step: pipelineStep.Name, pipeline step identifier: pipelineStep.Identifier)");
itemsToPublish = GetTargetObjectAsItemModels(pipelineStep, pipelineContext, logger);
if (itemsToPublish == null
5. Update standard values
- In Sitecore, navigate to the standard values of your custom pipeline step template you created back in step 1
- Populate the Converter Type and Processor Type fields with your custom types, for example:
Custom.DataExchange.Providers.Sc.PipelineSteps.PublishItemPipelineStepConverter,Custom.DataExchangeCustom.DataExchange.Providers.Sc.PipelineSteps.PublishItemPipelineStepProcessor,Custom.DataExchange
Thank you for sharing your approach with codes! Makes perfect sense for me.
– Igor Evstratov
Jun 8 at 15:55
add a comment |
You can add a custom pipeline step to perform the publishing. Below is an example of one that can publish either a specific item (e.g. the root item below which all your DEF items were imported) or an item in the pipeline context (e.g. each item as it's imported).
As with all custom pipeline steps, you'll need to perform the following steps:
- Add a custom pipeline step template
- Add a plugin for settings
- Add a pipeline step converter
- Add a pipeline step processor
- Update the standard values of your template to reference your step converter and processor
1. Create your template
- Create a new template called Publish Item Pipeline Step
- I created mine at
/sitecore/templates/Data Exchange/Providers/Sitecore/Pipeline Steps/Publish Item Pipeline Step
- I created mine at
- Add
/sitecore/templates/Data Exchange/Framework/Pipeline Steps/Base Pipeline Steps/Base Pipeline Stepas a base template - Add fields
EndpointFrom- Type: Droptree
- Source:
query:./ancestor-or-self::*[@@templateid='327A381B-59F8-4E88-B331-BEBC7BD87E4E']//descendant-or-self::*[@@templateid='CAADA2F1-1D71-452A-87BF-A3AE335CA169']
Item- Type: Droptree
- Short Description: The exact item to publish. A value in this field will override the Item Location field.
ItemLocation- Type: Droplink
- Source:
DD61BBDB-CF41-40F6-9923-3031C7AB47C8 - Short Description: Location within the pipeline's context of the item to publish
Publishing Targets- Type: Checklist
- Source:
/sitecore/system/Publishing targets
Publish Subitems- Type: Checkbox
2. Add plugin
using Sitecore.DataExchange;
using Sitecore.Services.Core.Model;
public class PublishItemSettings : IPlugin
public ItemModel ItemModel get; set;
public string[] TargetDatabaseNames get; set;
public bool PublishSubitems get; set;
3. Add pipeline step converter
using System;
using System.Collections.Generic;
using System.Linq;
using Sitecore.DataExchange;
using Sitecore.DataExchange.Attributes;
using Sitecore.DataExchange.Converters.PipelineSteps;
using Sitecore.DataExchange.Extensions;
using Sitecore.DataExchange.Models;
using Sitecore.DataExchange.Plugins;
using Sitecore.DataExchange.Repositories;
using Sitecore.Services.Core.Model;
[SupportedIds("YOUR-TEMPLATE-ID")]
public class PublishItemPipelineStepConverter : BasePipelineStepConverter
public PublishItemPipelineStepConverter(IItemModelRepository repository) : base(repository)
private void AddPublishItemSettings(ItemModel source, PipelineStep pipelineStep)
!publishingTargets.Any())
Context.Logger.Error($"No publishing targets were selected for the pipeline step. (pipeline step: pipelineStep.Name, pipeline step item: source.GetItemId(), field: Publishing Targets)");
return;
var settings = new PublishItemSettings
ItemModel = GetReferenceAsModel(source, "Item"),
TargetDatabaseNames = publishingTargets.Select(model => GetStringValue(model, "Target database")).ToArray(),
PublishSubitems = GetBoolValue(source, "Publish Subitems")
;
pipelineStep.AddPlugin(settings);
private void AddDataLocationSettings(ItemModel source, PipelineStep pipelineStep)
if (pipelineStep == null)
throw new ArgumentNullException(nameof(pipelineStep));
var settings = new DataLocationSettings
DataLocation = GetGuidValue(source, "ItemLocation")
;
pipelineStep.AddPlugin(settings);
private void AddEndpointSettings(ItemModel source, PipelineStep pipelineStep)
var settings = new EndpointSettings();
var endpoint = ConvertReferenceToModel<Endpoint>(source, "EndpointFrom");
if (endpoint != null)
settings.EndpointFrom = endpoint;
pipelineStep.AddPlugin(settings);
protected override void AddPlugins(ItemModel source, PipelineStep pipelineStep)
this.AddPublishItemSettings(source, pipelineStep);
this.AddDataLocationSettings(source, pipelineStep);
this.AddEndpointSettings(source, pipelineStep);
4. Add pipeline step processor
using System;
using System.Collections.Generic;
using System.Linq;
using Sitecore.Data;
using Sitecore.Data.Items;
using Sitecore.DataExchange.Attributes;
using Sitecore.DataExchange.Contexts;
using Sitecore.DataExchange.Extensions;
using Sitecore.DataExchange.Models;
using Sitecore.DataExchange.Plugins;
using Sitecore.DataExchange.Providers.Sc.Extensions;
using Sitecore.DataExchange.Providers.Sc.Processors.PipelineSteps;
using Sitecore.Publishing;
using Sitecore.Services.Core.Diagnostics;
using Sitecore.Services.Core.Model;
[RequiredPipelineStepPlugins(typeof(PublishItemSettings), typeof(DataLocationSettings), typeof(EndpointSettings))]
public class PublishItemPipelineStepProcessor : UpdateSitecoreItemStepProcessor
protected override void ProcessPipelineStep(PipelineStep pipelineStep, PipelineContext pipelineContext, ILogger logger)
if (pipelineStep == null) throw new ArgumentNullException(nameof(pipelineStep));
if (pipelineContext == null) throw new ArgumentNullException(nameof(pipelineContext));
if (logger == null) throw new ArgumentNullException(nameof(logger));
PublishItemSettings publishItemSettings = pipelineStep.GetPlugin<PublishItemSettings>();
IEnumerable<ItemModel> itemsToPublish;
if (publishItemSettings.ItemModel != null)
itemsToPublish = new [] publishItemSettings.ItemModel ;
else
logger.Debug($"No direct item reference was specified in the pipeline step, so we are looking in the DataLocation field instead. (pipeline step: pipelineStep.Name, pipeline step identifier: pipelineStep.Identifier)");
itemsToPublish = GetTargetObjectAsItemModels(pipelineStep, pipelineContext, logger);
if (itemsToPublish == null
5. Update standard values
- In Sitecore, navigate to the standard values of your custom pipeline step template you created back in step 1
- Populate the Converter Type and Processor Type fields with your custom types, for example:
Custom.DataExchange.Providers.Sc.PipelineSteps.PublishItemPipelineStepConverter,Custom.DataExchangeCustom.DataExchange.Providers.Sc.PipelineSteps.PublishItemPipelineStepProcessor,Custom.DataExchange
You can add a custom pipeline step to perform the publishing. Below is an example of one that can publish either a specific item (e.g. the root item below which all your DEF items were imported) or an item in the pipeline context (e.g. each item as it's imported).
As with all custom pipeline steps, you'll need to perform the following steps:
- Add a custom pipeline step template
- Add a plugin for settings
- Add a pipeline step converter
- Add a pipeline step processor
- Update the standard values of your template to reference your step converter and processor
1. Create your template
- Create a new template called Publish Item Pipeline Step
- I created mine at
/sitecore/templates/Data Exchange/Providers/Sitecore/Pipeline Steps/Publish Item Pipeline Step
- I created mine at
- Add
/sitecore/templates/Data Exchange/Framework/Pipeline Steps/Base Pipeline Steps/Base Pipeline Stepas a base template - Add fields
EndpointFrom- Type: Droptree
- Source:
query:./ancestor-or-self::*[@@templateid='327A381B-59F8-4E88-B331-BEBC7BD87E4E']//descendant-or-self::*[@@templateid='CAADA2F1-1D71-452A-87BF-A3AE335CA169']
Item- Type: Droptree
- Short Description: The exact item to publish. A value in this field will override the Item Location field.
ItemLocation- Type: Droplink
- Source:
DD61BBDB-CF41-40F6-9923-3031C7AB47C8 - Short Description: Location within the pipeline's context of the item to publish
Publishing Targets- Type: Checklist
- Source:
/sitecore/system/Publishing targets
Publish Subitems- Type: Checkbox
2. Add plugin
using Sitecore.DataExchange;
using Sitecore.Services.Core.Model;
public class PublishItemSettings : IPlugin
public ItemModel ItemModel get; set;
public string[] TargetDatabaseNames get; set;
public bool PublishSubitems get; set;
3. Add pipeline step converter
using System;
using System.Collections.Generic;
using System.Linq;
using Sitecore.DataExchange;
using Sitecore.DataExchange.Attributes;
using Sitecore.DataExchange.Converters.PipelineSteps;
using Sitecore.DataExchange.Extensions;
using Sitecore.DataExchange.Models;
using Sitecore.DataExchange.Plugins;
using Sitecore.DataExchange.Repositories;
using Sitecore.Services.Core.Model;
[SupportedIds("YOUR-TEMPLATE-ID")]
public class PublishItemPipelineStepConverter : BasePipelineStepConverter
public PublishItemPipelineStepConverter(IItemModelRepository repository) : base(repository)
private void AddPublishItemSettings(ItemModel source, PipelineStep pipelineStep)
!publishingTargets.Any())
Context.Logger.Error($"No publishing targets were selected for the pipeline step. (pipeline step: pipelineStep.Name, pipeline step item: source.GetItemId(), field: Publishing Targets)");
return;
var settings = new PublishItemSettings
ItemModel = GetReferenceAsModel(source, "Item"),
TargetDatabaseNames = publishingTargets.Select(model => GetStringValue(model, "Target database")).ToArray(),
PublishSubitems = GetBoolValue(source, "Publish Subitems")
;
pipelineStep.AddPlugin(settings);
private void AddDataLocationSettings(ItemModel source, PipelineStep pipelineStep)
if (pipelineStep == null)
throw new ArgumentNullException(nameof(pipelineStep));
var settings = new DataLocationSettings
DataLocation = GetGuidValue(source, "ItemLocation")
;
pipelineStep.AddPlugin(settings);
private void AddEndpointSettings(ItemModel source, PipelineStep pipelineStep)
var settings = new EndpointSettings();
var endpoint = ConvertReferenceToModel<Endpoint>(source, "EndpointFrom");
if (endpoint != null)
settings.EndpointFrom = endpoint;
pipelineStep.AddPlugin(settings);
protected override void AddPlugins(ItemModel source, PipelineStep pipelineStep)
this.AddPublishItemSettings(source, pipelineStep);
this.AddDataLocationSettings(source, pipelineStep);
this.AddEndpointSettings(source, pipelineStep);
4. Add pipeline step processor
using System;
using System.Collections.Generic;
using System.Linq;
using Sitecore.Data;
using Sitecore.Data.Items;
using Sitecore.DataExchange.Attributes;
using Sitecore.DataExchange.Contexts;
using Sitecore.DataExchange.Extensions;
using Sitecore.DataExchange.Models;
using Sitecore.DataExchange.Plugins;
using Sitecore.DataExchange.Providers.Sc.Extensions;
using Sitecore.DataExchange.Providers.Sc.Processors.PipelineSteps;
using Sitecore.Publishing;
using Sitecore.Services.Core.Diagnostics;
using Sitecore.Services.Core.Model;
[RequiredPipelineStepPlugins(typeof(PublishItemSettings), typeof(DataLocationSettings), typeof(EndpointSettings))]
public class PublishItemPipelineStepProcessor : UpdateSitecoreItemStepProcessor
protected override void ProcessPipelineStep(PipelineStep pipelineStep, PipelineContext pipelineContext, ILogger logger)
if (pipelineStep == null) throw new ArgumentNullException(nameof(pipelineStep));
if (pipelineContext == null) throw new ArgumentNullException(nameof(pipelineContext));
if (logger == null) throw new ArgumentNullException(nameof(logger));
PublishItemSettings publishItemSettings = pipelineStep.GetPlugin<PublishItemSettings>();
IEnumerable<ItemModel> itemsToPublish;
if (publishItemSettings.ItemModel != null)
itemsToPublish = new [] publishItemSettings.ItemModel ;
else
logger.Debug($"No direct item reference was specified in the pipeline step, so we are looking in the DataLocation field instead. (pipeline step: pipelineStep.Name, pipeline step identifier: pipelineStep.Identifier)");
itemsToPublish = GetTargetObjectAsItemModels(pipelineStep, pipelineContext, logger);
if (itemsToPublish == null
5. Update standard values
- In Sitecore, navigate to the standard values of your custom pipeline step template you created back in step 1
- Populate the Converter Type and Processor Type fields with your custom types, for example:
Custom.DataExchange.Providers.Sc.PipelineSteps.PublishItemPipelineStepConverter,Custom.DataExchangeCustom.DataExchange.Providers.Sc.PipelineSteps.PublishItemPipelineStepProcessor,Custom.DataExchange
edited Jun 7 at 13:31
answered Jun 7 at 13:14
Dan SinclairDan Sinclair
2,9532830
2,9532830
Thank you for sharing your approach with codes! Makes perfect sense for me.
– Igor Evstratov
Jun 8 at 15:55
add a comment |
Thank you for sharing your approach with codes! Makes perfect sense for me.
– Igor Evstratov
Jun 8 at 15:55
Thank you for sharing your approach with codes! Makes perfect sense for me.
– Igor Evstratov
Jun 8 at 15:55
Thank you for sharing your approach with codes! Makes perfect sense for me.
– Igor Evstratov
Jun 8 at 15:55
add a comment |
Igor Evstratov is a new contributor. Be nice, and check out our Code of Conduct.
Igor Evstratov is a new contributor. Be nice, and check out our Code of Conduct.
Igor Evstratov is a new contributor. Be nice, and check out our Code of Conduct.
Igor Evstratov is a new contributor. Be nice, and check out our Code of Conduct.
Thanks for contributing an answer to Sitecore Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsitecore.stackexchange.com%2fquestions%2f19237%2fhow-to-publish-items-after-pipeline-is-finished%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown