Kdyby/Replicator zmaže riadok a potom pridá nový

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

Zdravím,
naištaloval som doplnok https://componette.org/search/?…. Formulár začínam defaultne s 8 riadkami. Keď zmažem 8., tak sa stránka refreshne a ostane tam 7 riadkov – super, takto to má byť. No keď nepotrebujem 7 a 7. zmažem, stránka sa refreshne, a miesto 6 je tam stále 7, no bez počatočných hodnôt (Presne, ako keď by som dal pridať riadok).
Stáva sa to len pri úplne novom „čistom“ formulári, nie pri editácii predvyplnených hodnôt.

Vytvorenie formuláru a predvyplnenie:

$removeSheet = callback($this, 'removeSheet');
        $removeQuestion = $this->translator->translate('templates.deleteQuestion');

        $sheets = $form->addDynamic('sheets', function(Container $sheet) use ($removeSheet, $removeQuestion) {
            $sheet->addText('from', 'forms.ui.from')
                ->addRule(Form::FILLED, 'forms.error.enterFrom')
                ->addRule(Form::PATTERN, 'forms.error.timePattern', '^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$');
            // Dalsie riadky
			// ...
            // Remove button
            $sheet->addSubmit('remove', 'forms.ui.remove')
                ->setAttribute('onclick', "return confirm('$removeQuestion');")
                ->setValidationScope(false)
                ->addRemoveOnClick($removeSheet);
        }, 8;

// Add new sheet
        $sheets->addSubmit('add', 'forms.ui.add')
            ->setValidationScope(false)
            ->addCreateOnClick();

// Default values
for ($i = 0; $i < 8; $i++) {

                $form['sheets'][$i]->setDefaults(array(
                    'from' => $i . ':00' // Predyplnuje sa viac, no je zbytocne tu zobrazovat vsetko
                ));
            }

Callback po mazaní – služí len pri editácii, kde sa jednotlivé riadky zmažú aj z DB:

public function removeSheet(\Kdyby\Replicator\Container $replicator, Container $sheetContainer)
    {
        $id = $sheetContainer->components['id']->value;
        if (is_numeric($id)) {
            $sheet = $this->sheets->findOneBy(['id' => $id]);
            if ($sheet) {
                $this->entry->removeSheet($sheet);
                $this->sheets->em()->remove($sheet);
                $this->sheets->em()->flush();
            }
        }
    }

Vopred ďakujem za pomoc.

David Matějka
Moderator | 6445
+
+1
-

problem bude s tema Default values, ktere predvyplnujes – ty totiz incializuji ty kontejnery (ale zobrazi se prazdny kvuli chybe v kdyby/replicatoru)

EDIT:

resenim by mohlo byt zkontrolovat $form->isSubmitted(), problem je, ze v tovarne neni form pripojen k presenteru, takze ho budes muset pripojit rucne, treba

$this[$name] = $form;
//nebo
new Form($this, $name);
//$name je nazev komponenty, muzes si to vyzadat jako prvni parametr createComponent* metody

a nebo to provest v action

orech
Člen | 40
+
0
-

David Matějka napsal(a):

problem bude s tema Default values, ktere predvyplnujes – ty totiz incializuji ty kontejnery (ale zobrazi se prazdny kvuli chybe v kdyby/replicatoru)

To, že sú prázdne, mi nevadí. Skôr mi vadí, že ak dám zmazať riadok, tak sa zmaže, no pridá sa na jeho miesto nový – no nechcem tam pridávať nový. Posledný riadok sa dá zmazať v pohode, no predposledný, ktorý sa stane posledným už nie. Zmažem a vytvorí sa znova. Ako keby tam muselo byť presne 7 riadkov, také číslo ale nikde nemám.

EDIT:

resenim by mohlo byt zkontrolovat $form->isSubmitted(), problem je, ze v tovarne neni form pripojen k presenteru, takze ho budes muset pripojit rucne, treba

$this[$name] = $form;
//nebo
new Form($this, $name);
//$name je nazev komponenty, muzes si to vyzadat jako prvni parametr createComponent* metody

a nebo to provest v action

Formulár je v komponente a riadky formulára inicializujem v metóde attached (napr. kvôli editácii, keď chcem zobraziť len 6 riadkov, nie defaultných 8):

public function attached($presenter)
    {
        parent::attached($presenter);
        $this->_setDefaultValues();
    }

EDIT:

Keď som zakomentoval setovanie defaultných hodnôt, tak to funguje správne. Teraz ale neviem, ako to spraviť tak, aby odsetovali pred mazaním.

Editoval orech (4. 8. 2015 12:42)

orech
Člen | 40
+
0
-

resenim by mohlo byt zkontrolovat $form->isSubmitted()

Nie mohlo, ale je :) Ten attached sa mi tam volal furt. Pridal som tam pred for cyklus kontrolu na odoslanie a je to vyriešené.