During my investigation I have create a custom multilist field but in place of using the classical datasource I use Lucene search to return the results. Here is the procedure to create it.
For this project I have use the shared source "Advanced Database Crawler" http://trac.sitecore.net/AdvancedDatabaseCrawler
Syntax
The syntax I have used for the datasource is:
IndexName=advanced&Language=en&TemplateFilter=&LocationFilter=&FullTextQuery=&FieldsFilter=Title:Sample,_templatename:Lucene Demo
Those parameters are the same as in the Demo 3 of the "Advanced Search Crawler". I have used the separator ',' as separator for the Fields filter and ':' for the second member. In my example, the field 'Title' need contain the word 'Sample' and the field '_templatename' need contain 'Lucene Demo'.
Add Advanced Database Crawler
Download http://trac.sitecore.net/AdvancedDatabaseCrawler and it to your solution.
Configure Sitecore
In the core database, duplicate the item: /sitecore/system/Field types/List Types/Multilist rename it 'LuceneMultilist'. In the field 'Control' set the value to: MyPrefix:LuceneMultilist. You may choose your prefix, it only need to be the seem as in the next step.
Add a .config file
Add /App_Config/Include/LuceneMultilist.cs.config with this content:
<configuration xmlns:x="http://www.sitecore.net/xmlconfig/"> <sitecore> <controlSources> <source mode="on" namespace="Your Namespace" assembly="Your Assembly Name" prefix="Your Prefix as in the field control" /> </controlSources> </sitecore> </configuration>
Implement your field
Add a new project to your solution and create a new class LuceneMultilist.cs.
The only think you need to implement is inheriting for the existing MultilistEx and override the method GetItems.
Here is the code
protected override Item[] GetItems(Item current) { Assert.ArgumentNotNull(current, "current"); //Split the source from the DataSource field NameValueCollection splitted = Sitecore.StringUtil.GetNameValues(Source, '=', '&'); //Split the field FieldsFilter NameValueCollection splittedFields = Sitecore.StringUtil.GetNameValues(splitted["FieldsFilter"], ':', ','); //Create the refinements to filter on the Fields values var refinements = new SafeDictionary<string>(); foreach (string key in splittedFields.Keys) { refinements.Add(key, splittedFields[key]); } //Create the parameters as in the Demo 3 of Advanced Search Crawler var searchParam = new FieldValueSearchParam { Refinements = refinements, LocationIds = splitted["LocationFilter"], TemplateIds = splitted["TemplateFilter"], FullTextQuery = splitted["FullTextQuery"], Occurance = QueryOccurance.Must, ShowAllVersions = false, Language = splitted["Language"] }; //Execute the search using (var searcher = new Searcher(splitted["IndexName"])) { var items = searcher.GetItems(searchParam); return SearchHelper.GetItemListFromInformationCollection(items).ToArray(); } }
Of course you need to add your own Lucene index or use an existing one. The tool : http://trac.sitecore.net/IndexViewer is usefull to see the content of the indexes.
It is done, Enjoy!
Nice post man!
ReplyDeleteI didn't know you had a blog. Thank you google :)
Lieven