Nextras\Forms\Controls\DateTimePicker – rozsah platných údajů
- raketoplan2005
- Člen | 147
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
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)
- raketoplan2005
- Člen | 147
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!