我使用的是可編輯的<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:
版之前: 注意老舍曼值:布拉布拉布拉布拉。PDF
單擊版(鉛筆)圖標後選擇一個新文件上傳:
成功上傳新文件後: 注意,舍曼屬性已更新:布拉布拉 blabla.pdf。
驗證版之後:點擊對勾圖標: 注意,舍曼屬性顯示舊值:布拉布拉 blabla.pdf。