Patching web.config in Sitecore - sitecore

I have a need to add an additional line to the cleanupagent section in our web.config in sitecore.
I would like to add the following line:
<remove folder="/App_Data/MediaCache" pattern="*.json" maxAge="01.00:00:00" recursive="true">
Here is the config xml.
<sitecore>
<agent type="Sitecore.Tasks.CleanupAgent">
<files hint="raw:AddCommand">
<remove folder="/App_Data/MediaCache" pattern="*.json" maxAge="01.00:00:00" recursive="true" patch:after="files[#hint='raw:AddCommand']"/>
</files>
</agent>
</sitecore>

The problem you are having is that Sitecore is matching to an existing node, the existing folder="/App_Data/MediaCache" element, and replacing that based on it's node matching rules instead of inserting a new one.
In order to prevent it from matching, you need to make your node more unique, the simplest way is to add an additional attribute, e.g. desc="json" (you can also use name or hint attributes instead):
<sitecore>
<scheduling>
<agent type="Sitecore.Tasks.CleanupAgent">
<files>
<remove folder="/App_Data/MediaCache" pattern="*.json" maxAge="01.00:00:00" recursive="true" desc="json" />
</files>
</agent>
</scheduling>
</sitecore>
The patch should insert a new element in config now instead of replacing.

Related

Sitecore 8.1 Update 2 - URL's can't be generated from display name

We upgraded our solution from Sitecore 8.1 Update 1 to Update 2. Our URL's are generated from display name and that was working fine.
But after upgrading, the behaviour changed to URL generation from item name although ShowConfig.aspx still shows "useDisplayName="true" for .
We're using the following config:
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<linkManager defaultProvider="sitecore">
<providers>
<clear/>
<add name="sitecore">
<patch:attribute name="addAspxExtension">false</patch:attribute>
<patch:attribute name="useDisplayName">true</patch:attribute>
<patch:attribute name="languageEmbedding">never</patch:attribute>
<patch:attribute name="alwaysIncludeServerUrl">true</patch:attribute>
</add>
</providers>
</linkManager>
</sitecore>
Now all links only show a 404. What am I missing?
We tried on an empty solution and it's the same behaviour. So it is a Sitecore bug.
We contacted Sitecore Support. They introduced a new setting in Update 2 in Sitecore.config.
<setting name="ItemResolving.FindBestMatch" value="DeepScan" />
This setting needs to be set to:
<setting name="ItemResolving.FindBestMatch" value="Disabled" />
It was supposed to solve the following bug:
96805: Item could have been unresolved with specific encodeNameReplacement and wildcard/display name resolving logic
This is now registered as a bug with the reference number 105324.

Sitecore 8.1 Upgrade Media section broken

I upgraded sitecore from 7.0 to 8.1. The only real problem I have ran into is the media section is broken and the images appear broken on the site itself.
The weird part and I can upload and download the media items. It is broken in both chrome and firefox.
Thanks]1
Update
<encodeNameReplacements>
<replace mode="on" find="&" replaceWith=",-a-," />
<replace mode="on" find="?" replaceWith=",-q-," />
<replace mode="on" find="/" replaceWith=",-s-," />
<replace mode="on" find="*" replaceWith=",-w-," />
<replace mode="on" find="." replaceWith=",-d-," />
<replace mode="on" find=":" replaceWith=",-c-," />
</encodeNameReplacements>
It looks like a problem with Sitecore Media Protection (included first time in Sitecore 7.5).
You can read more about it in Adam blog post "Do not turn Sitecore Media Request protection off and protect older Sitecore versions with ImageGuard".
But I don't know why hashes are not added to the links in Sitecore. It should be disabled for the Sitecore internal sites (e.g. shell, login, etc).
Try to disable media protection by changing the config in /App_config/Include/Sitecore.Media.RequestProtection.config file and see if this is the reason of your problems.
Fixed it. It turns out the way sitecore is configured has changed a lot between 7-8.1. By adding
<sitecore configSource="App_Config\Sitecore.config" />
and removing the old section fixed the problem.
You are missing a replacement:
<replace mode="on" find=" " replaceWith="-" />
It can cause problems in images request, if you are using spaces in media item names.
Add it to your section
Another thing to see is if your CustomHandler section is like this:
<customHandlers>
<handler trigger="-/media/" handler="sitecore_media.ashx" />
<handler trigger="~/media/" handler="sitecore_media.ashx" />
<handler trigger="~/api/" handler="sitecore_api.ashx" />
<handler trigger="~/xaml/" handler="sitecore_xaml.ashx" />
<handler trigger="~/icon/" handler="sitecore_icon.ashx" />
<handler trigger="~/feed/" handler="sitecore_feed.ashx" />
</customHandlers>
This is the same of "Configuration Files Changes" especified by Sitecore Upgrade 8.1 IR
One of the new changes in 8.1 is the change of the default prefix from "~" to "-". It could be related to this prefix change. If you take the URLs that are getting a 404 and replace the ~ with a -, do the URLs to media work?

Get item based on displayname in sitecore

