In Liferay 7, how to create a structure from a Java module?
Here is my attempt:
Map<Locale, String> nameMap = new HashMap<Locale, String>();
nameMap.put(Locale.JAPAN, "The name");
Map<Locale, String> descriptionMap = new HashMap<Locale, String>();
descriptionMap.put(Locale.JAPAN, "The description");
DDMForm ddmForm = DDMUtil.getDDMForm("<here goes my real JSON form>");
DDMFormLayout ddmFormLayout = DDMUtil.getDefaultDDMFormLayout(ddmForm);
DDMStructureLocalServiceUtil.addStructure(
20156, // userId
33421, // groupId
DDMStructureConstants.DEFAULT_PARENT_STRUCTURE_ID, // parentStructureId
PortalUtil.getPortal().getClassNameId(DDLRecordSet.class), // classNameId
new Long(CounterLocalServiceUtil.increment()).toString(), // structureKey
nameMap,
descriptionMap,
ddmForm,
ddmFormLayout,
StorageType.JSON.toString(),
0, // type
new ServiceContext()
);
The structure gets created in the database's DDMStructure
table:
Unfortunately, it does not appear in that site's Liferay UI:
How to make it show up?
- No error appear in Liferay's log during creation nor when loading the UI.
- When I create a structure manually, it shows up correctly.
- The solution to this question for Liferay 6, which I tried too, leads to the same problem.
- I noticed that when creating a structure manually, 3 rows get added to the
ResourcePermission
table... when creating a structure in Java should I also create these 3 objects?
There is a problem with your
ServiceContext
argument to theDDMStructureLocalServiceUtil.addStructure
method. There are 2 ways you can set the context depending on from where you are trying to add the structure:If you are invoking from the servlet that has access to the portlet request, use the following method:
This would take care of all the necessary scope and permission.
If you are implementing it from anywhere else, the best way would be instantiate the ServiceContext and set at least the
scopeGroupId
:You forgot to initialize ServiceContext before call DDMStructureLocalServiceUtil. In the ServiceContext instance you should add default permission:
By doing this before, you make sure that you can view the structure later.
It is a classNameId problem. Replacing
DDLRecordSet
withJournalArticle
solves the problem, making the structure show up correctly in Liferay's Structures UI.Code that works: