Configurando um workflow em todos os templates utilizando SPE

Recentemente eu tive que implementar um novo workflow em um projeto de Sitecore. Todos os templates existentes necessitariam utilizar o novo workflow. Eu até poderia ir manualmente em cada template e atualizar manualmente, mas como eu sou um desenvolvedor, normalmente quando eu tenho que realizar uma atividade repetitiva eu penso em formas de automatizá-la. Neste caso, como haviam alguns templates a serem atualizados, eu decidi escrever um script de powershell para atualizar todos.

O módulo Sitecore Powershell Extensions é otimo para automatizar atividades como essa, das quais normalmente necessitam de passos manuais e repetitivos. Se você é um desenvolvedor de Sitecore e ainda não utiliza, eu recomendo dar uma olhada. Esse módulo vem com várias funcionalidades interessantes como relatórios, integrações com o Editor de Conteúdo, Painel de controle, além de vir com muitos comandos que facilitam a construção de scripts para manipular os itens em Sitecore.

Script

Voltando ao cenário descrito no início do post, eu criei o seguinte script(ligeiramente adaptado para o fim do post):

$templates = Get-ChildItem -Path "/sitecore/templates/My Project Templates" -Recurse | Where-Object { $_.Name -match "__Standard Values" } | ForEach-Object{
       $_.__Workflow = "{A5BC37E7-ED96-4C1E-8590-A26E64DB55EA}"
}

O que esse script está fazendo é pegando todos os itens standard values que são descendentes do caminho “/sitecore/templates/My Project Templates”, que é o caminho onde os templates do meu projeto estavam. Depois ele percorre os resultados e configura o no campo workflow o GUID do workflow que eu havia criado, que nesse caso era “{A5BC37E7-ED96-4C1E-8590-A26E64DB55EA}”.

Simples certo? Bem é por isso que eu pessoalmente gosto de utilizar o módulo Sitecore Powershell Extensions sempre que eu posso, pois ele facilita muito as coisas. Se você tiver interesse, é possivel fazer o download diretamente daqui.  Você também pode ver o livro online que tem muitos exemplos interessantes e uma documentação bem completa sobre o módulo, além de ter o suporte da comunidade no canal do Slack #module-spe.

Same post in english here

Como implementar um site de pre-produção em Sitecore? Eis algumas dicas de como fazer isso

Um requisito muito comum para quem trabalha com Sitecore é a necessidade dos autores de conteúdo de enviar URLs para outras pessoas, normalmente pessoas que não tem acesso ao Sitecore. Se essas pessoas normalmente não tem acesso, como elas podem revisar o conteúdo antes de ser publicado?

Conforme descrito aqui. na versão 7.2 foi adicionada a possibilidade de implementar a publicação para ambientes de pré-produção. No link mencionado tem algumas dicas interessantes de como setar um ambiente assim. Eis aqui outras que podem ser úteis para quem quiser configurar um ambiente desse.

1- Você precisa configurar um site definition. Para fazer isso voce pode usar o arquivo SiteDefinitions.config, localizado na pasta App_Config/Include e adicionar a definição conforme o exemplo:

<site name=”preprod” patch:before=”site[@name=’website’]” virtualFolder=”/” physicalFolder=”/” rootPath=”/sitecore/content” content=”preprod” startItem=”/home” database=”preprod” domain=”sitecore” allowDebug=”true” cacheHtml=”false” htmlCacheSize=”0″ registryCacheSize=”0″ viewStateCacheSize=”0″ xslCacheSize=”0″ filteredItemsCacheSize=”0″ enablePreview=”true” enableWebEdit=”true” enableDebugger=”true” disableClientData=”false” hostName=”preview.mywebsite.com”/>

Note a propriedade hostName. Esta é a url que os autores de conteúdo irão prover para os usuários que não tem acesso ao sitecore. Outra coisa importante de notar aqui é o banco “preprod”. Ver item 3.

2- No IIS, adicione o binding preview.mywebsite.com no seu site. Quando o fizer essa URL vai resolver no seu site.

3- Adicone um novo banco de dados master ou crie uma cópia do existente e adicione novamente ao SQL Server. Note abaixo como deve ficar a connection string:

<add name=”preprod” connectionString=”user id=myuser;password=mypassword;Data Source=MyDataSource;Database=sitecore_master_preview” />

4- No Sitecore, crie um novo publication target. Para fazer isso, abra o Editor de Conteúdo e navegue até o caminho e crie um novo item, que no exemplo abaixo eu nomeei Preprod. Depois disso sete o valor para checado no campo  “Preview publishing target”

5-  Atualize o workflow para ter uma ação do tipo __OnSave para publicar para o banco preprod. Isso é importante para garantir que o conteúdo sendo editado esteja disponível para visualização no site de pré-produção:

Note que o parâmetro tem o mesmo nome que o publishing target recém criado.

 

