Как создать структуру и шаблон программно в Liferay 6

Мне нужно программно создать структуру и шаблон с помощью java-кода. Я использовал следующие фрагменты кода.

Структура:

public void createStructure(String userName,long userId){
        log_.info("Inside create structure ");
        long structureId=115203;
        DDMStructure ddmStructure=DDMStructureLocalServiceUtil.createDDMStructure(structureId);
        ddmStructure.setName("MigrationStructure");
        ddmStructure.setDescription("This Structure created programatically");
        ddmStructure.setUserId(userId);
        ddmStructure.setUserName(userName);
        File fXmlFile = new File("D:/FilesDataMigration/structure.xml");        
        try {           
            Document document = SAXReaderUtil.read(fXmlFile);
            ddmStructure.setDocument(document);
            DDMStructureLocalServiceUtil.addDDMStructure(ddmStructure);
        }catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SystemException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   
        log_.info("Inside create structure done");
    }

Шаблон:

public void createTemplate(String userName,long userId){
        log_.info("Inside create template ");
        long templateId=12504;
        DDMTemplate ddmTemplate=DDMTemplateLocalServiceUtil.createDDMTemplate(templateId);
        ddmTemplate.setName("MigrationTemplate");
        ddmTemplate.setDescription("This Template created programatically");
        ddmTemplate.setUserId(userId);
        ddmTemplate.setUserName(userName);

        try {
            BufferedReader br = new BufferedReader(new FileReader("D:/FilesDataMigration/template.txt"));
            StringBuilder sb = new StringBuilder();
            String line = br.readLine();

            while (line != null) {
                sb.append(line);
                sb.append(System.lineSeparator());
                line = br.readLine();
            }
            String script = sb.toString();
            ddmTemplate.setScript(script);
            DDMTemplateLocalServiceUtil.addDDMTemplate(ddmTemplate);
        }catch(IOException e){
            e.printStackTrace();
        } catch (SystemException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        log_.info("Inside create template done");
    }

Приведенные выше фрагменты выполняются правильно, без каких-либо исключений, но не могут отображаться в разделе содержимого панели управления. Предложите мне, если что-то не так


person Kona Laxman Deepak    schedule 06.04.2016    source источник
comment
Прежде всего, какие структуры или шаблоны вы хотите создать?   -  person Parkash Kumar    schedule 06.04.2016
comment
Вы не устанавливаете все необходимые свойства, такие как classNameId, language и т. д.   -  person Parkash Kumar    schedule 06.04.2016
comment
Кроме того, лучше использовать DDMStructure ddmStructure = DDMStructureUtil.create(CounterLocalServiceUtil.increment()); и DDMTemplate ddmTemplate = DDMTemplateUtil.create(CounterLocalServiceUtil.increment()); вместо жестко заданных идентификаторов.   -  person Parkash Kumar    schedule 06.04.2016
comment
@ParkashKumar Большое спасибо, у меня это работает. Но я сомневаюсь, как установить classNameId и ClassName без жесткого кодирования, как вы предложили для идентификатора структуры.   -  person Kona Laxman Deepak    schedule 07.04.2016
comment
ddmStructure.setClassName(com.liferay.portlet.journal.model.JournalArticle); ddmStructure.setClassNameId(10109); Это не правильный способ сделать. Пожалуйста, не могли бы вы предложить мне   -  person Kona Laxman Deepak    schedule 07.04.2016
comment
Вы можете получить объект ClassName с помощью ClassName className = ClassNameLocalServiceUtil.getClassName(""com.liferay.portlet.journal.model.JournalArticle"");, затем использовать className.getClassNameId() для установки classNameId для структуры/шаблона.   -  person Parkash Kumar    schedule 07.04.2016
comment
Кроме того, лучше использовать DDMStructureUtil.update(ddmStructure); вместо DDMStructureLocalServiceUtil.addDDMStructure(ddmStructure);, когда вы закончите настройку необходимых свойств. То же самое касается и DDMTemplate.   -  person Parkash Kumar    schedule 07.04.2016
comment
Не забудьте связать свою структуру с сайтом: ddmStructure.setGroupId(groupId);   -  person Nicolas Raoul    schedule 29.05.2017
comment
а также компания (идентификатор экземпляра): ddmStructure.setCompanyId(PortalUtil.getDefaultCompanyId());   -  person Nicolas Raoul    schedule 29.05.2017


Ответы (1)


Есть пара проблем с вашим кодом:

  1. Вы не устанавливаете все необходимые свойства, такие как groupId, companyId, classNameId, structureKey, dates и т. д.

  2. Не существует методов setName и setDescription для DDMStructure или DDMTemplate, принимающих String аргумент (Liferay 6.2 GA2). Вместо этого есть только методы setNameMap и setDescriptionMap для принятия Map<Locale, String>.

  3. Используйте динамические идентификаторы (structureId и templateId) вместо жестко заданных идентификаторов, например: DDMStructure ddmStructure = DDMStructureUtil.create(CounterLocalServiceUtil.increment());и DDMTemplate ddmTemplate = DDMTemplateUtil.create(CounterLocalServiceUtil.increment());.

  4. Для classNameId вы можете получить его, используя его значение, например:
    ClassName className = ClassNameLocalServiceUtil.getClassName("com.liferay.portlet.journal.model.Journ‌​alArticle"); long classNameId = className.getClassNameId();

  5. Кроме того, лучше использовать update над заполненным объектом вместо добавления: DDMStructureUtil.update(ddmStructure); и DDMTemplateUtil.update(ddmTemplate);

Кроме того, если у вас есть доступ к объекту ThemeDisplay, вы можете получить от него groupId, companyId, userId, userFullName. Также установите new Date() для свойств createDate и modifiedDate.

person Parkash Kumar    schedule 07.04.2016
comment
Большое спасибо за ваше время и терпение. Я установил некоторые вещи, но не обновлял здесь. Вы очень хорошо объяснили здесь, очень четко поняли и узнали некоторые из лучших практик. - person Kona Laxman Deepak; 11.04.2016
comment
Я могу установить все, но как насчет ключа структуры, так как он ожидает Stirng. Как избежать жесткого кодирования этого. - person Kona Laxman Deepak; 11.04.2016
comment
Ну, я не совсем уверен в этом, но, просматривая записи структур веб-контента в базе данных, я заметил, что structureKey всегда -1 из structureId. Поэтому вы можете установить его как String structureKey = Long.toString(ddmStructure.getStrucutureId() - 1); - person Parkash Kumar; 11.04.2016
comment
хорошо. Спасибо. Но я не видел в БД, как вы сказали. Если я создаю напрямую, не устанавливая StructureKey, он автоматически заполняется в БД - person Kona Laxman Deepak; 12.04.2016
comment
Это нормально, это то, что я наблюдал в своей базе данных при создании структур из панели управления. - person Parkash Kumar; 12.04.2016