forms vs. datum
- beko
- Člen | 2
Je mozne pridat do formularu prvok na vlozenie datumu? Hladal som na fore, ale nasiel som iba tuto uzavretu diskusiu: https://forum.nette.org/…iewtopic.php?…
Nepokrocilo v tomto este nette?
vopred vdaka za info :)
- Panda
- Člen | 569
Nette samotné žádný takový prvek nemá, nicméně v Repozitáři komponent a pluginů je doplněk Forms\DatePicker.
- RaR
- Člen | 42
Pokusil jsem se podle návodu implementovat DatePicker.
pokud v basepressenteru ve startup uvedu
<?php
Form::extensionMethod('Form::addDatePicker', 'Form_addDatePicker');
?>
dostanu varování
Warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'Form_addDatePicker' was given in /libs/Nette/ObjectMixin.php on line 98
a poté
Fatal error: Call to a member function setDisabled() on a non-object in /app/presenters/AdminModule/TerminesPresenter.php on line 178
Když si v NetBeans otevřu ObjectMixin.php
<?php
94 // extension methods
95 if ($cb = self::extensionMethod($class, $name)) {
96 array_unshift($args, $_this);
97 fixCallback($cb);
98 return call_user_func_array($cb, $args);
99 }
?>
tak u řádku 95 mám varování (btw. totéž u řádku 150)
Possible accidental assignment, assignments in conditions should be avoided
- romansklenar
- Člen | 655
A máš nadefinovanou funkci Form_addDatePicker
, kterou v tom
callbacku voláš?
- David Grudl
- Nette Core | 8218
Jakou přesně verzi PHP máš? Můžeš vypsat
Form::extensionMethod('Form::addDatePicker', 'Form_addDatePicker');
Debug::dump( Form::extensionMethod('Form::addDatePicker') )
- David Grudl
- Nette Core | 8218
Nejsem schopen ten stav nasimulovat. Zkus tedy ještě v ObjectMixin.php vydumpovat proměnnou $cb, ideálně před a po fixCallback.
- David Grudl
- Nette Core | 8218
V tom případě máš chybu v kódu, protože funkce Form_addDatePicker neexistuje. Kde ji deklaruješ?
(marné to pátrání nebylo, přidám do ObjectMixin vyhození výjimky)
- Panda
- Člen | 569
Hm, nemáš náhodou tu funkci jako členskou metodou toho presenteru? Pokud ano, tak by to asi mělo být
<?php
Form::extensionMethod('Form::addDatePicker', array($this, 'Form_addDatePicker'));
?>
Lepší by ale bylo tu funkci deklarovanou mimo třídu, neboť je to funkce formuláře, ne presenteru.
- David Grudl
- Nette Core | 8218
Nebo se na extension method vykašlat a psat
// místo
$form->addDatePicker('datum', 'Datum:', 10)
->addRule(Form::FILLED, 'Zadejte prosím datum.');
// raději
$form['datum'] = new DatePicker('Datum:', 10);
$form['datum']->addRule(Form::FILLED, 'Zadejte prosím datum.');
- RaR
- Člen | 42
Panda napsal(a):
Hm, nemáš náhodou tu funkci jako členskou metodou toho presenteru? Pokud ano, tak by to asi mělo být
<?php Form::extensionMethod('Form::addDatePicker', array($this, 'Form_addDatePicker')); ?>
Lepší by ale bylo tu funkci deklarovanou mimo třídu, neboť je to funkce formuláře, ne presenteru.
Mám :(.
Když jsem ji dal mimo třídu, tak to funguje. Díky za pomoc.
- Roman Ožana
- Člen | 52
Mě se osvědčila kombinace: jQuery a http://jonathanleighton.com/…s/date-input
Český překlad:
$.extend(DateInput.DEFAULT_OPTS, {
month_names: ["Leden", "Únor", "Březen", "Duben", "Květen", "Červen", "Červenec", "Srpen", "Září", "Říjen", "Listopad", "Prosinec"],
short_month_names: ["Led", "Úno", "Bře", "Dub", "Kvě", "Čer", "Čvc", "Srp", "Zář", "Říj", "Lis", "Pro"],
short_day_names: ["Ne", "Po", "Út", "St", "Čt", "Pá", "So"],
stringToDate: function(string) {
var matches;
if (matches = string.match(/^(\d{2,2})\.(\d{2,2}\.(\d{4,4}))$/)) {
return new Date(matches[3], matches[2] - 1, matches[1]);
} else {
return null;
};
},
dateToString: function(date) {
var month = (date.getMonth() + 1).toString();
var dom = date.getDate().toString();
if (month.length == 1) month = "0" + month;
if (dom.length == 1) dom = "0" + dom;
return dom + "." + month + "." + date.getFullYear();
}
});
Datum je naformátováno tak, jak je u nás zvykem jako dd.mm.yyyy
V presenteru nemusíte nic měnit:
<?php
$form->addText('datum', 'Datum ukončení', 20)
->setOption('description', 'datum ukončení');
?>
Do šablony pak stačí napsat např.:
<script>
$(function() {
$("#frmalbumForm-datum").date_input();
});
</script>