2012-12-19 8 views
5

Ich habe eine Wicket-Seite, die eine Verbindung hat ADD PRODUCT. Beim Klicken auf den Link öffnet sich ein modales Fenster, das die Produktinformationen annimmt.Wicket: Umleiten zur Wicket-Seite mit setResponsePage

ProductAddPanel.java

public class ProductAddPanel extends Panel { 

private InlineFrame uploadIFrame = null; 
private ModalWindow window; 
private Merchant merchant; 
private Page redirectPage; 
private List<Component> refreshables; 

public ProductAddPanel(String id,final Merchant mct,ModalWindow window,List<Component> refreshables,Page p) { 
    super(id); 
    this.window = window; 
    merchant = mct; 
    redirectPage = p; 
    this.refreshables = refreshables; 
    setOutputMarkupId(true); 
} 

@Override 
protected void onBeforeRender() { 
    super.onBeforeRender(); 
    if (uploadIFrame == null) { 
     // the iframe should be attached to a page to be able to get its pagemap, 
     // that's why i'm adding it in onBeforRender 
     addUploadIFrame(); 
    } 
} 


// Create the iframe containing the upload widget 
private void addUploadIFrame() { 
    IPageLink iFrameLink = new IPageLink() { 
     @Override 
     public Page getPage() { 
      return new UploadIFrame(window,merchant,redirectPage,refreshables) { 
       @Override 
       protected String getOnUploadedCallback() { 
        return "onUpload_" + ProductAddPanel.this.getMarkupId(); 
       } 


      }; 
     } 
     @Override 
     public Class<UploadIFrame> getPageIdentity() { 
      return UploadIFrame.class; 
     } 
    }; 
    uploadIFrame = new InlineFrame("upload", iFrameLink); 
    add(uploadIFrame); 
} 

}

ProductAddPanel.html

<wicket:panel> 
<iframe wicket:id="upload" frameborder="0"style="height: 600px; width: 475px;overflow: hidden"></iframe> 
</wicket:panel> 

ich einen Iframe bin mit dem Bild hochzuladen. Ich habe einen iframe zu meiner ProductPanel.html hinzugefügt. Weil es nicht möglich ist, eine Datei mit Ajax Submit hochzuladen.

UploadIframe.java

protected void onSubmit(AjaxRequestTarget target, Form<?> form) { 
       DynamicImage imageEntry = new DynamicImage(); 

       if(uploadField.getFileUpload() != null && uploadField.getFileUpload().getClientFileName() != null){ 
        FileUpload upload = uploadField.getFileUpload(); 
        String ct = upload.getContentType(); 

        if (!imgctypes.containsKey(ct)) { 
         hasError = true; 
        } 

        if(upload.getSize() > maximagesize){ 
         hasError = true; 
        } 

        if(hasError == false){ 
         System.out.println("######################## Image can be uploaded ################"); 
         imageEntry.setContentType(upload.getContentType()); 
         imageEntry.setImageName(upload.getClientFileName()); 
         imageEntry.setImageSize(upload.getSize()); 
         if(imageEntry != null){ 
          try { 
           save(imageEntry,upload.getInputStream()); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
         } 
        }else{ 
         target.appendJavaScript("$().toastmessage('showNoticeToast','Please select a valid image!!')"); 
         System.out.println("#################### Error in image uploading ###################"); 
        } 
       }else{ 
        System.out.println("########################### Image not Selected #####################"); 
       } 

       MerchantProduct mp =new MerchantProduct(); 
       Product p = new Product(); 
       Date d=new Date(); 
       try { 

        p.setProductImage(imageEntry.getImageName()); 
        mp.setProduct(p); 

        Ebean.save(mp); 


       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

       for(Component r: refreshables){ 
        target.add(r); 
       } 

       window.close(target); 
       setResponsePage(MerchantProductPage.class); 
      } 

public void save(DynamicImage imageEntry, InputStream imageStream) throws IOException{ 
    //Read the image data 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    copy(imageStream,baos); 
    baos.close(); 
    byte [] imageData = baos.toByteArray(); 
    baos = null; 

    //Get the image suffix 
    String suffix = null; 
    if("image/gif".equalsIgnoreCase(imageEntry.getContentType())){ 
     suffix = ".gif"; 
    }else if ("image/jpeg".equalsIgnoreCase(imageEntry.getContentType())) { 
     suffix = ".jpeg"; 
    } else if ("image/png".equalsIgnoreCase(imageEntry.getContentType())) { 
     suffix = ".png"; 
    } 

    // Create a unique name for the file in the image directory and 
    // write the image data into it. 
    File newFile = createImageFile(suffix); 
    OutputStream outStream = new FileOutputStream(newFile); 
    outStream.write(imageData); 
    outStream.close(); 
    imageEntry.setImageName(newFile.getAbsolutePath()); 

    } 

    //copy data from src to dst 
    private void copy(InputStream source, OutputStream destination) throws IOException{ 
     try { 
       // Transfer bytes from source to destination 
       byte[] buf = new byte[1024]; 
       int len; 
       while ((len = source.read(buf)) > 0) { 
        destination.write(buf, 0, len); 
       } 
       source.close(); 
       destination.close(); 
       if (logger.isDebugEnabled()) { 
        logger.debug("Copying image..."); 
       } 
      } catch (IOException ioe) { 
       logger.error(ioe); 
       throw ioe; 
      } 
     } 

    private File createImageFile(String suffix){ 
     UUID uuid = UUID.randomUUID(); 
     File file = new File(imageDir,uuid.toString() + suffix); 
     if(logger.isDebugEnabled()){ 
      logger.debug("File "+ file.getAbsolutePath() + "created."); 
     } 
     return file; 
    } 
} 

}

Ich verwende setResonsePage(), um erste Seite zu umgeleitet, auf dem "Produkt hinzufügen" Link vorhanden ist. Damit bekomme ich die aktualisierte Seite mit neuen Produktinformationen.

Mein Problem ist, dass modales Fenster nicht auf window.close() geschlossen wird und innerhalb dieses Fensters ich die aktualisierte Seite bekomme.

Meine Anforderung ist, dass das Modal-Fenster geschlossen und die Seite aktualisiert werden sollte. Ich übergebe die Parentpage.class in meiner setResponsePage().

Alle Hilfe und Ratschläge geschätzt! Danke im Voraus.

Antwort

5

In der ParentPage.class, auf der Modal-Fenster geöffnet ist, habe ich die Methode setWindowClosedCallback() aufgerufen, in der ich getPage() zum Ziel hinzufüge, damit die Seite aktualisiert wird, wenn das modale Fenster geschlossen wird. Hier ist der Code für das gleiche

modalDialog.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() 
    { 
      private static final long serialVersionUID = 1L; 

      @Override 
      public void onClose(AjaxRequestTarget target) 
      { 
       target.addComponent(getPage()); 
      } 
    });