2017-05-30 8 views
0

Liferay 7では、Javaモジュールからstructureを作成する方法は?ここで
は私の試みです:Liferay 7構造をプログラムで作成するにはどうすればよいですか?

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() 
); 

構造は、データベースのDDMStructureテーブルに作成されます:

enter image description here

残念ながら、それはそのサイトのLiferayのUIには表示されません。

enter image description here

表示方法アップ?

  • 作成中またはUIの読み込み中に、Liferayのログにエラーは表示されません。
  • 構造を手動で作成すると、構造が正しく表示されます。
  • 私が試したthis question for Liferay 6の解決法は、同じ問題を引き起こします。
  • 私は、構造体を手動で作成するときに、3行がResourcePermissionテーブルに追加されることに気付きました。Javaで構造を作成するときに、これらの3つのオブジェクトを作成する必要がありますか?

答えて

0

それはclassNameId問題です:

あなたはどこからでも、それを実装する場合、最良の方法は、少なくともscopeGroupId ServiceContextのをインスタンス化し、設定されます。 DDLRecordSetJournalArticleに置き換えると、問題が解決され、Liferayの構造UIに構造が正しく表示されます。作品

コード:

ServiceContext serviceContext = new ServiceContext(); 
serviceContext.setScopeGroupId(group.getGroupId()); 
serviceContext.setAddGroupPermissions(true); 
serviceContext.setAddGuestPermissions(true); 
serviceContext.setWorkflowAction(WorkflowConstants.ACTION_PUBLISH); 

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 = null; 
try { 
    ddmForm = DDMUtil.getDDMForm(json); 
} catch (PortalException e) { 
    log.error("Exception when parsing structure JSON", e); 
} 

DDMFormLayout ddmFormLayout = DDMUtil.getDefaultDDMFormLayout(ddmForm); 
long scopeClassNameId = PortalUtil.getPortal().getClassNameId(JournalArticle.class); 
long parentStructureId = DDMStructureConstants.DEFAULT_PARENT_STRUCTURE_ID; 
String storageType = StorageType.JSON.toString(); 
String structureKey = "my structure"; 

try { 
    DDMStructure ddmStructure = DDMStructureLocalServiceUtil.addStructure(
     user.getUserId(), group.getGroupId(), parentStructureId, 
     scopeClassNameId, structureKey, 
     nameMap, descriptionMap, ddmForm, ddmFormLayout, storageType, 
     DDMStructureConstants.TYPE_DEFAULT, serviceContext); 
} catch (StructureDuplicateStructureKeyException e) { 
    log.info("Skipping creation of structure that already exists"); 
} catch (PortalException e) { 
    log.error("Exception when creating structure: " + structureDefinitionFilePath, e); 
} 
0

DDMStructureLocalServiceUtilを呼び出す前にServiceContextを初期化するのを忘れました。 ServiceContextのインスタンスでは、既定のアクセス許可を追加する必要があります前に、これを行うことにより、

ServiceContext context = new ServiceContext(); 
    context.setAddGroupPermissions(true); 
    context.setAddGuestPermissions(true); 

は、あなたが後で構造を見ることができることを確認してください。

+0

は先端をありがとう!私はこれらの3行を追加し、その 'serviceContext'を' addStructure'呼び出しに使用しました。その後、私は新しいサイトを作成し、モジュールを再度展開/実行しました。しかし、作成された構造はサイトのLiferay UIに表示されず、 'Basic Web Content'のみが表示されます。 –

0

DDMStructureLocalServiceUtil.addStructureメソッドの引数であるServiceContextに問題があります。あなたが構造を追加しようとしているところからに応じてコンテキストを設定することができ、2つの方法があります。ポートレット要求へのアクセスを持っているサーブレットから呼び出す場合

は、以下の方法を使用します。

ServiceContextFactory.getInstance(className, portletRequest); 

これは必要なすべてのスコープと権限を処理します。

ServiceContext serviceContext = new ServiceContext(); 
serviceContext.setScopeGroupId(myGroupId); 
serviceContext.setAddGroupPermissions(true); 
+0

チップをありがとう!私はモジュール(サーブレットなし)を書いていますので、答えの最後の3行を追加し、 'serviceContext'を' addStructure'呼び出しで使用しました。その後、私は新しいサイトを作成し、モジュールを再度展開/実行しました。しかし、作成された構造はサイトのLiferay UIに表示されず、 'Basic Web Content'のみが表示されます。 –

+0

addStructureメソッドでは、classnameIdはJournalArticleであるべきではありませんか?また、サービスコンテキストでユーザーIDを設定することもできますか? – YuVi

+0

はい、私の答えに見られるように、classNameIdが問題でした。 –

関連する問題