Я создал пользовательский валидатор в Java, который я использую в своем XPage. Все данные привязаны к управляемому компоненту (включая "дочерние" наборы данных - строки - основного объекта данных). В моем методе проверки я проверяю компонент строки (и нахожу некоторых своих "братьев и сестер", чтобы проверить, что если один заполняется, другой должен быть заполнен или его значение в течение определенного интервала). Это отлично подходит для обычных полей (выбор, ввод и флажки).
Но как я могу получить контроль над загрузкой файлов? Картинка должна быть прикреплена, если установлен флажок в той же строке. Это определение my fileUpload:
<xp:fileUpload id="fileUploadSingle" value="#{row.photo}"
disableClientSideValidation="true" required="true">
<xp:this.validators>
<xp:validator validatorId="fishingTripValidator"></xp:validator>
<xp:validateRequired message="You must attach a photo"></xp:validateRequired>
</xp:this.validators>
</xp:fileUpload>
Я думаю, что есть две проблемы:
Как вызвать "требуемый" сервер. Я проверил это, просто установив нужное поле. Работает нормально на стороне клиента - но не вызывает серверную сторону... Однако мой метод проверки вызывается, если значение заполнено (то есть выбрано файл), и я могу прочитать значение в com.ibm.xsp.http.UploadedFile и получить, например, имя файла клиента (getClientFileName()).
Захватите элемент управления загрузкой файлов, когда обнаружите, что флажок установлен - и проверьте, имеет ли файл управления загрузкой какой-либо файл, указанный в нем...
Я могу найти правильный элемент управления как UIComponent и захватить объект com.ibm.xsp.component.UIFileuploadEx.UploadedFile. См. Этот фрагмент:
com.ibm.xsp.component.xp.XspFileUpload fileUpload = (com.ibm.xsp.component.xp.XspFileUpload) component;
if (null != fileUpload) {
com.ibm.xsp.component.UIFileuploadEx.UploadedFile uploadedFile = (com.ibm.xsp.component.UIFileuploadEx.UploadedFile) fileUpload.getValue();
if (null != uploadedFile) {
return uploadedFile.getFilename();
}
}
return null;
Странно то, что когда я устанавливаю флажок И присоединяю файл - вышеуказанный код НЕ найдет файл - и валидатор вернет ошибку. Имя файла, указанное в элементе управления загрузкой файлов, теперь исчезло. Однако, если я сохраню снова, не изменяя ничего, тогда управление файлом в фрагменте кода правильно найдет файл - поэтому не возникает ошибка проверки и файл правильно загружен...
Если бы я мог инициировать валидацию на "обязательном", я думаю, что мог бы избежать других "хаков", где, очевидно, что-то происходит "между" двумя "сбережениями".
Любые идеи, как я могу правильно это контролировать?
/John
Обходным путем является добавление скрытого поля ввода в каждую строку. Это свойство, требуемое для этого поля, зависит от флажка и управления загрузкой файлов:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:this.data>
<xp:dominoDocument var="document1" formName="RTItem" action="editDocument" concurrencyMode="force" />
</xp:this.data>
<xp:repeat id="repeatFiles" rows="30" var="row" value="#{javascript:['A','B','C','D','E','F'];}">
<xp:checkBox text="File?" id="checkBoxFile" checkedValue="1" uncheckedValue="0" />
<xp:fileUpload id="fileUpload" value="#{document1[row]}" />
<xp:inputHidden id="inputHiddenFileHelper">
<xp:this.required>
<![CDATA[#{javascript:
var cmpCheck = getComponent( "checkBoxFile" );
var cmpFile = getComponent( "fileUpload" );
if( cmpCheck.value == "0" )
return false;
if( cmpFile.getValue() == null )
return true;
}]]>
</xp:this.required>
</xp:inputHidden>
<xp:br />
</xp:repeat>
<xp:messages id="messages1" />
<!-- a button to refresh the page -->
<xp:button value="Submit" id="buttonRefreshMe">
<xp:eventHandler event="onclick" submit="true" immediate="false" save="true"/>
</xp:button>
</xp:view>