2014-09-26 5 views
1
  1. 상위 포틀릿에는 채우기가 있지만 아직 제출하지 않는 양식이 있습니다.
  2. 그런 다음이 상위 포틀릿에서 링크를 클릭하여 팝업에서 포틀릿을 채우고 값을 제출하는 팝업 포틀릿을 엽니 다.
  3. 이제이 값을 상위 포틀릿에서 사용할 수 있습니다. 그러나 새로 고치지 않으면 상위 포틀릿에서 값을 사용할 수 없습니다.
  4. 그래서 ajax를 사용하여 팝업 제출시 상위 포틀릿을 새로 고치는 로직을 작성하고 상위 포틀릿에서 값을 사용할 수있게됩니다.
  5. 그러나 문제는 상위 포틀릿의 양식이 지워지고 양식을 다시 채워야한다는 것입니다.

그럼 어떻게 제출할 부모 폼 값을 보존 할 수 있습니까? 또는 상위 포틀릿을 새로 고치지 않고 상위 포틀릿에서 팝업 포틀릿 값을 사용할 수있게 만드는 방법이 있습니까?팝업 포틀릿에서 상위 포틀릿으로 값을 다시 보냅니다.

부모 포틀릿의 코드 :

<aui:form action="<%= editURL %>" method="POST" name="fm"> 
    <aui:fieldset> 
     <aui:input name="redirect" type="hidden" value="<%= redirect %>" /> 


     <aui:input name="name" /> 

     <aui:input name="acronym" /> 

     <aui:input name="url" /> 

     <aui:select showEmptyOption="<%= true %>"> 

       // Want to make the values added from pop up available here 

     </aui:select> 

     <% 
      String portletId = (String) request.getAttribute(WebKeys.PORTLET_ID); 
      String portletNamespace = PortalUtil.getPortletNamespace(portletId); 
     %> 

     <c:set var="portletNameSpaceVal" value="<%=portletNamespace%>" /> 

     <liferay-portlet:renderURL 
      var="addURL" windowState="<%= LiferayWindowState.POP_UP.toString() %>" 
      portletName="name"> 
      <liferay-portlet:param name="jspPage" value="/html/person/edit_person_popup.jsp"/> 
     </liferay-portlet:renderURL> 

     <c:set var="portletURL" value="<%=addURL%>" /> 

     <aui:a href="#" onClick="${portletNameSpaceVal}showPopup('${portletURL}')"><liferay-ui:icon image="add"/></aui:a> // this link triggers the pop up 


     <aui:select label="Country" name="countryCode" showEmptyOption="<%= true %>"> 

       <% 
       for (Country country : countries) { 
      %> 

      <% 
       } 
      %> 

     </aui:select> 




    </aui:fieldset> 

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

     <aui:button onClick="<%= viewURL %>" type="cancel" /> 
    </aui:button-row> 
</aui:form> 


<aui:script> 
    function <portlet:namespace />showPopup(url) { 

     var url = url; 

      Liferay.Util.openWindow(
       { 
        dialog: { 
         cache: false, 
         width:800, 
         modal: true, 
         centered: true 
        }, 
        id: 'popUpId',     
        uri: url 
       } 
      ); 
    } 

</aui:script> 

<aui:script> 
    Liferay.provide(window, 'refreshPortlet', function() { 
     var curPortlet = '#p_p_id<portlet:namespace/>'; 
     Liferay.Portlet.refresh(curPortlet); 
    }, 
    ['aui-dialog','aui-dialog-iframe'] 
    ); 
</aui:script> 

<aui:script> 
    Liferay.provide(window, 'closePopup', function(dialogId) { 
     var A = AUI(); 
     var dialog = Liferay.Util.Window.getById(dialogId); 
     dialog.destroy(); 
    }, 
    ['liferay-util-window'] 
    ); 
</aui:script> 

은 그 때 나는 포틀릿을 팝업을 가지고있다.

<aui:form action="<%= editURL %>" method="POST" name="fm" onSubmit="event.preventDefault();"> 
    <aui:fieldset> 

     <aui:input name="name" /> 

     <aui:input name="url" /> 

     <aui:input name="address" /> 

    </aui:fieldset> 

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

     <aui:button name="cancel" value="Cancel"/> 

    </aui:button-row> 
