我在我网站的某些区域使用搜索 portlet,但我想将结果限制为仅搜索特定内容类型:例如仅搜索新闻项目,或仅显示教职员工目录配置文件。
我知道您可以在@@search
通过“过滤器”列表进入表单后执行此操作,但是有没有办法从过滤器开始,以便“实时搜索”结果仅显示相关结果(即仅新闻项目或仅配置文件)。
我怀疑你已经知道了,但只是为了确定:你可以在控制面板的导航设置中全局定义哪些类型应该被允许显示在搜索结果中,然后将相关部分导出并包含到你的产品的 GS 配置文件中- propertiestool.xml
。
但是,如果您希望仅在某些部分中排除某些类型,您可以自定义Products.CMFPlone/skins/plone_scripts/livesearch_reply
已过滤类型的 ,仅在第 38 行(版本 4.3.1)附近显示“friendly_types”并添加如下条件:
编辑: 我删除了检查上下文的 absolute_url 的解决方案,因为在这种情况下,上下文实际上是 livesearch_reply,而不是当前的部分位置。相反,如果引用者是我们的部分,则该语句现在检查:
REQUEST = context.REQUEST
current_location = REQUEST['HTTP_REFERER']
location_to_filter = '/fullpath/relative/to/siteroot/sectionId'
url_to_filter = str(portal_url) + location_to_filter
types_to_filter = ['Event', 'News Item']
if current_location.find(url_to_filter) != -1 or current_location.endswith(url_to_filter):
friendly_types = types_to_filter
else:
friendly_types = ploneUtils.getUserFriendlyTypes()
然而,如果用户点击 Return 键或 Enter 键或“高级搜索...”链接,则这会使案例处于打开状态,从而登陆与肝脏结果不同的结果页面。
更新: 将过滤应用于@@search-template 的机会可以是注册具有以下内容的Javascript:
(function($) {
$(document).ready(function() {
// Let's see, if we are coming from our special section:
if (document.referrer.indexOf('/fullpath/relative/to/siteroot/sectionId') != -1) {
// Yes, we have the button to toggle portal_type-filter:
if ($('#pt_toggle').length>0) {
// If it's checked we uncheck it:
if ($('#pt_toggle').is(':checked')) {
$('#pt_toggle').click();
}
// If for any reason it's not checked, we check and uncheck it,
// which results in NO types to filter, for now:
else {
$('#pt_toggle').click();
$('#pt_toggle').click();
}
// Then we check types we want to filter:
$("input[value='Event']").click();
$("input[value='News Item']").click();
}
}
})
})(jQuery);
此外,不同的用户操作会导致不同的、不一致的行为:
Livesearch 接受不清晰的术语,而@@search
-view 只接受尖锐的术语或要求用户知道,您可以为不清晰的结果附加星号。
当在 livesearch-input 中按下 Enter/Return 键时,搜索词将被传输到登录页面的 ( @@search
) 输入元素,而当单击“高级搜索...”时,搜索词会丢失。
更新: 为了克服尖锐的结果,您可以在 if 语句之后将其添加到 JS:
// Get search-term and add an asterix for blurry results:
var searchterm = decodeURI(window.location.search.replace(new RegExp("^(?:.*[&\\?]" + encodeURI('SearchableText').replace(/[\.\+\*]/g, "\\$&") + "(?:\\=([^&]*))?)?.*$", "i"), "$1")) + '*';
// Insert new searchterm in input-text-field:
$('input[name=SearchableText]').val(searchterm);
更新 2 : 在这个相关的任务中,Eric Brehault 提供了一个更好的解决方案,用于在提交期间通过 asterix:自定义 Plone 搜索
当然你也可以在livesearch_reply中自定义advanced-search-link的目标,分别在@@search的JS中,但是这个链接在UI方面是相当多余的,恕我直言。
此外,如果您仍然使用 Archetypes 并且根据上下文有更多用于预过滤搜索结果的用例,我可以建议您看一下collective.formcriteria,它允许通过 UI 定义搜索条件。我喜欢它,因为它是通用且直接的 plone-ish 方法:编目 indizi 和集合。与 eea.facetednavigation 不同的是,它不会破坏可访问性,并且可以通过一些 live-search-js-magic 逐步增强,只需一点点努力。向罗斯帕特森致敬这里!只需通过更改其视图将集合(旧样式)转换为搜索表单,它也可以显示为集合 Portlet。您可以决定用户应该能够更改哪些标准(例如隐藏类型过滤器并提供文本搜索输入)。
在@@search 页面上使用过滤器机制时,观察查询字符串的变化。您只是添加/减去目录查询条件。
您可以在搜索表单的隐藏字段中进行任何查询。例如:
<form ...>
....
<input type="hidden" name="portal_type" value="Document" />
</form>
当您使用过滤器时,查询字符串上的表单因其记录机制而有点复杂,它允许一些最小/最大查询。简单的过滤器要容易得多。