London Dev Meetup Rescheduled! Due to unavoidable reasons, the event has been moved to 21st May. Speakers remain the same—any changes will be communicated. Seats are limited—register here to secure your spot!
AI OnAI Off
London Dev Meetup Rescheduled! Due to unavoidable reasons, the event has been moved to 21st May. Speakers remain the same—any changes will be communicated. Seats are limited—register here to secure your spot!
So I found the error, and a fix would be to create a CustomVersioningDirectory extending VersioningDirectory and overriding Search(). The only problem is that I have to replace a lot of classes (VersioningDirectoryHandler, VirtualPathVersioningProvider, ++) because of a lot of internal constructors. I guess EPiServer don't want us to tamper with it? Has anyone successfully made customizations or extensions of EPiServers VPP-code? (can't find any examples, only custom VPPs written from the ground up)
The following hack fixed it:
/// <summary>
/// Custom versioningdirectory adding * when searching in EPiServer's filemanager
/// </summary>
public class CustomVersioningDirectory : EPiServer.Web.Hosting.VersioningDirectory
{
public CustomVersioningDirectory(EPiServer.Web.Hosting.VirtualPathUnifiedProvider provider, string virtualPath, EPiServer.Web.Hosting.Versioning.VersioningDirectoryHandler dvdh, VersioningFileSystem fs, string customSummaryFullPath, bool bypassAccessCheck)
: base(provider, virtualPath, dvdh, fs, customSummaryFullPath, bypassAccessCheck)
{
}
public override UnifiedSearchHitCollection Search(UnifiedSearchQuery query)
{
if(!string.IsNullOrEmpty(query.FreeTextQuery) && (!query.FreeTextQuery.EndsWith("*")))
query.FreeTextQuery += "*";
if (!string.IsNullOrEmpty(query.FileNamePattern) && !query.FileNamePattern.EndsWith("*"))
query.FileNamePattern += "*";
return base.Search(query);
}
}
public class CustomVirtualPathVersioningProvider : EPiServer.Web.Hosting.VirtualPathVersioningProvider
{
private readonly VersioningFileSystem _versionFileSystem2;
private readonly VersioningDirectoryHandler _rootVersioningDirectoryHandler2;
public CustomVirtualPathVersioningProvider(string name, NameValueCollection configParameters)
: base(name, configParameters)
{
_rootVersioningDirectoryHandler2 = null;
_versionFileSystem2 = null;
Type type = base.GetType();
var field = type.BaseType.GetField("_versionFileSystem", BindingFlags.NonPublic | BindingFlags.Instance);
if (field != null)
_versionFileSystem2 = (VersioningFileSystem) field.GetValue(this);
var field2 = type.BaseType.GetField("_rootVersioningDirectoryHandler", BindingFlags.NonPublic | BindingFlags.Instance);
if (field2 != null)
_rootVersioningDirectoryHandler2 = (VersioningDirectoryHandler) field2.GetValue(this);
}
public override System.Web.Hosting.VirtualDirectory GetDirectory(string virtualPath)
{
string handledPath;
if (!this.TryGetHandledAbsolutePath(virtualPath, out handledPath))
return this.Previous.GetDirectory(virtualPath);
var secretString = GetInternalVPPReadOnlyPageDir();
if (object.ReferenceEquals((object) this, (object) VirtualPathHandler.PageFolderProvider) && string.Equals(secretString, handledPath, StringComparison.OrdinalIgnoreCase))
return (VirtualDirectory) this.ReadOnlyPageDirectory;
virtualPath = handledPath;
List<string> directories;
if (!this.TrySplitVirtualPath(virtualPath, out directories))
return this.Previous.GetDirectory(virtualPath);
VersioningDirectoryHandler handler = this.GetHandler2(directories, directories.Count);
if (handler == null)
return (VirtualDirectory) null;
//replacing with our own CustomVersioningDirectory
var customVersioningDirectory = new CustomVersioningDirectory(this, virtualPath, handler, _versionFileSystem2, ConfigFileSummaryFullPath, BypassAccessCheck);
if (!customVersioningDirectory.QueryDistinctAccess(AccessLevel.Read))
throw new UnauthorizedAccessException("You are not authorized to access " + virtualPath);
if (!this.AcceptDirectoryRequest((UnifiedDirectory)customVersioningDirectory))
return (VirtualDirectory) null;
return (VirtualDirectory)customVersioningDirectory;
}
/// <summary>
/// helper-method to get private string VirtualPathHandler.VirtualPathToReadOnlyPageDirectory
/// </summary>
/// <returns></returns>
private string GetInternalVPPReadOnlyPageDir()
{
var myPageDirectoryRootVirtualPath = string.Empty;
Type type = VirtualPathHandler.Instance.GetType();
var field = type.GetField("_pageDirectoryRootVirtualPath", BindingFlags.NonPublic | BindingFlags.Static);
if (field != null)
myPageDirectoryRootVirtualPath = field.GetValue(VirtualPathHandler.Instance) as string;
return VirtualPathUtility.AppendTrailingSlash(myPageDirectoryRootVirtualPath + 0.ToString());
}
private VersioningDirectoryHandler GetHandler2(List<string> pathStructure, int depth)
{
VersioningDirectoryHandler directoryHandler = this._rootVersioningDirectoryHandler2;
for (int index = 0; index < depth; ++index)
{
if ((directoryHandler = (VersioningDirectoryHandler)directoryHandler.GetSubDirectory(pathStructure[index])) == null)
return (VersioningDirectoryHandler)null;
}
return directoryHandler;
}
}
http://world.episerver.com/modules/forum/pages/thread.aspx?id=25892
When I search for images (and other stuff), I have to add an asterix (*) to the query in order to get any hits. Is there a possible fix to this?
The search in the upper right corner works fine, but not if you go til VPP-manager->click the search for button->enter a query without *
screenshot: [IMG]http://i42.tinypic.com/15s4u1i.png[/IMG]
http://i42.tinypic.com/15s4u1i.png