好吧,伙计们,我在这里陷入困境。
基本上我遇到的问题是,当人们在搜索某些东西时,他们在很多时候都错误地输入了代码,例如在搜索时:K00000WEFLZ
他们错误地输入了 0,然后产品结果什么也没有返回,我基本上是想尝试让搜索检查搜索是否在字母“K”之后包含一定数量的 0(因为 K 总是会说 10+ 个 ID 号和至少 4-5 个 0),如果它会在搜索操作期间将其替换为“*”,并且无论他们输入的问题有多么错误,您仍然可以找到产品。
我知道我将不得不创建一个自定义类并覆盖它的默认值(但是其中很多无法访问/是私有的),因为默认搜索模式无法更改,因为这将为每个人更改它,我只想要它用于这个特定的站点。
我也不能在开头或结尾使用通配符,因为它有一个庞大的目录,它会将英里数与许多结果相匹配。
据我所知,这是处理默认逻辑类搜索的代码:
protected virtual IList<Product> CreateCustomCollection()
{
var list = new List<Product>();
switch (mode)
{
case ProductRepeaterMode.Search:
if (Page.Request.QueryString["search"] != null && Page.Request.QueryString["search"].Length != 0)
{
bool[] customString = new bool[5] { SearchCustomString1, SearchCustomString2, SearchCustomString3, SearchCustomString4, SearchCustomString5 };
IList<Product> results = Fabric.ObjectProvider.Get<IProductSearchCommand>().Search(Page.Request.QueryString["search"], out searchWords, IncludeSkus, IsPublicFacing, customString, CoreHttpModule.Session);
var retailOrder = WebStoreManager.CurrentOrder as IRetailOrder;
var accountOrder = WebStoreManager.CurrentOrder as IAccountOrder;
IList<Product> productsToRemove = new List<Product>();
IList<Product> productsToAdd = new List<Product>();
foreach (var product in results)
{
if (hideRestrictedProducts)
{
if (retailOrder != null)
{
if (!product.CanBePurchasedByRetailCustomer || product.AgentOnly)
productsToRemove.Add(product);
}
else
{
if (accountOrder != null)
{
var add = false;
if (product.CanBePurchasedOnAccount)
add = true;
if (product.AgentOnly)
{
if (accountOrder.Agent != null)
add = true;
else
add = false;
}
if (!add)
productsToRemove.Add(product);
}
}
}
// Replace SKUs with lines
if (resolveSkusToLines)
{
var sku = product.Role as SkuProductRole;
if (sku != null)
{
productsToRemove.Add(product);
if (sku.Owner != null && sku.Owner.Product != null)
{
var line = sku.Owner.Product;
if (!results.Contains(line) && !productsToAdd.Contains(line))
productsToAdd.Add(line);
}
}
}
}
foreach (Product product in productsToAdd)
{
results.Add(product);
}
foreach (Product product in productsToRemove)
{
results.Remove(product);
}
foreach (var result in results)
list.Add(result);
}
break;
}
return list;
}