6-  Caso você esteja lidando com um ambiente escalável você precisa configurar alguns itens também. Sugiro que você revise o scaling guide do Sitecore para isso mas os itens a seguir já vão te ajudar nisso.

If you are dealing with an scaled environment you need to make sure that the publishing is properly configured. Please review Sitecore’s scaling guide for more details about this but items 7 and 8 will help you with that.

7- Você precisa limpar a cache do site preprod quando uma publicação ocorrer. Para fazer isso você precisa adicionar uma definição no event publis:end e publish:end:remote conforme abaixo:

 <configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
 <sitecore>
       <events>
            <event name="publish:end">
                  <!--<handler type="Sitecore.Modules.RSS.PublishingHandler, Sitecore.Modules.RSS" method="OnPublishEnd"/>-->
                 <handler type="Sitecore.Publishing.HtmlCacheClearer, Sitecore.Kernel" method="ClearCache">
                       <sites hint="list">
                           <patch:delete />
                       </sites>
                       <sites hint="list">
                            <site>website</site>
                            <site>preprod</site>
                       </sites>
                </handler>
            </event>
            <event name="publish:end:remote">
                   <handler type="Sitecore.Publishing.HtmlCacheClearer, Sitecore.Kernel" method="ClearCache">
                          <sites hint="list">
                               <patch:delete />
                          </sites>
                          <sites hint="list">
                                <site>website</site>
                                <site>preprod</site>
                          </sites>
                   </handler>
            </event>
        </events>
</sitecore>
</configuration>

Continue reading

Ever wonder how to implement a pre-production preview website on Sitecore? Here are a few hints to get that done!

It is a common request from content authors in Sitecore that from time to time they needed to send internal URL to non-Sitecore users. Since these users generally do not have access to Sitecore how can they review the content before it goes live, for example?
As described here, on Sitecore 7.2 it was added the ability to implement pre-production publishing. Take a look at the link provided with a few useful hints to setup the pre-production publishing. Here are others that need to be done in order to get that working properly.

1- You need to have a site definition in place. To do that you can use the SiteDefinition.config file, located under App_Config/Include to add your site definition. Here is one example:

<site name=”preprod” patch:before=”site[@name=’website’]” virtualFolder=”/” physicalFolder=”/” rootPath=”/sitecore/content” content=”preprod” startItem=”/home” database=”preprod” domain=”sitecore” allowDebug=”true” cacheHtml=”false” htmlCacheSize=”0″ registryCacheSize=”0″ viewStateCacheSize=”0″ xslCacheSize=”0″ filteredItemsCacheSize=”0″ enablePreview=”true” enableWebEdit=”true” enableDebugger=”true” disableClientData=”false” hostName=”preview.mywebsite.com”/>

Note the hostName property. This is the url that the content authors will provide to non-sitecore users. Also the property database points to a new database “preprod”

2- On IIS, add the preview.mywebsite.com to the binding of your website. When you do that you will enable it to be resolved by your website.

3- Attach a new master database or create a snapshot of the existing one and re-attach to SqlServer. The connection string for this new database should be set to preprod:

<add name=”preprod” connectionString=”user id=myuser;password=mypassword;Data Source=MyDataSource;Database=sitecore_master_preview” />

4- On Sitecore create a new publication target. To do that, open the content editor and navigate to the path /sitecore/system/Publishing targets and create a new target which I`m naming preprod. After you do that check the checkbox “Preview publishing target”

5- Update your workflow definition to have the __OnSave action to publish it to the preprod database. This is required to help content authors when creating the content and having the content landing on the preview site:

Note that the target parameter has the same name as the publishing target created.

 

6- If you are dealing with an scaled environment you need to make sure that the publishing is properly configured. Please review Sitecore’s scaling guide for more details about this but items 7 and 8 will help you with that.

7- Make sure you preprod site is getting it’s cache cleared when the publishing is happening. To do that need to add it’s definition to the publish:end and publish:end:remote configurations to a HtmlCacheClear file definition.

Here is an example of how it could be defined:

 <configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
 <sitecore>
       <events>
            <event name="publish:end">
                  <!--<handler type="Sitecore.Modules.RSS.PublishingHandler, Sitecore.Modules.RSS" method="OnPublishEnd"/>-->
                 <handler type="Sitecore.Publishing.HtmlCacheClearer, Sitecore.Kernel" method="ClearCache">
                       <sites hint="list">
                           <patch:delete />
                       </sites>
                       <sites hint="list">
                            <site>website</site>
                            <site>preprod</site>
                       </sites>
                </handler>
            </event>
            <event name="publish:end:remote">
                   <handler type="Sitecore.Publishing.HtmlCacheClearer, Sitecore.Kernel" method="ClearCache">
                          <sites hint="list">
                               <patch:delete />
                          </sites>
                          <sites hint="list">
                                <site>website</site>
                                <site>preprod</site>
                          </sites>
                   </handler>
            </event>
        </events>
</sitecore>
</configuration>

Continue reading