Jak na dynamické formuláře popřípadě rozchození datagridu v php 5.3 s namespace

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

Dobrý den,
mám dotaz, procházel jsem addony a zkoušel je rozchodit (DataGrid atd.. věci na fromuláře), ale ne a ne mě to jet :D, jedu v 5.3 s namespace… ale asi dělám něco špatně, má někde někdo jak to jednoduše rozjet?

A druhá otázka, je možnost si vykreslit formulář napříkalt se 4řma inputama a mít pak někde tlačítko na které když se klikne přibude další textinput? Jedná se mě o to, že bych si napsal aplikačku, kde nevím přesně kolik věcí zadá uživatel a nechci tam mít na tvrdo třeba 5 textinputů a tím ho omezit. Takhle by tam měl třeba jeden a dodal by si jich tam kolik chce…

Nox
Člen | 378
+
0
-
  1. měnily se teď namespace, možná se ne všechny addony ještě updatovaly… zkus na ně použít nástroj tools\Code-Migration\class_update.php
tatyalien
Člen | 239
+
0
-

To nikde nemám ;)
v tools mám jen:

  • Code-Checker
  • Ini2Neon
  • Requirements-Checker
na1k
Člen | 288
+
0
-

tatyalien, stáhni tady: https://github.com/nette/tools

Stejně tak by měl být převaděč i v posledním alpha buildu na download stránce ;)

tatyalien
Člen | 239
+
0
-

No nette jsem stahoval i dneska a stejně tam není… ;)

Mikulas Dite
Člen | 756
+
0
-

Není to v Nette, ale v jiném repu. Bude se ti ale hodit minified verze, bez který to pustíš obtížněji: https://nette.org/cs/packages

tatyalien
Člen | 239
+
0
-

Oki, snad se v tom neztratím… sice by bylo asi jednoduší, kdyby někdo uploudnul doplňky na 5.3 verze a bylo by to i pro ostatní bez práce…

když každej preferuje co tu čtu 5.3 s namespace tak by alespoň ty doplňky mohly být kompatibilní ;)

Martin
Člen | 171
+
0
-

tatyalien: Ohledně druhého dotazu – ještě sháníš řešení? Možná se tady na fóru ještě podívej, jestli to někdo řešil čistě, pokud ne, zkusil bych to primitivně. Předpokládám, že chceš pouze přidávat, pro ubírání by se následující muselo upravit natolik, že by bylo lepší to řešit jinak. Takže – nadefinuj formulář s N inputy. N-tý input bude neomezeně opakovatelný, jednoznačně si ho označ. Při kliku na „přidej“ třeba přes jquery vyžádáš ajaxovou odpověď, která vrátí html kód nového inputu, následovaný starým známým N-tým. Tím nech jquery nahradit ten původní N-tý přes jeho jednoznačné ID. Všechny nové samozřejmě identifikuj nějakým indexem, který se použije i v továrničce při závěrečné „výrobě“ formuláře pro validaci a v onSubmit pro zpracování zadaných dat. A aktuálně dosažený počet přidaných (= nejvyšší index) si můžeš schovávat třeba ve skrytém poli formuláře. Najdu-li někdy čas, třeba to implementuju, nebo se mrkni sem , kde jsem řešil něco podobného (ale je to tam dost dlouhé, Tvůj problém by takhle měl jít tak na 5 řádků kódu). Ale určitě to jde i líp – třeba se alespoň někdo ozve, že navrhuji ptákovinu a poradí, jak to udělat správně.

tatyalien
Člen | 239
+
0
-

No já s ajaxem zatím nemám tolik zkušeností, tak to zatím řeším následovně: (čistě přez php s pomocí sessionu.)

