Editování již přidaného příspěvku

Martin Hanzl
Člen | 6
+
0
-

Dobrý den,
jsem úplný začátečník a v nette se učím zhruba dva týdny. Zatím jedu podle úvodního tutoriálu pro vytvoření nette blogu. Narazil jsem na problém při editování článků koknkrétně u funkce toArray(). Nevíte někdo prosím co s tím?
Děkuji za odpověď

Formulář:

protected function createComponentAddClanek() :Form {
        $datum = date("Y-m-d");
        $form = new Form();
        $form->addHidden("Datum")
                ->setValue($datum);
        $form->addHidden("Uzivatele_ID")
                ->setValue($this->user->getId());
        $form->addText("Nadpis")
            ->setRequired("Zadejte nadpis článku")
            ->setHtmlAttribute("placeholder", "Nadpis");
        $kategorie = [
            1 => "Závod",
            2 => "Nácvik",
            3 => "Školení",
            4 => "Ples",
            5 => "Exhibice",
            6 => "Informace",
        ];
        $form->addSelect("Kategorie_Prispevky_ID", '', $kategorie)
                ->setRequired("Vyberte prosím kategorii článku!");
        $form->addTextArea("text")
                ->setHtmlId("summernote");
        $form->addSubmit("btnAdd", "Zapsat příspěvek");
        $form->onSuccess[] = [$this, 'addFormSucceeded'];
        return $form;
    }

Kód pro editaci:

public function actionEdit($id) :void {
        $post = $this->database->table('prispevky')->where("prispevkyID", $id);
        if(!$post) {
            $this->error("Příspěvek nebyl nalezen");
        }
        $this["addClanek"]->setDefaults($post-toArray());
    }

Callback funkce:

public function addFormSucceeded(Form $form, array $values) : void {
        $postID = $this->getParameter("id");
        if($postID) {
            $prispevek = $this->database->table("prispevky")->where("prispevkyID", $postID);
            $prispevek->update($values);
        } else {
            $prispevek = $this->database->table("prispevky")->insert($values);
        }
        $this->redirect("Administration:clanky");
    }

Editoval Martin Hanzl (21. 3. 2020 15:26)

Šaman
Člen | 2632
+
0
-

A v čem je problém?
Jinak ten „Kód pro editaci“ není kód pro editaci, ale jen nastavení defaultních hodnot formuláře. Kód pro editaci příspěvku je právě ten callback.

Martin Hanzl
Člen | 6
+
0
-

Problém je v tom, že mi to vyhodí tento error:

Call to undefined method Nette\Database\Table\Selection::toArray()

Zkoušel jsem hledat všude možně, ale nikde jsem nic nenašel.

Editoval Martin Hanzl (21. 3. 2020 15:47)

CZechBoY
Člen | 3608
+
+1
-

Chybí ti tam ->fetch()

public function actionEdit($id) :void {
        $post = $this->database->table('prispevky')->where("prispevkyID", $id)->fetch();
        if(!$post) {
            $this->error("Příspěvek nebyl nalezen");
        }
        $this["addClanek"]->setDefaults($post-toArray());
    }
Martin Hanzl
Člen | 6
+
0
-

Jo bylo to tím.
Děkuju moc ;)

Polki
Člen | 553
+
0
-

@MartinHanzl A metodu ->toArray() vůbec volat nemusíš. Stačí ten ->fetch() s tím si Nette hravě poradí.

GEpic
Člen | 562
+
+1
-

Jen ještě jedno doporučení, a to sice že by si neměl u formulářových prvků používat setValue ale setDefaultValue. IDE by ti mělo hlásit, že setValue je @internal.

Také doporučuji inicializovat javascriptové wysiwyg editory dle tříd, né ID (->setHtmlId("summernote");). Snadno se totiž může stát, že budeš potřebovat mít 2 editory ve formuláři (například perex a samotný obsah) a s tímto řešením si zavíráš dveře.

A sorry za off. ;)

Editoval GEpic (24. 3. 2020 1:18)

Martin Hanzl
Člen | 6
+
0
-

Polki napsal(a):

@MartinHanzl A metodu ->toArray() vůbec volat nemusíš. Stačí ten ->fetch() s tím si Nette hravě poradí.

Jak říkám jsem začátečník a postupuji podle návodu „Píšeme první aplikaci“.
Každopádně děkuji za radu.

Šaman
Člen | 2632
+
+1
-

Tak to je nejlepší si každou takovouhle věc dumpnout. bdump($post-toArray());, pokud to bude hlásit že to nezná toArray, tak bdump($post); abys měl přehled s čím pracuješ.

V tomhle případě předvyplňuješ formulář. V tom nejjednodušším případě (tady) tedy stačí načíst řádek z tabulky a použít metodu toArray(), jindy si to pole budeš muset sestavit sam třeba z více tabulek…
Až budeš chápat základní příklady, tak doporučuji projít samostatně databázi a její možnosti. A jak se pracuje s tím, co vrací (často není potřeba převádět to na statické pole, protože vrácený objekt je ArrayHash, takže se jako pole umí tvářit).