Foren

Filter and Refine contents based on multiple categories?

thumbnail
Sheetal Sharma, geändert vor 12 Jahren.

Filter and Refine contents based on multiple categories?

New Member Beiträge: 4 Beitrittsdatum: 09.03.11 Neueste Beiträge
We are using asset-publisher and categories navigation portlets. Displaying content’s based on category and tags criteria works well but how should we get results by filtering and refining results based on check-box(es)/links selected? We have seen faceted-search portlet but this does not help in our case.

Here is my solution approach and please guide me here.

intend to solve this by having check boxes instead of links in categories navigation portlet by using a jsp hook and then pass the checked category id’s as request parameters to the action class (and modify the query which is used for retrieving the contents based on category id’s.

So far I am able to create checkboxes as shown in this image. The main problem is identification of the action class which is being called on click of category link in category navigation portlet. Hence I am not able to retrieve the checked categories ids from request.

The current URL displayed on category link hit is as fallows:

http://serverName:8080/web/mediasolutions/demos?p_p_id=122_INSTANCE_K5Gj&p_p_lifecycle=0&p_p_state=normal&p_p_mode=view&p_p_col_id=column-2&p_p_col_count=2&p_r_p_564233524_categoryId=13569

As it clear from above URL it passes a single category id on link click p_r_p_564233524_categoryId=13569. I want to achieve filter and refine approach on click of each check-box and for that I guess I need to be able to

1. Save the current state of results.
2. Should be able refine the current result set on next check-box selection.

**Can any body suggest me the action classes and other relevant information ( code snippets, design docs etc)required for above solution approach?**

I am also fine with what I see here at - http://portal.eqentia.com/socialmedia/connection/1520-Blogs?connection_refine=1587&filter=all

[1]: http://i.stack.imgur.com/LiAKf.jpg
thumbnail
Sheetal Mohan Sharma, geändert vor 12 Jahren.

RE: Filter and Refine contents based on multiple categories?

New Member Beiträge: 4 Beitrittsdatum: 09.03.11 Neueste Beiträge
This has been fixed by using hook in asset-publisher. No changes were required in DB or query. The service layer accepts list of categories and thats what we am sending now.
thumbnail
Alain Dresse, geändert vor 12 Jahren.

RE: Filter and Refine contents based on multiple categories?

Junior Member Beiträge: 95 Beitrittsdatum: 18.07.11 Neueste Beiträge
Sheetal,

Could you please share the hooks on the asset-publisher and on the categories navigator ?

Thanks,
Alain
thumbnail
eastor liu, geändert vor 11 Jahren.

RE: Filter and Refine contents based on multiple categories?

New Member Beiträge: 5 Beitrittsdatum: 17.08.12 Neueste Beiträge
Hello ,here is my hook:
the liferay-hook.xml
<!--?xml version="1.0"?-->


<hook>
<custom-jsp-dir>/WEB-INF/custom_jsps</custom-jsp-dir>
</hook>

and the jsp's location which you have to modify is ROOT/html/portlet/asset_publisher/init.jsp .You should modify it by using hook.

Here is init.jsp:
&lt;%--
/**
 * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */
--%&gt;

&lt;%@ include file="/html/portlet/init.jsp" %&gt;

&lt;%@ page import="com.liferay.portal.NoSuchModelException" %&gt;&lt;%@
page import="com.liferay.portal.kernel.repository.model.FileEntry" %&gt;&lt;%@
page import="com.liferay.portal.kernel.search.Hits" %&gt;&lt;%@
page import="com.liferay.portal.kernel.xml.Document" %&gt;&lt;%@
page import="com.liferay.portal.kernel.xml.Element" %&gt;&lt;%@
page import="com.liferay.portal.kernel.xml.SAXReaderUtil" %&gt;&lt;%@
page import="com.liferay.portal.security.permission.comparator.ModelResourceComparator" %&gt;&lt;%@
page import="com.liferay.portlet.asset.AssetRendererFactoryRegistryUtil" %&gt;&lt;%@
page import="com.liferay.portlet.asset.NoSuchEntryException" %&gt;&lt;%@
page import="com.liferay.portlet.asset.NoSuchTagException" %&gt;&lt;%@
page import="com.liferay.portlet.asset.NoSuchTagPropertyException" %&gt;&lt;%@
page import="com.liferay.portlet.asset.model.AssetCategory" %&gt;&lt;%@
page import="com.liferay.portlet.asset.model.AssetEntry" %&gt;&lt;%@
page import="com.liferay.portlet.asset.model.AssetRenderer" %&gt;&lt;%@
page import="com.liferay.portlet.asset.model.AssetRendererFactory" %&gt;&lt;%@
page import="com.liferay.portlet.asset.model.AssetTag" %&gt;&lt;%@
page import="com.liferay.portlet.asset.model.AssetTagProperty" %&gt;&lt;%@
page import="com.liferay.portlet.asset.model.AssetVocabulary" %&gt;&lt;%@
page import="com.liferay.portlet.asset.service.AssetCategoryLocalServiceUtil" %&gt;&lt;%@
page import="com.liferay.portlet.asset.service.AssetEntryLocalServiceUtil" %&gt;&lt;%@
page import="com.liferay.portlet.asset.service.AssetEntryServiceUtil" %&gt;&lt;%@
page import="com.liferay.portlet.asset.service.AssetTagLocalServiceUtil" %&gt;&lt;%@
page import="com.liferay.portlet.asset.service.AssetTagPropertyLocalServiceUtil" %&gt;&lt;%@
page import="com.liferay.portlet.asset.service.AssetVocabularyLocalServiceUtil" %&gt;&lt;%@
page import="com.liferay.portlet.asset.service.persistence.AssetEntryQuery" %&gt;&lt;%@
page import="com.liferay.portlet.asset.util.AssetUtil" %&gt;&lt;%@
page import="com.liferay.portlet.assetpublisher.search.AssetDisplayTerms" %&gt;&lt;%@
page import="com.liferay.portlet.assetpublisher.search.AssetSearch" %&gt;&lt;%@
page import="com.liferay.portlet.assetpublisher.search.AssetSearchTerms" %&gt;&lt;%@
page import="com.liferay.portlet.assetpublisher.util.AssetPublisherUtil" %&gt;&lt;%@
page import="com.liferay.portlet.documentlibrary.model.DLFileEntry" %&gt;&lt;%@
page import="com.liferay.portlet.documentlibrary.model.DLFileEntryConstants" %&gt;&lt;%@
page import="com.liferay.portlet.documentlibrary.model.DLFolderConstants" %&gt;&lt;%@
page import="com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil" %&gt;&lt;%@
page import="com.liferay.portlet.documentlibrary.util.DocumentConversionUtil" %&gt;&lt;%@
page import="com.liferay.portlet.journal.model.JournalArticle" %&gt;&lt;%@
page import="com.liferay.portlet.journal.model.JournalStructure" %&gt;&lt;%@
page import="com.liferay.portlet.journal.service.JournalStructureLocalServiceUtil" %&gt;&lt;%@
page import="com.liferay.util.RSSUtil" %&gt;&lt;%@
page import="com.liferay.util.xml.DocUtil" %&gt;

&lt;%
PortletPreferences preferences = renderRequest.getPreferences();

String portletResource = ParamUtil.getString(request, "portletResource");

if (Validator.isNotNull(portletResource)) {
	preferences = PortletPreferencesFactoryUtil.getPortletSetup(request, portletResource);
}

String selectionStyle = preferences.getValue("selectionStyle", null);

if (Validator.isNull(selectionStyle)) {
	selectionStyle = "dynamic";
}

boolean defaultScope = GetterUtil.getBoolean(preferences.getValue("defaultScope", null), true);

long[] groupIds = AssetPublisherUtil.getGroupIds(preferences, scopeGroupId, layout);

long[] availableClassNameIds = AssetRendererFactoryRegistryUtil.getClassNameIds();

for (long classNameId : availableClassNameIds) {
	AssetRendererFactory assetRendererFactory = AssetRendererFactoryRegistryUtil.getAssetRendererFactoryByClassName(PortalUtil.getClassName(classNameId));

	if (!assetRendererFactory.isSelectable()) {
		availableClassNameIds = ArrayUtil.remove(availableClassNameIds, classNameId);
	}
}

boolean anyAssetType = GetterUtil.getBoolean(preferences.getValue("anyAssetType", null), true);

long[] classNameIds = AssetPublisherUtil.getClassNameIds(preferences, availableClassNameIds);

long[] classTypeIds = GetterUtil.getLongValues(portletPreferences.getValues("classTypeIds", null));

String customUserAttributes = GetterUtil.getString(preferences.getValue("customUserAttributes", StringPool.BLANK));

AssetEntryQuery assetEntryQuery = new AssetEntryQuery();

String[] allAssetTagNames = new String[0];

if (selectionStyle.equals("dynamic")) {
	if (!ArrayUtil.contains(groupIds, scopeGroupId)) {
		assetEntryQuery = AssetPublisherUtil.getAssetEntryQuery(preferences, ArrayUtil.append(groupIds, scopeGroupId));
	}
	else {
		assetEntryQuery = AssetPublisherUtil.getAssetEntryQuery(preferences, groupIds);
	}

	allAssetTagNames = AssetPublisherUtil.getAssetTagNames(preferences, scopeGroupId);

	assetEntryQuery.setClassTypeIds(classTypeIds);

	AssetPublisherUtil.addUserAttributes(user, StringUtil.split(customUserAttributes), assetEntryQuery);
}

long assetVocabularyId = GetterUtil.getLong(preferences.getValue("assetVocabularyId", StringPool.BLANK));

long assetCategoryId = ParamUtil.getLong(request, "categoryId");

String assetCategoryTitle = null;
String assetVocabularyTitle = null;

if (assetCategoryId &gt; 0) {
	long[] cid=GetterUtil.getLongValues((String[])request.getParameterValues("categoryId"));
	assetEntryQuery.setAllCategoryIds(cid);

	AssetCategory assetCategory = AssetCategoryLocalServiceUtil.getCategory(assetCategoryId);

	assetCategory = assetCategory.toEscapedModel();

	assetCategoryTitle = assetCategory.getTitle(locale);

	AssetVocabulary assetVocabulary = AssetVocabularyLocalServiceUtil.getAssetVocabulary(assetCategory.getVocabularyId());

	assetVocabulary = assetVocabulary.toEscapedModel();

	assetVocabularyTitle = assetVocabulary.getTitle(locale);

	PortalUtil.setPageKeywords(assetCategoryTitle, request);
}

String assetTagName = ParamUtil.getString(request, "tag");

if (Validator.isNotNull(assetTagName)) {
	allAssetTagNames = new String[] {assetTagName};

	long[] assetTagIds = AssetTagLocalServiceUtil.getTagIds(scopeGroupId, allAssetTagNames);

	assetEntryQuery.setAllTagIds(assetTagIds);

	PortalUtil.setPageKeywords(assetTagName, request);
}

boolean showLinkedAssets = GetterUtil.getBoolean(preferences.getValue("showLinkedAssets", null), false);
boolean showOnlyLayoutAssets = GetterUtil.getBoolean(preferences.getValue("showOnlyLayoutAssets", null));

if (showOnlyLayoutAssets) {
	assetEntryQuery.setLayout(layout);
}

if (portletName.equals(PortletKeys.RELATED_ASSETS)) {
	AssetEntry layoutAssetEntry = (AssetEntry)request.getAttribute(WebKeys.LAYOUT_ASSET_ENTRY);

	if (layoutAssetEntry != null) {
		assetEntryQuery.setLinkedAssetEntryId(layoutAssetEntry.getEntryId());
	}
}

boolean mergeUrlTags = GetterUtil.getBoolean(preferences.getValue("mergeUrlTags", null), true);
boolean mergeLayoutTags = GetterUtil.getBoolean(preferences.getValue("mergeLayoutTags", null), false);

String displayStyle = GetterUtil.getString(preferences.getValue("displayStyle", "abstracts"));

if (Validator.isNull(displayStyle)) {
	displayStyle = "abstracts";
}

boolean showAssetTitle = GetterUtil.getBoolean(preferences.getValue("showAssetTitle", null), true);
boolean showContextLink = GetterUtil.getBoolean(preferences.getValue("showContextLink", null), true);
int abstractLength = GetterUtil.getInteger(preferences.getValue("abstractLength", null), 200);
String assetLinkBehavior = GetterUtil.getString(preferences.getValue("assetLinkBehavior", "showFullContent"));
String orderByColumn1 = GetterUtil.getString(preferences.getValue("orderByColumn1", "modifiedDate"));
String orderByColumn2 = GetterUtil.getString(preferences.getValue("orderByColumn2", "title"));
String orderByType1 = GetterUtil.getString(preferences.getValue("orderByType1", "DESC"));
String orderByType2 = GetterUtil.getString(preferences.getValue("orderByType2", "ASC"));
boolean excludeZeroViewCount = GetterUtil.getBoolean(preferences.getValue("excludeZeroViewCount", null));
int delta = GetterUtil.getInteger(preferences.getValue("delta", StringPool.BLANK), SearchContainer.DEFAULT_DELTA);
String paginationType = GetterUtil.getString(preferences.getValue("paginationType", "none"));
boolean showAvailableLocales = GetterUtil.getBoolean(preferences.getValue("showAvailableLocales", null));
boolean showMetadataDescriptions = GetterUtil.getBoolean(preferences.getValue("showMetadataDescriptions", null), true);

boolean defaultAssetPublisher = false;

UnicodeProperties typeSettingsProperties = layout.getTypeSettingsProperties();

String defaultAssetPublisherPortletId = typeSettingsProperties.getProperty(LayoutTypePortletConstants.DEFAULT_ASSET_PUBLISHER_PORTLET_ID, StringPool.BLANK);

if (defaultAssetPublisherPortletId.equals(portletDisplay.getId()) || (Validator.isNotNull(defaultAssetPublisherPortletId) &amp;&amp; defaultAssetPublisherPortletId.equals(portletResource))) {
	defaultAssetPublisher = true;
}

boolean enablePermissions = GetterUtil.getBoolean(preferences.getValue("enablePermissions", null));

assetEntryQuery.setEnablePermissions(enablePermissions);

boolean enableRelatedAssets = GetterUtil.getBoolean(preferences.getValue("enableRelatedAssets", null), true);
boolean enableRatings = GetterUtil.getBoolean(preferences.getValue("enableRatings", null));
boolean enableComments = GetterUtil.getBoolean(preferences.getValue("enableComments", null));
boolean enableCommentRatings = GetterUtil.getBoolean(preferences.getValue("enableCommentRatings", null));
boolean enableTagBasedNavigation = GetterUtil.getBoolean(preferences.getValue("enableTagBasedNavigation", null));

String[] conversions = DocumentConversionUtil.getConversions("html");
String[] extensions = preferences.getValues("extensions", new String[0]);
boolean openOfficeServerEnabled = PrefsPropsUtil.getBoolean(PropsKeys.OPENOFFICE_SERVER_ENABLED, PropsValues.OPENOFFICE_SERVER_ENABLED);
boolean enableConversions = openOfficeServerEnabled &amp;&amp; (extensions != null) &amp;&amp; (extensions.length &gt; 0);
boolean enablePrint = GetterUtil.getBoolean(preferences.getValue("enablePrint", null));
boolean enableFlags = GetterUtil.getBoolean(preferences.getValue("enableFlags", null));
boolean enableSocialBookmarks = GetterUtil.getBoolean(preferences.getValue("enableSocialBookmarks", null), true);
String socialBookmarksDisplayStyle = preferences.getValue("socialBookmarksDisplayStyle", "horizontal");
String socialBookmarksDisplayPosition = preferences.getValue("socialBookmarksDisplayPosition", "bottom");

String defaultMetadataFields = StringPool.BLANK;
String allMetadataFields = "create-date,modified-date,publish-date,expiration-date,priority,author,view-count,categories,tags";

String[] metadataFields = StringUtil.split(preferences.getValue("metadataFields", defaultMetadataFields));

boolean enableRSS = GetterUtil.getBoolean(preferences.getValue("enableRss", null));
int rssDelta = GetterUtil.getInteger(preferences.getValue("rssDelta", "20"));
String rssDisplayStyle = preferences.getValue("rssDisplayStyle", RSSUtil.DISPLAY_STYLE_ABSTRACT);
String rssFormat = preferences.getValue("rssFormat", "atom10");
String rssName = preferences.getValue("rssName", portletDisplay.getTitle());

String[] assetEntryXmls = preferences.getValues("assetEntryXml", new String[0]);

boolean viewInContext = assetLinkBehavior.equals("viewInPortlet");

boolean showPortletWithNoResults = false;
boolean groupByClass = (assetVocabularyId == -1);
boolean allowEmptyResults = false;

Map<string, portleturl> addPortletURLs = null;

Format dateFormatDate = FastDateFormatFactoryUtil.getDate(locale, timeZone);
%&gt;

&lt;%@ include file="/html/portlet/asset_publisher/init-ext.jsp" %&gt;

&lt;%!
private String _checkViewURL(String viewURL, String currentURL, ThemeDisplay themeDisplay) {
	if (Validator.isNotNull(viewURL) &amp;&amp; viewURL.startsWith(themeDisplay.getURLPortal())) {
		viewURL = HttpUtil.setParameter(viewURL, "redirect", currentURL);
	}

	return viewURL;
}
%&gt;</string,>


I change the following :

long[] cid=GetterUtil.getLongValues((String[])request.getParameterValues("categoryId"));
assetEntryQuery.setAllCategoryIds(cid);

and deploy your hook .
Enter the url (example):http://localhost:8080/web/guest/tuangou?p_p_id=122_INSTANCE_cV5qhqR4qD22&p_p_lifecycle=0&p_p_state=normal&p_p_mode=view&p_p_col_id=column-1&p_p_col_count=2&p_r_p_564233524_resetCur=true&p_r_p_564233524_categoryId=14719&p_r_p_564233524_categoryId=18103

Now it's ok.
thumbnail
eastor liu, geändert vor 11 Jahren.

RE: Filter and Refine contents based on multiple categories?

New Member Beiträge: 5 Beitrittsdatum: 17.08.12 Neueste Beiträge
i change the "setting tag" like :
allAssetTagNames = (String[])request.getParameterValues("tag");
	if (Validator.isNotNull(allAssetTagNames)) {
		//allAssetTagNames = (String[])request.getParameterValues("tag");
		
		long[] assetTagIds = AssetTagLocalServiceUtil.getTagIds(scopeGroupId, allAssetTagNames);

		assetEntryQuery.setAllTagIds(assetTagIds);
		for( long i: assetEntryQuery.getAllTagIds()){
			out.print("tagid is "+i);
		}

		PortalUtil.setPageKeywords(assetTagName, request);
	}


but it does not work ,i don't know why.
thumbnail
Adnan Yaqoob, geändert vor 8 Jahren.

RE: Filter and Refine contents based on multiple categories?

Junior Member Beiträge: 36 Beitrittsdatum: 24.03.14 Neueste Beiträge
Any idea how to modify the list of selected categories on portlet which appears like "Content with Topic <category> x."

I'm able to modify the logic as desired but it shows only one selected on display. I want to display all the selected categories
See attached picture
Sebastian Wikholm, geändert vor 12 Jahren.

RE: Filter and Refine contents based on multiple categories?

Regular Member Beiträge: 104 Beitrittsdatum: 10.03.11 Neueste Beiträge
If possible could you share that to me too?
thumbnail
Pravin Pawar, geändert vor 11 Jahren.

RE: Filter and Refine contents based on multiple categories?

Junior Member Beiträge: 62 Beitrittsdatum: 17.11.09 Neueste Beiträge
Hi Shital

Sheetal Mohan Sharma:
This has been fixed by using hook in asset-publisher. No changes were required in DB or query. The service layer accepts list of categories and thats what we am sending now.


Your inputs will be highly appreciated.
Chris Tantalo, geändert vor 10 Jahren.

RE: Filter and Refine contents based on multiple categories?

Junior Member Beiträge: 33 Beitrittsdatum: 21.08.12 Neueste Beiträge
Sheetal Mohan Sharma,
How did you actually solve this? We are looking into the same thing, and are surprised that the Liferay doesn't support multiple categories to be selected at same time. Can you please give your code as an example on how to do this?
berree annelaure, geändert vor 11 Jahren.

RE: Filter and Refine contents based on multiple categories?

New Member Beitrag: 1 Beitrittsdatum: 02.10.12 Neueste Beiträge
I know i am late but i am very interested by the code of the hooks.
Could you share them with me ?

Thanks
thumbnail
Rahul Bhattacharya, geändert vor 10 Jahren.

RE: Filter and Refine contents based on multiple categories?

Junior Member Beiträge: 58 Beitrittsdatum: 16.01.10 Neueste Beiträge
i implemented this.
you can download it here.