2015-05-28 25 views
2

我使用的是可編輯的<p:dataTable>,其中每個<p:column>包含一個<p:cellEditor>。我使用一個特定的<p:column>來表示用於存儲文件名稱(由用戶上傳)的模型項目的屬性(我們稱之爲chemin)。相應<p:cellEditor>如下:PrimeFaces 5.1 +可編輯數據表+文件上傳列

  • <f:facet>含有<p:fileUpload><h:outputLink>
  • <f:facet>包含<h:outputLink>

我想要實現以下內容:當用戶點擊<p:rowEditor>(鉛筆(1)顯示<p:fileUpload>,(2)用戶然後選擇並上傳文件,以及(3)當用戶驗證更新時(通過點擊複選標記)該列顯示新鮮鏈接上傳的文件,這意味着當前的模型項目會相應更新:chemin屬性將包含剛剛上傳的文件的名稱。

下面的代碼實現正確的步驟(1)到(2),但步驟(3)不起作用。

Version.xhtml

<h:form id="RUDForm" enctype="multipart/form-data"> 
    <p:dataTable 
     id="versionDT" 
     var="version" 
     value="#{versionController.rechercherToutVersion()}" 
     editable="true" 
     paginator="true" 
     rows="3" 
     dir="rtl" 
     style="width: 100%" 
     emptyMessage="#{messages.listeVide}"> 

     <p:ajax event="rowEdit" listener="#{versionController.updateVersion(version)}" update=":RUDForm:versionDT" /> 

     ... 

     <p:column headerText="#{messages.chemin}"> 
      <p:cellEditor> 
       <f:facet name="output"> 
        <h:outputLink 
         id = "versionCheminLink" 
         value="#{versionController.relativeUploadUrl(version.chemin)}" 
         target="_blank" 
         rendered = "#{version.chemin != null}" 
        > 
         <h:outputText styleClass="title-text" value="#{version.chemin}"/> 

        </h:outputLink> 
       </f:facet> 
       <f:facet name="input"> 
        <p:panelGrid 
         id="uploadUpdatePG" 
         dir="rtl" 
        > 
         <p:row> 
          <p:column> 
           <p:fileUpload 
            id = "versionChemin" 
            fileUploadListener="#{versionController.fileUploadListenerUpdate}" 
            mode="advanced" 
            dragDropSupport="false" 
            update=":RUDForm:versionDT:uploadUpdatePG" 
            fileLimit="1" 
            label="#{messages.unChoix}" 
            uploadLabel="#{messages.upload}" 
            cancelLabel="#{messages.annuler}" 
            invalidSizeMessage = "#{messages.invalidSizeMessage}" 
            invalidFileMessage = "#{messages.invalidFileMessage}" 
            sizeLimit="1000000" 
           > 
            <f:attribute name="version" value="#{version}" /> 
           </p:fileUpload> 
          </p:column> 
         </p:row> 
         <p:row> 
          <p:column> 
           <h:outputLink 
            id = "versionCheminLinkReminder" 
            value="#{versionController.relativeUploadUrl(version.chemin)}" 
            target="_blank" 
            rendered = "#{version.chemin != null}" 
           > 
            <h:outputText styleClass="title-text" value="#{version.chemin}"/> 

           </h:outputLink> 
          </p:column> 
         </p:row> 
        </p:panelGrid> 
       </f:facet> 
      </p:cellEditor> 
      <p:message for="versionChemin"/> 
     </p:column> 

     ... 

     <p:column style="width:6%"> 
      <p:rowEditor /> 
     </p:column> 

    </p:dataTable> 
</h:form> 

VersionController.java

@ManagedBean 
@ViewScoped 
public class VersionController extends GenericPageController implements Serializable 
{ 

    ... 

    @ManagedProperty(value="#{versionServiceImpl}") 
    private VersionService versionService; 
    public VersionService getVersionService() { 
     return versionService; 
    } 
    public void setVersionService(VersionService versionService) { 
     this.versionService = versionService; 
    } 

    private UploadedFile file; 
    public UploadedFile getFile() { 
     return file; 
    } 
    public void setFile(UploadedFile file) { 
     this.file = file; 
    } 

    ... 

    public void updateVersion(Version version) 
    { 
     if (getVersionService().updateVersion(version)) 
     { 
      addInfoByKey("msgUpdateOk"); 
     } 
     else 
     { 
      addErrorByKey("msgUpdateKo"); 
     } 
    } 

    ... 

    public void fileUploadListenerUpdate(FileUploadEvent event) 
    { 
     setFile(event.getFile()); 
     uploadVersionUpdate((Version)event.getComponent().getAttributes().get("version")); 
    } 

    public void uploadVersionUpdate(Version version) 
    { 
     if ((getFile() != null) && (getFile().getSize() != 0)) 
     { 
      version.setChemin(new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + addZeros(new Random().nextInt(10),3) + getFile().getFileName()); 
      upload(getFile(),version.getChemin()); 
      addInfoByKey("RUDForm:uploadUpdatePG","uploadOk"); 
     } 
     else 
     { 
      addErrorByKey("RUDForm:uploadUpdatePG","uploadKo"); 
     } 
    } 
} 

我的想法是在<p:fileUpload>使用<f:attribute>傳遞模型項目正在編輯控制器。

上傳成功後(在方法uploadVersionUpdate,由fileUploadListener調用)模型項的屬性舍曼與實際上傳的文件的名稱更新。

我當時希望當用戶點擊選中標記(以驗證更新)時,該行將顯示新值chemin。 上面的代碼並非如此。

看起來<p:rowEditor>忽略了fileUploadListener所做的更改。有沒有辦法強制行版考慮到fileUploadListener所做的更改?

PS:文件上傳工作正常(配置好)和行版本也工作正常,除了chemin財產。

Screeshots:

版之前: Before Edition 注意老舍曼值:布拉布拉布拉布拉。PDF

單擊版(鉛筆)圖標後選擇一個新文件上傳: After Clicking Edition (pencil) Icon and Selecting a new file to Upload

成功上傳新文件後: After Successfully Uploading a new File 注意,舍曼屬性已更新:布拉布拉 blabla.pdf。

驗證版之後:點擊對勾圖標: After validating Edition: Clicking the Check Mark Icon 注意,舍曼屬性顯示舊值:布拉布拉 blabla.pdf。

回答

0

Solution Found Here !

的方法填充的dataTable值被調用服務(其又被調用庫查詢數據庫)各一次。 解決的辦法是去到數據庫中,只有當列表餵養dataTable的爲空,從而轉化爲以下幾點:

public List<Version> rechercherToutVersion() 
{ 
    return(getVersionService().rechercherToutVersion()); 
} 

到:

private List<Version> allVersions; 

public List<Version> getAllVersions() { 
    return allVersions; 
} 

public void setAllVersions(List<Version> allVersions) { 
    this.allVersions = allVersions; 
} 

... 

public List<Version> rechercherToutVersion() 
{ 
    if (getAllVersions() == null) 
    { 
    setAllVersions(getVersionService().rechercherToutVersion()); 
    } 
    return(getAllVersions()); 
} 

這解決了我的問題,但即使解決的辦法是從視圖的數據庫訪問點更有效,我不得不改變我的saveVersiondeleteVersion方法。事實上,由於行是不是每次從數據庫中,當我刪除的dataTable行了,刪除的行仍然顯示,如果我添加一個新的項目,該項目未在dataTable中顯示:我必須刷新頁面才能看到修改。

解決這一新課題要麼爲「手動」刪除或從allVersions添加項目財產或者乾脆將其復位每次刪除保存做是爲了空。爲刪除實例:

public void deleteVersion(Version version) 
{ 
    if (getVersionService().deleteVersion(version)) 
    { 
    setAllVersions(null); 
    addInfoByKey("msgDeleteOk"); 
    } 
    else 
    { 
    addErrorByKey("msgDeleteKo"); 
    } 
} 

最後什麼挫折我最多的是以下幾點:爲什麼在最初的代碼版本,更新了完美的工作對其他屬性,但特別是不與結合到文件上傳的財產?