Сохранять пары ключ-значение из AutoFields, используя DefaultConfigurationAction - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь сохранить набор пар ключ-значение в базе данных, используя AutoFields и DefaultConfigurationAction.Это необходимо для сохранения соответствия между именами AD и именами, удобочитаемыми человеком.Мне трудно сделать настройки, которые я установил вручную, доступными для конечного пользователя.Я посмотрел на базу данных и обнаружил, что они вводятся в настройках конфигурации портлета, а не в строке фактических настроек.

Есть ли лучший способ сделать это?Как сделать настройки, которые я вручную устанавливаю, доступными для портлета при рендеринге.

public class StudentWorkerConfig extends DefaultConfigurationAction {
    private static Log _log = LogFactoryUtil.getLog(StudentWorkerConfig.class);

    @Override
    public void processAction(
            PortletConfig portletConfig, ActionRequest actionRequest,
            ActionResponse actionResponse) throws Exception {
        super.processAction(portletConfig, actionRequest, actionResponse);

        PortletPreferences prefs = actionRequest.getPreferences();

        String[] groupIndexes = ParamUtil.getString(actionRequest, "groupIndexes")
                .split(",");

        prefs.setValues("GC-groupIndexes", groupIndexes);

        _log.info("groupIndexes:  " + Arrays.toString(groupIndexes));
        _log.info("Stored: " + Arrays.toString(
                prefs.getValues("GC-groupIndexes", new String[]{"NO VALUES"})));

        // re map to zero to end
        int j = 0;
        for (String i : groupIndexes) {
            String adGroup = ParamUtil.getString(actionRequest, "adGroup" + i);
            String humanName = ParamUtil.getString(actionRequest, "humanName" + i);

            prefs.setValue("GC-adGroup" + j, adGroup);
            prefs.setValue("GC-humanName" + j, humanName);
            ++j;
        }



        // We are not using the default stuff, so we need to store them
        prefs.store();

        for(Enumeration<String> e = prefs.getNames(); e.hasMoreElements();)
            _log.info(e.nextElement());

        _log.info(actionRequest.getParameterMap());
    }
}

Мне нужно поддерживать произвольное количество отображений, поэтому я использую авто поля для добавления их по мере необходимости.Я знаю, что ключи предпочтений, которые должны быть сохранены, должны следовать форме «предпочтения - MyKey--», но я не смог понять, как заставить AUI делать это.

<aui:form action="<%= configurationURL %>" method="post" name="fm">
    <aui:input name="<%= Constants.CMD %>" type="hidden" value="<%= Constants.UPDATE %>" />

    <aui:input
        name="preferences--primaryAffiliation--"
        label="Primary Affiliation"
        value='<%= portletPreferences.getValue("primaryAffiliation", "student") %>'
        />

    <div id="group_mapping">
        <% 
        String[] oldRun = portletPreferences.getValues("GC-groupIndexes", new String[]{"0"});
        log("oldRun length = " + oldRun.length);
        log(Arrays.toString(oldRun));

        int j = 0;
        for(String i : oldRun) { %>
        <div class="lfr-form-row lfr-form-row-inline">
            <div class="row-fields">
                <aui:input 
                    fieldParam='<%= "adGroup" + j %>' 
                    id='<%= "adGroup" + j %>'
                    name='<%= "adGroup" + j %>'
                    label="Ad Full Group Name"
                    value='<%= portletPreferences.getValue("GC-adGroup" + j, "NO VALUE") %>' />

                <aui:input
                    fieldParam='<%= "humanName" + j %>'
                    id='<%= "humanName" + j %>' 
                    name='<%= "humanName" + j %>'
                    label="Human Readable Name"
                    value='<%= portletPreferences.getValue("GC-humanName"+j, "NO VALUE") %>' />
            </div> <!-- .row-fields -->
        </div><!-- .lfr -->
        <%
            ++j;
        }
        %>
    </div><!--  -->

    <aui:button-row>
        <aui:button type="submit" />
    </aui:button-row>

    <aui:script use="liferay-auto-fields">
    new Liferay.AutoFields(
    {
    contentBox: '#group_mapping',
    fieldIndexes: '<portlet:namespace/>groupIndexes',
    on: {
        'clone': function(event) {
            console.log('clone', event);
        },
        'delete': function(event) {
            console.log('delete', event);
        }
    }
    }
    ).render();
  </aui:script>
</aui:form>
...