I need to get a specific item based on it's displayname, how do I do that?
For example I want to get this item /sitecore/content/mysite/about
But on the site is translated to multiple languages and could be something like www.site.com/om (in Sitecore it would be /sitecore/content/mysite/om)
There are a couple approaches you can take. The most efficent is to leverage the Content Search API, but the challenge is that Display Name is excluded from the index by default. A simple patch file can fix this:
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<contentSearch>
<indexConfigurations>
<defaultLuceneIndexConfiguration>
<exclude>
<__display_name>
<patch:delete />
</__display_name>
</exclude>
</defaultLuceneIndexConfiguration>
</indexConfigurations>
</contentSearch>
</sitecore>
</configuration>
Then your code would be something like:
public Item GetItemByDisplayName(string displayName)
{
var searchIndex = ContentSearchManager.GetIndex("sitecore_master_index"); // sub your index name
using (var context = searchIndex.CreateSearchContext())
{
var searchResultItems =
context.GetQueryable<SearchResultItem>().Where(i => i["Display Name"].Equals(displayName)).FirstOrDefault();
return searchResultItems == null ? null : searchResultItems.GetItem();
}
}
This all is assuming you are on Sitecore 7. If you're on Sitecore 6, your option are limited and are probably not going to perform well if you content tree is large. Nonetheless, your function might look like:
public Item GetItemByDisplayName(string displayName)
{
var query = string.Format("fast:/sitecore/content//*[#__Display Name='{0}']", displayName);
var item = Sitecore.Context.Database.SelectSingleItem(query);
return item;
}
Please note that this will be horribly inefficent since under the covers this is basically walking the content tree.
Often, you wouldn't need to. LinkManager (responsible for generating all your item URLs) has an option to base the URLs on Display Name instead of Item.Name.
var d = LinkManager.GetDefaultUrlOptions();
d.UseDisplayName = true;
This can also be configured in configuration. Find and amend this section in your Web.config (or patch it via include files):
<linkManager defaultProvider="sitecore">
<providers>
<clear />
<add name="sitecore" type="Sitecore.Links.LinkProvider, Sitecore.Kernel"
addAspxExtension="false" alwaysIncludeServerUrl="false" encodeNames="true"
languageEmbedding="never" languageLocation="filePath" lowercaseUrls="true"
shortenUrls="true" useDisplayName="false" />
</providers>
</linkManager>
To truly do exactly what you ask is a quite involved process. If you point DotPeek to Sitecore.Pipelines.HttpRequest.ItemResolver, you can step through the ResolveUsingDisplayName() method. It essentially loops through child items, comparing the URL Part to the "__Display Name" field. You would have to cook up something similar.

SitecoreSearchContrib - How to merge & sort from multiple indexes

I'm currently setting up a search for a Sitecore 6.6 web site using SitecoreSearchContrib.
I've got two indexes.
One index looking at my web site content:
/sitecore/content/home
and another index looking in a documents folder in the media library (which contains PDF etc).
/sitecore/media library/documents
The search on my web site can return web pages or Word/PDF documents.
Is there a way (beside using one super-index for content & media library) that I can combine the results from both indexes and still order them by their relevance / hit count?
Ended up solving this by getting rid of the second index and instead, simply included an additional <locations>...</locations> block in the scSearchContrib.Crawler.config to point to the folder in the media library where my documents live.
E.g.
Inside of App_Config/Include/scSearchContrib.Crawler.config
......
<index id="web" type="Sitecore.Search.Index, Sitecore.Kernel">
<param desc="name">$(id)</param>
<param desc="folder">web</param>
<Analyzer ref="search/analyzer" />
<locations hint="list:AddCrawler">
<my-site-content type="scSearchContrib.Crawler.Crawlers.AdvancedDatabaseCrawler,scSearchContrib.Crawler">
<Database>web</Database>
<Root>/sitecore/content/MySite/Home</Root>
<tags>Web Content</tags>
<IndexAllFields>true</IndexAllFields>
<!-- Include/Exclude templates, crawlers etc here -->
</locations>
<locations hint="list:AddCrawler">
<my-site-media-library type="scSearchContrib.Crawler.Crawlers.AdvancedDatabaseCrawler,scSearchContrib.Crawler">
<Database>web</Database>
<Root>/sitecore/media library/SomeFolder/Documents</Root>
<tags>Documents</tags>
<IndexAllFields>true</IndexAllFields>
<!-- Include/Exclude templates, crawlers etc here -->
</locations>
</index>
......

How to manipulate xml data in Oracle SOA suite?

<Employees manager="101" xmlns:ns1="http://www.example.org" xmlns="http://www.example.org">
<ns1:person ssn="101">
<ns1:firstName>Lakshminarayana</ns1:firstName>
<ns1:lastName>medikoda</ns1:lastName>
</ns1:person>
<ns1:person ssn="102">
<ns1:firstName>narasimha</ns1:firstName>
<ns1:lastName>mannepalli</ns1:lastName>
</ns1:person>
<ns1:person ssn="103">
<ns1:firstName>venu</ns1:firstName>
<ns1:lastName>ponakala</ns1:lastName>
</ns1:person>
</Employees>
I want to append new records and remove some records from this file in oracle soa
You should not be using XSLT to make this adjustment, you should be using the BPELX functions in an Assign activity.
To append a new record into the list you should be doing the following
bpelx:append
The bpelx:append extension in an assign activity enables a BPEL process to append the contents of one variable, expression, or XML fragment to another variable's contents.
<bpel:assign>
<bpelx:append>
<bpelx:from ... />
<bpelx:to ... />
</bpelx:append>
</bpel:assign>
The following example will show you how to implement this in your example.
<bpel:assign>
<bpelx:append>
<from variable="variableFrom"
query="variableFromQuery" />
<to variable="variableTo"
query="/ns1:Employees/ns1:person" />
</bpelx:append>
</bpel:assign>
To remove this from the queue you should
The bpelx:remove extension in an assign activity enables a BPEL process to remove a variable.
<bpel:assign>
<bpelx:remove>
<bpelx:target variable="variableName" part="Employee" query="query to match node you want to remove" />
</bpelx:remove>
</bpel:assign>