基于多个内容选择器过滤器umbraco 7获取内容节点
Get content nodes based on multiple content picker filters umbraco 7
我有一个名为 Career Item
的文档类型,其中包含一些属性和 2 个内容选择器。一个是选择一种职业:例如。驱动程序,另一个用于选择将放置职业的分支:例如。比利时根特。
我的职业类型和分支位于单独的 Content repository
中,这意味着它们没有模板,它只是一个具有可用于多个内容页面的属性的文档。
我为此创建了 2 个过滤器,其中一些 jQuery 我设法根据选择设置 url 以获得 url,例如:
http://localhost:59733/nl/vacatures/?f=1075&f=1076&b=1085&b=1082
这里有包含 Career type
ID 的 f
和包含 Branch
ID 的 b
。
现在在我的剃须刀中,我正在根据选择过滤内容节点,但它非常混乱。
// Collect values for branch and function from the url querystring to perform filtering
var branch = umbraco.library.RequestQueryString("b"); // eg: 1085,1082 from example url above
var function = umbraco.library.RequestQueryString("f"); // eg: 1075,1076 from example url above
// Take the careers list content node
var careersList = Umbraco.TypedContentAtRoot().DescendantsOrSelf("CareersList").FirstOrDefault();
var careerItems = careersList.Children.Where("Visible");
string query = "";
string funcQuery = "";
string branchQuery = "";
// Filter on fuction
if (!String.IsNullOrEmpty(function))
{
// Property alias function: content picker
string[] functions = function.Split(',');
foreach (string func in functions)
{
if (!String.IsNullOrEmpty(funcQuery))
{
funcQuery += " || function == \"" + func + "\"";
}
else
{
funcQuery = "function == \"" + func + "\"";
}
}
}
// Filter on branch
if (!String.IsNullOrEmpty(branch))
{
// Property alias branch: content picker
string[] branches = branch.Split(',');
foreach (string br in branches)
{
if (!String.IsNullOrEmpty(branchQuery))
{
branchQuery += " || branch == \"" + br + "\"";
}
else
{
branchQuery = "branch == \"" + br + "\"";
}
}
}
funcQuery = !String.IsNullOrEmpty(funcQuery) ? "(" + funcQuery + ")" : "";
branchQuery = !String.IsNullOrEmpty(branchQuery) ? "(" + branchQuery + ")" : "";
query = funcQuery + (!String.IsNullOrEmpty(branchQuery) ? " && " + branchQuery : "");
if (!String.IsNullOrEmpty(query))
{
careerItems = careerItems.Where(query);
}
我是不是遗漏了什么,可以简化吗?因为现在它只有 2 个过滤器,但是如果我有 5 或 6 个过滤器,那么这是行不通的...
/迈克尔
你可以这样使用:
var branch = "1085,1082";
var function = "1075,1076";
var careerTypes =
careersList
.Where(c => c.IsVisible()
&&
branch.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(i => int.Parse(i))
.Contains(c.GetPropertyValue<int>("branchId"))
&&
branch.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(b => int.Parse(b))
.Contains(c.GetPropertyValue<int>("functionId"))
);
//branchId and functionId are the property names of those 2 content pickers
我也可能会考虑将其全部放在 IPublishedContent 的扩展方法中,称为 CheckFilters 之类的方法,它接受数组作为参数,因此您可以执行以下操作:
var branches = Request.QueryString("b").Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var functions= Request.QueryString("f").Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var careerTypes = careersList.Where(a => a.IsVisible() && a.CheckFilters(branches, functions));
您可以在扩展方法中拥有所有逻辑,然后很容易添加额外的过滤器,因为您只需修改扩展方法,或添加新的重载。
您也不需要使用 umbraco.library.RequestQueryString,因为它只是 Request.QueryString 函数的包装器。
这是扩展方法的一个非常粗略的例子:
public static bool CheckFilters(this IPublishedContent content, string[] branches, string[] functions)
{
return branches.Contains(content.GetPropertyValue<string>("branchPropertyAlias", "")) && functions.Contains(content.GetPropertyValue<string>("functionPropertyAlias", ""));
}
这是一个非常简单的示例,假设内容项只有一个分支和一个功能。
我有一个名为 Career Item
的文档类型,其中包含一些属性和 2 个内容选择器。一个是选择一种职业:例如。驱动程序,另一个用于选择将放置职业的分支:例如。比利时根特。
我的职业类型和分支位于单独的 Content repository
中,这意味着它们没有模板,它只是一个具有可用于多个内容页面的属性的文档。
我为此创建了 2 个过滤器,其中一些 jQuery 我设法根据选择设置 url 以获得 url,例如:
http://localhost:59733/nl/vacatures/?f=1075&f=1076&b=1085&b=1082
这里有包含 Career type
ID 的 f
和包含 Branch
ID 的 b
。
现在在我的剃须刀中,我正在根据选择过滤内容节点,但它非常混乱。
// Collect values for branch and function from the url querystring to perform filtering
var branch = umbraco.library.RequestQueryString("b"); // eg: 1085,1082 from example url above
var function = umbraco.library.RequestQueryString("f"); // eg: 1075,1076 from example url above
// Take the careers list content node
var careersList = Umbraco.TypedContentAtRoot().DescendantsOrSelf("CareersList").FirstOrDefault();
var careerItems = careersList.Children.Where("Visible");
string query = "";
string funcQuery = "";
string branchQuery = "";
// Filter on fuction
if (!String.IsNullOrEmpty(function))
{
// Property alias function: content picker
string[] functions = function.Split(',');
foreach (string func in functions)
{
if (!String.IsNullOrEmpty(funcQuery))
{
funcQuery += " || function == \"" + func + "\"";
}
else
{
funcQuery = "function == \"" + func + "\"";
}
}
}
// Filter on branch
if (!String.IsNullOrEmpty(branch))
{
// Property alias branch: content picker
string[] branches = branch.Split(',');
foreach (string br in branches)
{
if (!String.IsNullOrEmpty(branchQuery))
{
branchQuery += " || branch == \"" + br + "\"";
}
else
{
branchQuery = "branch == \"" + br + "\"";
}
}
}
funcQuery = !String.IsNullOrEmpty(funcQuery) ? "(" + funcQuery + ")" : "";
branchQuery = !String.IsNullOrEmpty(branchQuery) ? "(" + branchQuery + ")" : "";
query = funcQuery + (!String.IsNullOrEmpty(branchQuery) ? " && " + branchQuery : "");
if (!String.IsNullOrEmpty(query))
{
careerItems = careerItems.Where(query);
}
我是不是遗漏了什么,可以简化吗?因为现在它只有 2 个过滤器,但是如果我有 5 或 6 个过滤器,那么这是行不通的...
/迈克尔
你可以这样使用:
var branch = "1085,1082";
var function = "1075,1076";
var careerTypes =
careersList
.Where(c => c.IsVisible()
&&
branch.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(i => int.Parse(i))
.Contains(c.GetPropertyValue<int>("branchId"))
&&
branch.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(b => int.Parse(b))
.Contains(c.GetPropertyValue<int>("functionId"))
);
//branchId and functionId are the property names of those 2 content pickers
我也可能会考虑将其全部放在 IPublishedContent 的扩展方法中,称为 CheckFilters 之类的方法,它接受数组作为参数,因此您可以执行以下操作:
var branches = Request.QueryString("b").Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var functions= Request.QueryString("f").Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var careerTypes = careersList.Where(a => a.IsVisible() && a.CheckFilters(branches, functions));
您可以在扩展方法中拥有所有逻辑,然后很容易添加额外的过滤器,因为您只需修改扩展方法,或添加新的重载。
您也不需要使用 umbraco.library.RequestQueryString,因为它只是 Request.QueryString 函数的包装器。
这是扩展方法的一个非常粗略的例子:
public static bool CheckFilters(this IPublishedContent content, string[] branches, string[] functions)
{
return branches.Contains(content.GetPropertyValue<string>("branchPropertyAlias", "")) && functions.Contains(content.GetPropertyValue<string>("functionPropertyAlias", ""));
}
这是一个非常简单的示例,假设内容项只有一个分支和一个功能。