0

を使用したいのです<p:calendar>が、ユーザーが以前に入力した値をクリアできるようにする方法が見つからないようです。たとえば、「すべて選択」と「バックスペース」を使用して入力のみをクリアすると、検証 (変換) エラーが発生します。さらに複雑なことに、入力フィールドにも jQuery マスク「99/99/9999」を配置しました。

ユーザーがウィジェットで日付を選択または入力<p:calendar>できるようにし、最も重要なこととして、必要に応じて入力をクリアできるようにすることは可能ですか?

繰り返しになりますが、ユーザーは手動で、または日付ピッカーを使用して日付値を入力できる必要があります。

これまでのところ、jquery 日付マスク、つまり、__/__/____ ユーザーが入力の上に単純にスペースを入れることができないことに関連しているように見えます...つまり、送信ボタンを押すと、手動で入力された元の値が単に再表示されます。-- 残念ながら、ユーザーが日付を手動で入力する際の正しい入力形式をガイドするために、日付入力マスクを提供する必要があります。

ウィジェットがどのように見えるかの例を次に示します。

<p:calendar 
    pattern="MM/dd/yyyy"
    widgetVar="birthDate_var"
    id="birthDate"
    requiredMessage="birth date required"
    validatorMessage="invalid birth date "
    converterMessage="invalid birth date format"
    readonly="false"
    readonlyInput="false"
    navigator="true" 
    showOn="button" 
    value="#{testBean.parmMap['birthDate']}"                               
    size="10"                            
    maxlength="10"
    yearRange="c-120:c+0"  
    onfocus="$('#queryForm\\:msgs > div').hide();$('#queryForm\\:msgs > div').eq(1).show();$(this).mask('99/99/9999');return false;">
    <p:ajax event="dateSelect" listener="#{testBean.updateBirthDate}" process="@this" />                        
    <p:ajax event="change" listener="#{testBean.updateBirthDate}" process="@this" />  
</p:calendar> 

どうすればこれを達成できますか?Mojarra 2.1.11 と PrimeFaces 3.4.2 を使用しています。

4

1 に答える 1

1

これが「ハック」と見なされるのか、正当な解決策と見なされるのかはわかりませんが、私が抱えていた問題は、日付入力用のカスタムコンバーターを作成することで解決されたようです...つまり、このようなものです...

更新:有効な解決策ではないようです。動作しているように見えますが、「calendar.validator」によってクラス キャスト例外が発行されます[?]

つまり、

INFO: java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Date
java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Date
    at org.primefaces.component.calendar.Calendar.validate(Calendar.java:452)
    at javax.faces.component.UIInput.executeValidate(UIInput.java:1233)

ウィジェットの...

 <p:calendar
    pattern="MM/dd/yyyy"
    widgetVar="birthDate_var"
    id="birthDate"
    requiredMessage="birth date required"
    validatorMessage="invalid birth date "
    converter="dpConverter"
    converterMessage="invalid birth date format"
    readonly="false"
    readonlyInput="false"
    navigator="true"
    showOn="button"
    value="#{testBean.parmMap['birthDate']}"
    size="10"
    maxlength="10"
    yearRange="c-120:c+0"
    onfocus="$('#queryForm\\:msgs > div').hide();$('#queryForm\\:msgs > div').eq(1).show();$(this).mask('99/99/9999');return false;"
    onblur="$(this).unmask();return false;">
    <p:ajax event="dateSelect" update="@this" />
    <p:ajax event="change" update="@this"/>
</p:calendar>

このカスタムコンバーターを使用しました...

package aaa.bbb.ccc.war;

import java.text.SimpleDateFormat;
import java.util.Date;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

@FacesConverter("dpConverter")
public class DPConverter implements Converter
{

    private static SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value)
    {
        try
        {
            if (null == value || String.valueOf(value).contains("__/__/____"))
            {
                return null;
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

        return value; //(null==value?null:value);
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value)
    {
        String v = null;
        try
        {
            if (String.valueOf(value).contains("__/__/____"))
            {
                return null;
            }

            if (value instanceof String)
            {
                v = (String) value;
            }
            else if (value instanceof Date)
            {
                v = dateFormat.format((Date) value);
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return v;
    }
}   
于 2013-01-07T18:28:45.047 に答える