Nextras\Forms\Controls\DateTimePicker – rozsah platných údajů

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
raketoplan2005
Člen | 147
+
0
-

Ahoj, nasadil jsem hrachovo DateTimePicker+ a potýkám se s problémem validace rozsahu zadaného data. Tohle tema jsem před chvilkou smazal (omlouvám se), protože jsem si myslel že je problém v tom že používám \Nette\Forms\Form::RANGE, ale ukázalo se, že jsem se unáhlil. Picker chci ověřit proti:

->addRule(\Nette\Forms\Form::RANGE, 'Datum musí bít v budoucnosti',
array(new \Nette\DateTime('now'), null));

Tuhle podmínku kód ale jakékoli datum z budoucnosti nesplní. Pokud do formu přidám jen DatePicker místo DateTimePickeru, pak to funguje bez problémů.

Inicializační skript pro timepicker používám původní. Můžu poprosit autora, nebo zkušenější kolegy o radu? Děkuji předem.

Editoval raketoplan2005 (10. 1. 2013 21:32)

raketoplan2005
Člen | 147
+
0
-

Aktuálně jsem upravil init takto, což sice funguje, ale pak mám problém s lokalizovanými formáty pro jednotlivé jazyky:

<script>
    $.datetimeLocalToDate = function (str) {
        var regexp = /(\d\d\d\d)(-)?(\d\d)(-)?(\d\d)(T)?(\d\d)(:)?(\d\d)(:)?(\d\d)(\.\d+)?/;
        d = str.match(new RegExp(regexp));
        if (!d)
            return null;

        date = new Date(parseInt(d[1], 10), parseInt(d[3], 10) - 1, parseInt(d[5], 10), parseInt(d[7], 10), parseInt(d[9], 10), parseInt(d[11], 10));
        return date;
    }

    $("input.datetime").each(function () { // input[type=datetime] does not work in IE
        var el = $(this);
        var value = el.val();
        var date = value ? $.datetimeLocalToDate(value) : null;

        var minDate = el.attr("min") || null;
        if (minDate) minDate = $.datetimeLocalToDate(minDate);
        var maxDate = el.attr("max") || null;
        if (maxDate) maxDate = $.datetimeLocalToDate(maxDate);

        if ((el.attr("type") == "datetime-local") || (el.attr("type") == "datetime")) {
            var tmp = $("<input />");
            $.each("class,disabled,id,maxlength,name,readonly,required,size,style,tabindex,title,value".split(","), function(i, attr)  {
                tmp.attr(attr, el.attr(attr));
            });
            tmp.data(el.data());
            el.replaceWith(tmp);
            el = tmp;
        }

        el.datetimepicker({
            minDate: minDate,
            maxDate: maxDate
        });

        el.val($.datepicker.formatDate(el.datepicker("option", "dateFormat"), date));

    });
</script>

Editoval raketoplan2005 (11. 1. 2013 20:45)

hrach
Člen | 1834
+
0
-

Díky, do mastra sem pushnul svoje řešení, které sem tam zapomněl dát…

raketoplan2005
Člen | 147
+
0
-

Děkuji moc!

Pokud použiji tvůj JS tak mi ale neprojde RANGE validace (datum_od, null), upravil jsem si to na:

$("input.datetime").each(function () { // input[type=datetime] does not work in IE
        var el = $(this);
        var value = el.val();
        var date = value ? $.datetimeLocalToDate(value) : null;
        var dateFormat = 'd. m. yy'; // standard is $.datepicker.W3C;

        var minDate = el.attr("min") || null;
        if (minDate) minDate = $.datetimeLocalToDate(minDate);
        var maxDate = el.attr("max") || null;
        if (maxDate) maxDate = $.datetimeLocalToDate(maxDate);

        if (el.attr("type") == "datetime-local") {
            var tmp = $("<input/>");
            $.each("class,disabled,id,maxlength,name,readonly,required,size,style,tabindex,title,value".split(","), function(i, attr)  {
                tmp.attr(attr, el.attr(attr));
            });
            tmp.data(el.data());
            el.replaceWith(tmp);
            el = tmp;
        }

        if (date) {
            var time = '';
            time += (date.getHours() < 10 ? '0' : '') + date.getHours();
            time += ':' + (date.getMinutes() < 10 ? '0' : '') + date.getMinutes();
            el.val($.datepicker.formatDate(dateFormat, date) + ' ' + time);
        }

        el.datetimepicker({
            dateFormat: dateFormat,
            timeFormat: 'HH:mm',
            minDate: minDate,
            maxDate: maxDate
        });

    });

V PHP kódu `DateTimePicker.php `jsem pak změnil řádek 84 z:

if (preg_match($value, '#^(?P<dd>\d{1,2})[. -] *(?P<mm>\d{1,2})(?:[. -] *(?P<yyyy>\d{4})?)?(?: *[ \-@] *(?P<hh>\d{1,2}):(?P<ii>\d{1,2}))?$#', $matches)) {

na

if (preg_match('#^(?P<dd>\d{1,2})[. -] *(?P<mm>\d{1,2})(?:[. -] *(?P<yyyy>\d{4})?)?(?: *[ \-@] *(?P<hh>\d{1,2}):(?P<ii>\d{1,2}))?$#', $value, $matches)) {

Takhe kombinace mi funguje téměř tak jak má, sice se mi když používám překlady, kde je nadefinovaný i formát data a času (am/pm a pokobné blbinky), tak ze o tohle nastavení připravím, ale to není takový problém který by mě trápil. Hlavně že to vybírá čas a umožňuje nastavit default value :-)

Ještě jednou díky!