</aui:form> 

<aui:script use="aui-base,aui-form-validator,aui-io-request"> 
    AUI().use('aui-base','aui-form-validator','aui-io-request',function(A){ 
     var rules = { 
       <portlet:namespace/>name: { 
       required: true 
       }, 

       <portlet:namespace/>url: { 
       url: true 
       }, 

       <portlet:namespace/>address: { 
       required: true 
       }, 
      }; 

     var fieldStrings = { 
      <portlet:namespace/>name: { 
       required: 'The Name field is required.' 
       }, 

       <portlet:namespace/>address: { 
       required: 'The Address field is required.' 
       }, 
     }; 

     new A.FormValidator({ 
      boundingBox: '#<portlet:namespace/>fm', 
      fieldStrings: fieldStrings, 
      rules: rules, 
      showAllMessages:true, 
      on: { 
        validateField: function(event) { 
        }, 
        validField: function(event) { 
        }, 
        errorField: function(event) { 
        }, 
        submitError: function(event) { 
         event.preventDefault(); //prevent form submit 
        }, 
        submit: function(event) { 
         var A = AUI(); 
         var url = '<%=editURL.toString()%>'; 

         A.io.request(
          url, 
          { 
           method: 'POST', 
           form: {id: '<portlet:namespace/>fm'}, 
           on: { 
            success: function() { 
             Liferay.Util.getOpener().refreshPortlet(); 
             Liferay.Util.getOpener().closePopup('popUpId');           
            } 
           } 
          } 
         ); 
        } 
       } 
      }); 
    }); 

</aui:script> 




<aui:script use="aui-base"> 
    A.one('#<portlet:namespace/>cancel').on('click', function(event) { 
     Liferay.Util.getOpener().closePopup('popUpId); 
    }); 
</aui:script> 

답변

2

이 내가 당신이 할 수있는 생각이다 : 당신은 JSON 형식으로 서버에서 데이터를 전달할 수

  1. .
  2. success 방법
  3. 전송
  4. <aui:select>를 업데이트하는 부모의 방법을 실행하는 자바 스크립트 함수 부모 행의 데이터에 해당 반입.

팝업의 성공 방법의 일부 샘플 코드 :

success: function(responseData) { 
    // refresh method removed 
    // get the responseData as JSON or something from the server 
    Liferay.Util.getOpener().updateDataFromPopUp("JSON-data-passed"); 
    Liferay.Util.getOpener().closePopup('popUpId');           
} 

그리고 부모의

:

<aui:script> 
    Liferay.provide(window, 'updateDataFromPopUp', function(jsonDataFromPopUp) { 
     // do something with the data here 
     } 
    ); 
</aui:script> 

가 다른 방법으로 할 수 있지만, 이것은 지금 내가 생각할 수있는 것입니다 수 있습니다 .


제안 :

당신은 대신이 여러 번 필요없이 하나의 <aui:script></aui:script>의 모든 기능을 가지고 있습니다.

희망이 도움이됩니다.

+0

저는 평생을 새삼 느끼며 많은 전문 지식을 가지고 있지 않습니다. 이해하기 때문에 나는 resourceURL을 사용하고 이것을 수행하기 위해 serveResource 메소드를 정의해야한다. 하지만 내 양식에는 입력이 데이터베이스에도 삽입되는 적절한 메소드를 호출하는 팝업에서 actionURL이 있기 때문에. 그렇다면 어떻게하면 resourceURL과 actionURL을 함께 사용할 수 있습니까? – SASM

+0

당신은 HTML 양식의 action 속성 안에 resourceURL을 주려고 했습니까? –

+0

예 양식의 조치 속성에 resourceURL을 제공하면 serveResource 메소드가 호출됩니다. 이제 actionURL 메소드를 호출하는 방법은? 내부에서 serveResource를 호출하거나 해당 삽입 메서드의 논리도이 serveResource 메서드 내부에 있어야합니까? – SASM

관련 문제