forms vs. datum

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

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
+
0
-

Nette samotné žádný takový prvek nemá, nicméně v Repozitáři komponent a pluginů je doplněk Forms\DatePicker.

beko
Člen | 2
+
0
-

Dakujeeeem! presne to so potreboval. Mozno by bolo dobre tu zatvorenu diskusiu ukoncit odkazom na tento balik, urcite to pomoze ostatnym co budu take nieco hladat.

RaR
Člen | 42
+
0
-

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
+
0
-

A máš nadefinovanou funkci Form_addDatePicker, kterou v tom callbacku voláš?

RaR
Člen | 42
+
0
-

jj, tu funci tam mám, ale asi se k ní ani nedostane. Když ji přejmenuji nebo smažu, tak je ta chyba pořád stejná.

David Grudl
Nette Core | 8218
+
0
-

Jakou přesně verzi PHP máš? Můžeš vypsat

Form::extensionMethod('Form::addDatePicker', 'Form_addDatePicker');
Debug::dump( Form::extensionMethod('Form::addDatePicker') )
RaR
Člen | 42
+
0
-

verze je

PHP Version 5.2.3

debug vypíše

string(18) "Form_addDatePicker"
David Grudl
Nette Core | 8218
+
0
-

Nejsem schopen ten stav nasimulovat. Zkus tedy ještě v ObjectMixin.php vydumpovat proměnnou $cb, ideálně před a po fixCallback.

RaR
Člen | 42
+
0
-

v obou případech, před i po

string(18) "Form_addDatePicker"
David Grudl
Nette Core | 8218
+
0
-

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)

RaR
Člen | 42
+
0
-

v presenteru který je odvozený od BasePresenteru
ve startup() je Form::extensionMethod(‚Form::addDatePicker‘, ‚Form_addDatePicker‘);
a tom stejným presenteru je ta funkce

Editoval RaR (19. 3. 2009 16:32)

Panda
Člen | 569
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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>