Editování již přidaného příspěvku
- Martin Hanzl
- Člen | 6
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)
- Martin Hanzl
- Člen | 6
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)
- GEpic
- Člen | 566
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
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 | 2667
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).