<?php
         $this->addText('zbozi_katalog_0', 'Katalogové číslo pol. č. 0')
                 ->addRule(Form::MAX_LENGTH, 'Maximální délka smí být %d znaků', 50);
        $this->addText('zbozi_nazev_0', 'Název položky č. 0')
                ->addRule(Form::MAX_LENGTH, 'Maximální délka smí být %d znaků', 50)
                ->addConditionOn($this['zbozi_katalog_0'], Form::FILLED)
                ->addRule(Form::FILLED, 'Vyplňte název položky č. 0');
        $this->addTextArea('zbozi_zavada_0', 'Závada položky č. 0', 30, 3)
                ->addRule(Form::MAX_LENGTH, 'Maximální délka smí být %d znaků', 1024)
                ->addConditionOn($this['zbozi_katalog_0'], Form::FILLED)
                ->addRule(Form::FILLED, 'Vyplňte závadu položky č. 0');
        // Nyní si načtu session proměnné, pokud proměnná existuje vytvořím potřebný počet formulářů + dodám defaultní hodnoty
        $namespace = Environment::getSession('rkl_test');

        if(isset($namespace->PocetFormularu)) {
            for ($i = 1; $i <= $namespace->PocetFormularu; $i++) {
                $this->addText("zbozi_katalog_$i", "Katalogové číslo pol. č. $i")
                        ->addRule(Form::MAX_LENGTH, 'Maximální délka smí být %d znaků', 50);
                $this->addText("zbozi_nazev_$i", "Název položky č. $i")
                        ->addRule(Form::MAX_LENGTH, 'Maximální délka smí být %d znaků', 50)
                        ->addConditionOn($this["zbozi_katalog_$i"], Form::FILLED)
                        ->addRule(Form::FILLED, "Vyplňte název položky č. $i");
                $this->addTextArea("zbozi_zavada_$i", "Závada položky č. $i", 30, 3)
                        ->addConditionOn($this["zbozi_katalog_$i"], Form::FILLED)
                        ->addRule(Form::MAX_LENGTH, 'Maximální délka smí být %d znaků', 1024)
                        ->addRule(Form::FILLED, "Vyplňte závadu položky č. $i");
// budoucí nástřel:
                // nebudu zadávat, že daný prvek musí být vyplněn, abych mohl jednoduše ukládat do DB
                // protože pokud by měl uživatel naklikané třeba 4ři formuláře a vymazal zboží z druhého tak by mu to
                // furt řvalo, že má vyplnit hodnotu u 2hého formuláře...
            }
            $this->setDefaults($namespace->defaults);
	}
        $this->addSubmit('ok', 'Odeslat');
        $this->addSubmit('pridat', 'Přidat další zboží')
                ->setValidationScope(FALSE);
        $this->addSubmit('vymazat', 'Vymazat')
                ->setValidationScope(FALSE);
?>

A v obsluze odeslání:

<?php
        public function pridatClicked(\Nette\Forms\SubmitButton $button) {
            $values = $button->getForm()->getValues();
            $namespace = Environment::getSession('rkl_test');

            if(isset($namespace->PocetFormularu)) {
                $namespace->PocetFormularu = $namespace->PocetFormularu + 1;
            } else {
                $namespace->PocetFormularu = 1;
            }
            $namespace->defaults = $values;
            $this->redirect('this');
        }

        public function vymazatClicked(\Nette\Forms\SubmitButton $button) {
            $namespace = Environment::getSession('rkl_test');
            unset($namespace->PocetFormularu, $namespace->defaults);
            $this->redirect('this');
        }
?>

Editoval tatyalien (28. 4. 2011 23:04)

Martin
Člen | 171
+
0
-

No ono to mnou navrhované řešení by fungovalo stejně jen se zapnutým javascriptem, ale zase by to bylo bez redirectu. Možná to časem doplním do své stále dodělávané formulářové třídy a dám vědět, takhle narychlo to nenapíšu.

tatyalien
Člen | 239
+
0
-

Martin:
Ok, kdyby jsi to někdy časem udělal, že by to fachalo i přez javascript, tak bych si to upravil. Takhle to mám na tvrdo do Sessionu, ale vyhoda je, že pokud natvrdo dá obnovit stránku, že se mu zobrazí již vygenerované textové pole (to co si naklikal).

Možná, pokud bych nebyl línej, bych si udělal i něco v tom smyslu, že bych dodal selectbox a tlačítko „vymazat blok“ kde by si zvolil jaký chce uživatel odstranit, ten by se odmazal. Jen bych si musel poupravit ukládání dat do sessionu, ale to mě momentálně netrápí ;)