[addon DateInput] DateInput – html 5 kompatibilní formulářové prvky pro výběr data
- yogiman321
- Člen | 11
Ahoj, potvrdzujem, že tento addon funguje pre výber dátumu správne, ale ak v „time picker“ kliknem na tlačítko „teď/now/teraz“, tak do hidden inputu sa uloží iba dátum a čas zostane nastavený na 00:00:00.
Ak nastavím čas pomocou posuvníka(slider), tak do hidden inputu sa zapíše správne.
Použil som všetké najnovšie dostupné js súbory, nalinkoval ich v spravnom poradí, nastavil som si aj zobrazenie voľby pre sekundy. V podstate funguje pekne, len škoda toho „času“, lebo o ten mi ide najviac.
Neviete kde môže byť chyba?
- motorcb
- Člen | 552
Zdravím.
Snažím se doplněk zprovoznit v Nette 2.0.5 (čisté verzi, žédné
složitosti) – https://github.com/…te-Dateinput
Ale je mi hlášen problém – Class ‚Nette\Forms\FormControl‘ not found
Rovněž nevím jak přesně udělat registraci doplňku v bootstrap.php
Koukněte do Gitu: https://github.com/…te-Dateinput
Děkuji za nakopnutí jak to zprovoznit
- motorcb
- Člen | 552
@**voda**:
Díky za upozornění, nahrál jsem aktuální verzi.
Ale stále nefunguje. Tedy funguje pouze prvni prvek:
$form->addDate('date', 'Date', DateInput::TYPE_DATE);
Ostatní nefunguji:
$form->addDate('datetime', 'Datetime', DateInput::TYPE_DATETIME);
$form->addDate('datetimeLocal', 'Local datetime', DateInput::TYPE_DATETIME_LOCAL);
$form->addDate('month', 'Month', DateInput::TYPE_MONTH);
$form->addDate('week', 'Week', DateInput::TYPE_WEEK);
$form->addDate('time', 'Time', DateInput::TYPE_TIME);
Je u nich zobrazen pouze klasicky input ale neni mozne vybrat datum.
Cim by to mohlo byt?
https://github.com/…te-Dateinput
- motorcb
- Člen | 552
Chtěl bych volit i vteřiny. Jak na to?
$('input[data-dateinput-type]').dateinput({
datetime: {
showSecond: true,
dateFormat: 'd.m.yy',
timeFormat: 'h:mm:ss',
stepHour: 2,
stepMinute: 10,
stepSecond: 10
},
...
Ani nefunguje volba po 2 hodinách (stepHour: 2), krok po minutách 10…
Komponenta zobrazuje následující datum: 12.10.2012
5:13:00 ale nemůžu vybrat vteřiny (neni k dispozici posuvnik pro
vteriny [posuvnik pro hodiny a minuty vidim]).
Nevěděl by někdo jak na to?
Github: https://github.com/…te-Dateinput
Editoval motorcb (12. 10. 2012 17:16)
- motorcb
- Člen | 552
Chtěl bych nahlásit další bug:
Pokud kliknu na button „Nyní“ pro nastavení
aktuálního datumu a času, tak se hodnota neodešle.
Pokud ale vyberu datum a čas ručně, jak se odešle zvolená hodnota.
Viz: https://github.com/…te-Dateinput
Prosím o prověření.
Děkuji
- drakul
- Člen | 37
Zdravím,
narazil jsem na zajímavý problém: DateInput při vymazání zadané hodnoty
posílá hodnotu hidden inputu, tzn. nelze nahradit jednou vepsanou hodnotou za
prázdnou. V současné době to tedy řeším tak, že mám za DateInput jeden
checkbox, který když je zaškrtnutý tak se při poslání formuláře
ignoruje hodnota z DateInput. Nenarazil někdo na podobný problém? Popř.
jaký je best practise v tomhle případě? Děkuji
- TomasHalasz
- Bronze Partner | 79
Narazil jsem na podobné potíže jako ostatní dříve:
- pokud jsem použil DateInput::TYPE_DATETIME tak mi nešlo posuvníky měnit hodiny a čas. Dostával jsem chybovou hlášku, že neexistuje funkce formatTime konkrétně .timepicker._formatTime(tp,‚hh:mm:ss‘,.....
To jsem vyřešil tak, že jsem v dateInput.js opravil řádek 264:
var value = $.datepicker.formatDate('yy-mm-dd', selectedDate) + 'T' + $.timepicker._formatTime(tp, 'hh:mm:ss', false);
na tento:
var value = $.datepicker.formatDate('yy-mm-dd', selectedDate) + 'T' + $.datepicker.formatTime('HH:mm:ss', tp, false);
- při zvolení datumu a času z datetimepickeru se do presenteru pro zpracování formuláře nepředala hodnota skrytého inputu s vybraným datumem a časem. To je dáno tím, že skrytý input neodpovídá původní definici formuláře. Prozatím jsem to vyřešil tak, že v presenteru hodnoty formuláře zpracovávám takto
$values = $form->getHttpData(TRUE);
unset($values['save']); //odstranit tlačítka z formu ať můžeme pole $values použít celé
unset($values['storno']);
Asi by to šlo i jinak, možná elegantněji/bezpečněji?
- pokud ručně upravím hodnotu v poli (tzn. bez použití datetimepickeru) nepřenese se tato hodnota do skrytého inputu a samozřejmě se neodešle do presenteru. Takže jsem v dateInput.js změnil přiřazení metody pro zpracování zvolených hodnot z onSelect na onClose a dále jsem upravil získávání datumu a času. Nyní místo selectedDate používám t.datepicker(‚getDate‘). Zde je nová metoda:
$.extend(pickerSettings, {
onClose: function() {
var tp = {
hour: t.datepicker('getDate').getHours(),
minute: t.datepicker('getDate').getMinutes(),
second: t.datepicker('getDate').getSeconds()
};
var value = $.datepicker.formatDate('yy-mm-dd', t.datepicker('getDate')) + 'T' + $.datepicker.formatTime('HH:mm:ss', tp, false);
if (type == 'datetime') {
value += 'Z';
}
alt.val(value);
}
});
Původní metodu onSelect jsem zatím zrušil.
Používám jquery-ui-1.9.2.custom.min.js, poslední jquery-ui-timepicker-addon.js z GitHubu.
Snad to co jsem zjistil někomu dalšímu pomůže :-)
- voda
- Člen | 561
Konečně jsem se dostal k aktualizaci doplňku. Je opraveno spoustu chyb, přidán composer, přidán odkaz na demo. Více info na stránce doplňku https://componette.org/search/?….
TomasHalasz
Díky za příspěvek, všechno by to mělo být v nové verzi funkční.
drakul
DateInput při vymazání zadané hodnoty posílá hodnotu hidden inputu
Opraveno v nové verzi.
motorcb
Pokud kliknu na button „Nyní“ pro nastavení aktuálního datumu a času, tak se hodnota neodešle.
V nové verzi by to mělo fungovat u všech typu inputů správně.
- yank
- Člen | 2
Ahoj.
Nedari sa mi zobrazit DateTime picker.
Hlasi to JS error:
Unhandled Error: ‚obj.prop‘ is not a function
niekde v tejto casti (jquery-ui-timepicker-addon aktualna verzia z Gitu):
<script>
return obj.prop('slide', null).slider({
orientation: "horizontal",
value: rtl? val*-1 : val,
min: rtl? max*-1 : min,
max: rtl? min*-1 : max,
step: step,
slide: function(event, ui) {
tp_inst.control.value(tp_inst, $(this), unit, rtl? ui.value*-1:ui.value);
tp_inst._onTimeChange();
},
stop: function(event, ui) {
tp_inst._onSelectHandler();
}
});
</script>
Dalej pouzivam:
jquery-ui-1.8.9.custom.min (aj slider aj datepicker)
jquery-1.5.min
a dateInput pre nette 0.9.x
Poradie nacitania js je podla postu vyssie.
Dakujem za odpoved.
- duskohu
- Člen | 778
Caute, neviete niekto v com mam problem, mam formular, a ked nastavim datum a dam odoslat a nasledne v inpute ten datum vymazem a dam zase odoslat, tak mi v tom inpute ten datum znovu zobrazi, aj ked si dumpnem values v metode ktora spracuje formular, tak miesto NULL tam mam ten datum. Nevie niekto v com je problem? mam nette 2.1 dev, pokial pouzijem input text tak je to ok, robi mi to len na dateInput.
protected function createComponentForm()
{
$form = new Form();
$form->addDate('date_from', 'Dátum od', DateInput::TYPE_DATE)
->setAttribute("placeholder", "Dátum od");
$form->addText('id', 'Id');
$form->addSubmit('filter', 'Filter');
$form->onSuccess[] = callback($this, 'filterSubmitted');
return $form;
}
public function filterSubmitted(Form $form)
{
$values = $form->getValues();
}
- voda
- Člen | 561
duskohu napsal(a):
Caute, neviete niekto v com mam problem, mam formular, a ked nastavim datum a dam odoslat a nasledne v inpute ten datum vymazem a dam zase odoslat, tak mi v tom inpute ten datum znovu zobrazi, aj ked si dumpnem values v metode ktora spracuje formular, tak miesto NULL tam mam ten datum. Nevie niekto v com je problem? mam nette 2.1 dev, pokial pouzijem input text tak je to ok, robi mi to len na dateInput.
Ahoj, teď jsem zkoušel verzi Nette 2.0 i 2.1 a v obou mi to funguje v pořádku. Jakou máš verzi jquery a jquery-ui? Nehlásí to nějakou javascriptovou chybu?
Prave som narazil este na jeden problem. Ked mas na stranke formular s dateInputom, a prebehne payload,
tak sa tento input zdupluje, ked je 1 urobi 2 ..4 ..
To záleží na tom, jak máš nastavenou inicializaci. Vydal jsem verzi 1.0.1, kde je toto ošetřené.
- xxxmisko
- Člen | 140
Ahoj!
Vedeli by ste mi poradiť, ako spraviť takú vec, napríklad checkin a checkout? Teda, že v prvom Date vyplním nejaký dátum a čas a v druhom bude defaultne zadaný ten istý dátum a čas bude napríklad +1hodina?
Ako by som to vedel v tomto doplnku spraviť? Pre prvý Date mu viem nastaviť default hodnoty, ale ako urobiť druhý Date zavislý na prvom? Ďakujem za každú radu.
- xxxmisko
- Člen | 140
Keďže sa mi nedostáva odpoveď na moju otázku, mám pocit, že to asi
nejde :(
Skúsim ďalšiu otázku. Nastavím addRule a Form::RANGE. Ako typ používam
DateInput::TYPE_DATE. Ak dám range array(new Date(), new Date(‚+2 year‘)),
vyberiem dnešný dátum, tak neprejde validáciou. Je to zrejme bug
v doplnku.
Ciao
- voda
- Člen | 561
Ahoj,
xxxmisko napsal(a):
Vedeli by ste mi poradiť, ako spraviť takú vec, napríklad checkin a checkout? Teda, že v prvom Date vyplním nejaký dátum a čas a v druhom bude defaultne zadaný ten istý dátum a čas bude napríklad +1hodina?
Řeší se to stejně jako v samostatném datepickeru:
$('#frmtestForm-from').datepicker('option', 'onSelect', function(val, inst) {
var date = $('#frmtestForm-from').datepicker("getDate");
date.setDate(date.getDate() + 2);
$('#frmtestForm-to').datepicker( "setDate", date);
});
ešte mám takú vec, je možné dostať addCondition a addConditionOn to nového dátumu? Ide o to, že dátum nemusí byť vyplnený a keď je vyplnený, aby mal nejaké addRule. Pretože ak nie je vyplnený a nie je required, formulár nie je validný.
Jednoduše asi ne, protože doplněk pracuje s DateTime objekty, s kterými formulářová validace moc nefunguje. Nejlépe ukaž konkrétní kód co potřebuješ a já se na to podívám.
Skúsim ďalšiu otázku. Nastavím addRule a Form::RANGE. Ako typ používam DateInput::TYPE_DATE. Ak dám range array(new Date(), new Date(‚+2 year‘)), vyberiem dnešný dátum, tak neprejde validáciou. Je to zrejme bug v doplnku.
Díky za bugreport, je to opraveno na master větvi.
- xxxmisko
- Člen | 140
Jednoduše asi ne, protože doplněk pracuje s DateTime objekty, s kterými formulářová validace moc nefunguje. Nejlépe ukaž konkrétní kód co potřebuješ a já se na to podívám.
Takáto obyčajná vec:
$form->addDate('datum_posledny', 'Dátum posledný', DateInput::TYPE_DATE)
->addConditionOn($form['datum_posledny'], Form::FILLED)
->addRule(Form::RANGE, null, array(new DateTime('+1 day'), new DateTime('+2 year')))
->getControlPrototype()->readonly('readonly');
skrátka chcem, aby keď bude tá položka vyplnená, aby bola validovaná podľa nejakého pravidla.
Editoval xxxmisko (15. 5. 2013 14:56)
- vvoody
- Člen | 910
Nemá niekto potuchy čo sa mi tam rozbilo? Nic som neupgradoval, doteraz to šlo bez problému.
Celkom ten exception nechápem.
Magic method App\AdminModule\Components\BaseUIForm::addDate() has not
corresponding property $dates
nette 2.1 dev
edit: tak už som na to prišiel, dal som si do base formu @method anotacie pred triedu aby som mal nápovedu, vôbec nechápem čo sa pokúšal framework spraviť len na základe tých anotácií. Takže už mi to funguje len nemám nápovedu :(
edit2: takže ObjectMixin na základe anotácie @method addDate hľadá property $dates do ktorej chce vložiť parameter volanej metódy addDate. Kontrola existencie extension metod je až za kontrolou existencie anotácií @methods, takže si nemôžem oanotovať addNiečo metódy pridané cez extension method.
Editoval vvoody (23. 8. 2013 13:06)
- Casper
- Člen | 253
Zdravím,
pokud použiji Nette 2.1dev s validací
Form::RANGE
, Nette se pokouší volat
Nette\Forms\Validator::validatedateInputRange()
namísto
DateInput::validatedateInputRange()
.
Použití:
$this->addDate('myDate', "Date", DateInput::TYPE_DATETIME)
->addRule(self::RANGE, '%label must be in future.', array(new DateTime(), NULL));
Bylo by možné přidat podporu pro tuto validaci i pro Nette 2.1dev? Hádám, že za to může tento commit.
Jako workaround lze použít tradiční callback + nastavit min a max:
$now = new DateTime();
$this->addDate('myDate', "Date", DateInput::TYPE_DATETIME)
->addRule("\Vodacek\Forms\Controls\DateInput::validateDateInputRange", '%label must be in future.', array($now, NULL));
->getControlPrototype()->min($now->format("Y-m-d\TH:i:se"));
Editoval Casper (24. 8. 2013 17:19)
- michal.lohnisky
- Člen | 64
Ahoj,
datetime picker mi zlobí: http://jsfiddle.net/KK5DL/1/ (používám FF 26.0) otevře se ihned po načtení stránky, a to i když to není první input ve stránce. Je to hodně nepříjemné, ale vyřešil jsem to tak, že jsem si stáhl kód z dema: http://date-input.vodacek.eu/script.js . Bohužel nedokážu říct, jaký je v kódech rozdíl.
Byl bych rád, když by někdo přišel té nepříjemnosti na kloub.
- michal.lohnisky
- Člen | 64
@Voda: ta hodnota se nastaví při
<?php
new DateTime('0000-00-00 00:00:00.000000');
?>
A tu hodnotu jsem měl v DB. Ale podle mě by to přesto nemělo mít takové chování. Asi špatná reakce při nepodařeném rozparsování data?
- voda
- Člen | 561
Honza_S napsal(a):
Ahoj,
zkouším použití DateInput ve filtru DataGridu a dochází tam k tomu, že DateInput posílá objekt DateTime což DataGrid nevezme. Dá se nějak nastavit DateInput aby odeslal jen string ? Nebo na to jdu úplně špatně? Díky
Ahoj, hlavní výhoda DateInputu je právě v tom, že vrací rovnou DateTime objekt. Lepší by bylo upravit DataGrid aby podporoval i objekty ve filtrech. Problém bude asi v Datagrid.php:464.
- michal.lohnisky
- Člen | 64
Jasně, chápu, ale to není moje DB. Stejně si myslím, že by to při chybě parsování nemělo ten picker otevírat. Nebo jo?
- Honza_S
- Člen | 12
@voda: ale neřeší to další průběh, protože DataGrid.php:251 pak opět plní filtrační formulář
<?php
$this['form']['filter']->setDefaults($this->filter);
?>
a to už $this->filter neobsahuje objekt DateTime, ale jen array a to se pochopitelně DateInput.php:110 nelíbí – Invalid type for $value
edit: array_filter() tedy asi nezachová objekt
Editoval Honza_S (5. 2. 2014 19:27)
- voda
- Člen | 561
@Honza_S: Nikde tam nevidím, že by se objekt DateTime převáděl na nějakou jinou hodnotu. Nemáš tam ještě upravený kód?
- Honza_S
- Člen | 12
@voda: ne úpravu jsem smáznul a nahradil funkcí z pull
reqestu.
Nenapadá mne nic jiného, než že se to ztrácí ve funkci array_filter() ←
edit: blbost!
Laděnka hlásí na DataGrid.php:251 toto pole:
<?php
array (1) ▼
datum_zalozeni => array (3) ▼
date => "2014-01-25 00:00:00" (19)
timezone_type => "3"
timezone => "Europe/Prague" (13)
?>
Editoval Honza_S (5. 2. 2014 20:17)
- kralik
- Člen | 230
Ahoj,
prosím věděli byste mi poradit.
Zkouším tuto skvělou komponentu. Vše maká super.
Ale trápím se při vykonání ajaxu.
Presenter
<?php
...
$form->addDate('zalozeno', 'Založeno', DateInput::TYPE_DATETIME)
->setDefaultValue($now);
?>
V šabloně nadefinován přes js formát datumu.
Pokud se zobrazí formulář, u prvku „zalozeno“ se objeví aktuální
datum: 16.4.2014 12:56
kliknu-li zobrazí se DataTimePicker.
Super.
Bohužel když vyberu ze SelectBoxu (DependentSelectBox), ale po provední invalidateControl snippetu (celý form) se mi hodnota datumu změní na: 2014–04–16T12:56:00Z
Nevíte jak zamezit změně formátu datumu při ajaxu?
Moc díky
- ludek
- Člen | 83
Zdravím. I když jedu podle návodu, dostávám pořád
Fatal Error: Class 'App\Presenters\DateInput' not found.
Asi je to nějak působeno použitím „namespace App\Presenters“; v novém sandboxu. Zkouším dát „use Vodacek\Forms\Controls;“, ale žádný úspěch.
namespace App\Presenters;
use App\Model,
Nette,
Nette\Application\UI\Form;
use Vodacek\Forms\Controls;
class HomepagePresenter extends BasePresenter {
protected function createComponentEditForm() {
$form = new Nette\Application\UI\Form;
//...
$form->addDate('date', 'Date', DateInput::TYPE_DATE)->addRule(Form::VALID);
//...
return $form;
}
}
Můžu prosit o radu? Dík.
Editoval ludek (9. 9. 2014 16:57)
- ludek
- Člen | 83
Ještě počeštění kalendáříku – do javascriptu doplnit:
options: { // global options
closeText: "Zavřít",
currentText:"Aktuální",
prevText: 'Předchozí',
nextText: 'Další',
monthNames: ['Leden','Únor','Březen','Duben','Květen','Červen', 'Červenec','Srpen','Září','Říjen','Listopad','Prosinec'],
monthNamesShort: ['Le','Ún','Bř','Du','Kv','Čn', 'Čc','Sr','Zá','Ří','Li','Pr'],
dayNames: ['Neděle','Pondělí','Úterý','Středa','Čtvrtek','Pátek','Sobota'],
dayNamesShort: ['Ne','Po','Út','St','Čt','Pá','So',],
dayNamesMin: ['Ne','Po','Út','St','Čt','Pá','So']
}
- Azathoth
- Člen | 495
Ahoj, zkouším rozchodit tenhle addon a mám menší problém s javascriptem. Při kliknutí položky ve formuláři se mi nezobrazí ten kalendář.
V bootstrap.php jsem zaregistroval addon:
<?php
Vodacek\Forms\Controls\DateInput::register(); //registrace voda/dateInut addonu
$container = $configurator->createContainer();
return $container;
?>
Ve formafactory mám zkopírovány zdrojáky z http://date-input.vodacek.eu/
<?php
$form = $this->baseFormFactory->create(); //tady si injectuji do formuláře translator
$form->addDate('date', 'Date', DateInput::TYPE_DATE)
->addRule(Form::VALID);
$form->addDate('datetime', 'Datetime', DateInput::TYPE_DATETIME)
->setDefaultValue(new DateTime())
->addRule(Form::RANGE, null, array(new DateTime('-1 month'), new DateTime('+1 month')));
$form->addDate('datetimeLocal', 'Local datetime', DateInput::TYPE_DATETIME_LOCAL)
->setDefaultValue(new DateTime())
->addRule(Form::RANGE, null, array(new DateTime('-2 years'), new DateTime('+2 years')));
$form->addDate('month', 'Month', DateInput::TYPE_MONTH);
$form->addDate('week', 'Week', DateInput::TYPE_WEEK)
->setDefaultValue(new DateTime())
->addRule(Form::RANGE, null, array(new DateTime('-1 year'), new DateTime('+6 months')));
$form->addDate('time', 'Time', DateInput::TYPE_TIME)
->setDefaultValue(new DateTime('noon'));
$form->addSubmit('send', $form->getTranslator()->translate('forms.add_course.button'));
return $form;
?>
V @layout.latte mám
{block scripts}
<script src=„{$basePath}/js/jquery.min.js“></script>
<script src=„{$basePath}/js/netteForms.js“></script>
<script src=„{$basePath}/js/main.js“></script>
<script type=„text/javascript“
src=„http://maps.googleapis.com/maps/api/js?libraries=places&sensor=false“></script>
{*kvůli google maps addonům*}
<script src=„{$basePath}/js/nette.gpsPicker.js“></script>
{*z vojtech-dobes/nette-forms-gpspicker*}
<script type=‚text/javascript‘
src=„{$basePath}/jquery-ui/jquery-ui.min.js“></script> {*kvůli
voda/dateInput addonu*}
<script type=‚text/javascript‘
src=„{$basePath}/jquery-ui/jquery-ui-timepicker-addon.js“></script>
{*kvůli voda/dateInput addonu*}
<script type=‚text/javascript‘
src=„{$basePath}/js/dateInput.js“></script>
{*z voda/date-input*}
<link rel=„stylesheet“ type=„text/css“
href=„{$basePath}/jquery-ui/jquery-ui.min.css“> {*kvůli voda/dateInput
addonu*}
<link rel=„stylesheet“ type=„text/css“
href=„{$basePath}/jquery-ui/jquery-ui-timepicker-addon.css“> {*kvůli
voda/dateInput addonu*}
<link rel=„stylesheet“ type=„text/css“
href=„{$basePath}/css/dateInput.css“> {*z voda/date-input*}
{/block}
a v latte souboru, který vykresluje formulář, mám:
{block content}
{control addCourseForm}
<script> {*inicializace voda date input kalendáře*}
$(document).ready(function() {
$(‚input[data-dateinput-type]‘).dateinput({
datetime: {
dateFormat: ‚d.m.yy‘,
timeFormat: ‚H:mm‘,
options: { // options for type=datetime
changeYear: true
}
},
‚datetime-local‘: {
dateFormat: ‚d.m.yy‘,
timeFormat: ‚H:mm‘
},
date: {
dateFormat: ‚d.m.yy‘
},
month: {
dateFormat: ‚MM yy‘
},
week: {
dateFormat: „w. ‚week of‘ yy“
},
time: {
timeFormat: ‚H:mm‘
},
options: { // global options
closeText: „Close“
}
});
});
</script>
{/block}
a bohužel mi to nefunguje a kalendář se nezobrazuje.
Verze:
jquery: 2.1.1
jquery-ui: 1.11.1
jquery-ui-timepicker addon: 1.5.0
Editoval Azathoth (15. 9. 2014 15:21)