Liferay 7 Расширение EditableFragmentEntryProcessor

Я хочу расширить функциональность EditableFragmentEntryProcessor в Liferay 7.4 ( теги <lfr-editable> во фрагментах) путем поиска в текстовых синтаксисах, таких как {user.name}, и замены его значением из ответа из моего внешнего API.

бывший

Я печатаю что-то вроде

      This is super fragment and you are {user.name}.

И результат должен быть

      This is super fragment and you are Steven.

Я добился этого, создав свой собственный FragmentEntryProcessor, но я сделал это, поместив переменную конфигурации фрагмента в свой собственный тег

      <my-data-api> ${configuration.testVariable} </my-data-api>

Я пробовал что-то подобное раньше

      <my-data-api> 
  <lfr-editable id="some-id" type="text">  
    some text to edit
  </lfr-editable>
</my-data-api>

И это не работает (и я знаю почему).

Вот я и хочу получить что-то вроде этого. Цените любую помощь или подсказки.

РЕДАКТИРОВАТЬ:

Вот мой пользовательский FragmentEntryProcessor:

      package com.example.fragmentEntryProcessorTest.portlet;

import com.example.test.api.api.TestPortletApi;
import com.liferay.fragment.exception.FragmentEntryContentException;
import com.liferay.fragment.model.FragmentEntryLink;
import com.liferay.fragment.processor.FragmentEntryProcessor;
import com.liferay.fragment.processor.FragmentEntryProcessorContext;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.util.Validator;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;

import java.io.IOException;

/**
 * @author kabatk
 */

@Component(
        immediate = true, property = "fragment.entry.processor.priority:Integer=100",
        service = FragmentEntryProcessor.class
)

public class FragmentEntryProcessorApiDataCopy implements FragmentEntryProcessor {

    private static final String _TAG = "my-data-api";

    @Reference
    private TestPortletApi _api;

    @Override
    public String processFragmentEntryLinkHTML(
            FragmentEntryLink fragmentEntryLink, String html,
            FragmentEntryProcessorContext fragmentEntryProcessorContext)
            throws PortalException {

        Document document = _getDocument(html);
        Elements elements = document.getElementsByTag(_TAG);
        elements.forEach(
                element -> {
                    String text = element.text();
                    String attrValue = element.attr("dataType");
                    String classValues = element.attr("classes");
                    Element myElement = null;
                    String result;

                    try {
                        result = _api.changeContent(text);
                    } catch (IOException e) {
                        e.printStackTrace();
                        result = "";
                    }

                    if(attrValue.equals("img")){
                        myElement = document.createElement("img");
                        myElement.attr("class", classValues);
                        myElement.attr("src", result);

                    }else if(attrValue.equals("text")){
                        myElement = document.createElement("div");
                        myElement.attr("class", classValues);
                        myElement.html(result);
                    }

                    if(myElement != null)
                        element.replaceWith(myElement);
                    else
                        element.replaceWith(
                            document.createElement("div").text("Error")
                        );
                });

        Element bodyElement = document.body();

        return bodyElement.html();

    }

    @Override
    public void validateFragmentEntryHTML(String html, String configuration)
            throws PortalException {

        Document document = _getDocument(html);

        Elements elements = document.getElementsByTag(_TAG);

        for (Element element : elements) {
            if (Validator.isNull(element.attr("dataType"))) {
                throw new FragmentEntryContentException("Missing 'dataType' attribute!");
            }
        }
    }

    private Document _getDocument(String html) {
        Document document = Jsoup.parseBodyFragment(html);

        Document.OutputSettings outputSettings = new Document.OutputSettings();

        outputSettings.prettyPrint(false);

        document.outputSettings(outputSettings);

        return document;
    }

}


0 ответов

Другие вопросы по тегам