在Plone中自定义搜索portlet以获取特定内容类型

时间:2013-11-01 17:20:46

标签: search plone portlet

我在我的网站的某些区域使用搜索portlet,但我想将结果限制为仅搜索特定内容类型:例如,仅搜索新闻项目,或仅显示Faculty Staff Directory个人资料。

我知道您可以通过“过滤器”列表到达@@search表单后执行此操作,但是有没有办法从过滤器开始,以便“实时搜索”结果仅显示相关结果(即仅新闻项目或仅限个人资料)。

2 个答案:

答案 0 :(得分:4)

我怀疑您已经知道了,但只是为了确定:您可以全局定义哪些类型应该允许在控制面板的导航设置中的搜索结果中显示,然后导出并将相关部分包含在您的产品中#39; s GS-profile - propertiestool.xml

但是,如果您希望仅在某些部分中排除某些类型,则可以自定义已过滤类型的Products.CMFPlone/skins/plone_scripts/livesearch_reply,以仅显示" friendly_types"围绕第38行(版本4.3.1)并添加如下条件:

修改 我删除了解决方案以检查上下文的absolute_url,因为在这种情况下上下文实际上是livesearch_reply,而不是当前的section-location。相反,语句现在检查,如果引用者是我们的部分:

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 - 视图只接受明确的字词或要求用户知道,您可以附加星号以获得不清晰的结果。

  • 当点击livesearch-input中的Enter / Return键时,searchterm将被传输到目标网页的@@search)输入元素,而点击& #39;高级搜索...&#39;搜索项目迷失了。

<强>更新 为了克服这些尖锐的结果,您可以在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);

<强> UPDATE2: 在此相关任务中,Eric Brehault为在提交期间传递asterix提供了更好的解决方案:Customize Plone search

当然你也可以在JS for @@ search中自定义livesearch_reply中的高级搜索链接目标,但这个链接在UI方面是多余的,imho。

另外,如果您仍然使用Archetypes并且根据上下文有更多用于预过滤搜索结果的用例,我建议您查看collective.formcriteria,它允许定义搜索 - 通过UI的标准。我喜欢它的通用和直接的plone-ish方法:编目的indizi和收藏品。与eea.facetednavigation相反,它不会破坏可访问性,并且可以通过一些live-search-js-magic逐步增强。感谢Ross Patterson来到这里!只需通过更改它的视图将集合(旧式)转换为搜索表单,它也可以显示为集合portlet。并且您可以决定用户应该能够更改的标准(例如,您隐藏类型过滤器并提供textsearch-input)。

答案 1 :(得分:3)

在@@ search页面上使用过滤器机制时,观察查询字符串的更改方式。您只需添加/减去目录查询条件。

您可以在搜索表单的隐藏字段中查看任何查询。例如:

<form ...>
    ....
    <input type="hidden" name="portal_type" value="Document" />
</form>

使用过滤器时查询字符串上的表单由于其记录机制而有点复杂,这允许一些最小/最大查询。简单的过滤器更容易。