Predani dat do formulare z jineho presenteru
- tomas_straka
- Člen | 32
Ahoj, prosim o radu. Mam metodu actionEdit a jeji ucel je editovat jednu firmu. V metode ziskam jednu firmu a potrebuji ji poslat do sablony, ktera slouzi k vytvoreni firmy. Chtel bych aby se mi ten formular vyplnil udaji z DB. Jak na to? Díky
<?php
namespace App\Presenters;
use Nette;
use Nette\Application\UI\Form;
use App\Model\FirmyRepository;
class VytvorFirmuPresenter extends Nette\Application\UI\Presenter
{
/** @var FirmyRepository */
private $firmyRepository;
public function __construct(FirmyRepository $firmyRepository)
{
$this->firmyRepository = $firmyRepository;
}
protected function createComponentFirmyForm(): Form
{
$form = new Form;
$form->addText('nazev', 'Nazev:')
->setRequired();
$form->addTextArea('majitel', 'Majitel:')
->setRequired();
$form->addTextArea('poznamka', 'Poznamka:')
->setRequired();
$form->addSubmit('send', 'Uložit');
$form->onSuccess[] = [$this, 'firmyFormSucceeded'];
return $form;
}
public function firmyFormSucceeded(Form $form, array $values): void
{
$this->firmyRepository->addFirma($values);
$this->flashMessage("Firma byla úspěšně pridana.", 'success');
$this->redirect('Firmy:firmy');
}
}
<?php
namespace App\Presenters;
use App\Model\FirmyRepository;
use Nette;
class FirmyPresenter extends Nette\Application\UI\Presenter
{
/** @var FirmyRepository */
private $firmyRepository;
private Nette\Database\Explorer $database;
public function __construct(FirmyRepository $firmyRepository)
{
$this->firmyRepository = $firmyRepository;
}
public function renderFirmy(int $page = 1, string $sort = 'ASC')
{
$firmyCount = $this->firmyRepository->getPublishedArticlesCount();
$paginator = new Nette\Utils\Paginator();
$paginator->setItemCount($firmyCount);
$paginator->setItemsPerPage(10);
$paginator->setPage($page);
$firmy = $this->firmyRepository->getAllCompany($paginator->getLength(), $paginator->getOffset(), $sort);
$this->template->firmy = $firmy;
$this->template->paginator = $paginator;
//$this->template->sort = $sort;
}
public function actionEdit(int $postId): void
{
$firma = $this->firmyRepository->getOneFirma($postId);
$this['firmyForm']->setDefaults($firma->toArray()); // to je blbe
}
public function actionDelete(int $postId): void
{
$this->firmyRepository->deleteOneFirma($postId);
$this->redirect('Firmy:firmy');
}
}
- Šaman
- Člen | 2662
// to není blbe
Jen to musíš mít ve stejném presenteru. Tvůj FirmyPresenter
o žádném formuláři firmyForm
nic netuší a je to jiná
stránka. Předpokládám, že se ti nezobrazí ani ten formulář, tak jak by
se mohl naplnit daty?
Asi bych ti doporučil nejdřív si trochu pohrát v Sandboxu. Připadá mi, že plaveš v základech a zkoušíš trochu metodou pokus omyl splnit konkrétní zadání.
Editoval Šaman (15. 1. 2021 18:29)
- tomas_straka
- Člen | 32
No zkousim a ano, mam na to ukol.
Upravil jsem to. Predtim jsem mel dva presentery........prislo mi to lepsi, ale
bylo to komplikovany. Metoda actionEdit mi vraci chybu: Call to undefined method
Nette\Database\ResultSet::toArray().
public function getOneFirma(int $postId): Nette\Database\ResultSet
{
$t = $this->database->query(
'SELECT * FROM firmy
WHERE id = ? AND jeSmazano = 0',
$postId);
return $t;
}
public function actionEdit(int $postId): void
{
$firma = $this->firmyRepository->getOneFirma($postId);
//dumpe($firma);
$this['createFirma']->setDefaults($firma->toArray());
}
Co to znamena?
- Šaman
- Člen | 2662
Ukaž prosím metodu getOneFirma()
. Mě databáze vrací objekt
ActiveRow
, který má metodu toArray()
. Vypadá to,
že buď nepoužíváš Database Explorer, nebo to
vrací pole výsledků (i když je tam jen jeden) a nikoliv konkrétní
záznam.
A to deleteOneFirma dělá něco víc, než jen to mazání? Protože občas je dobré to vyčlenit do samostatné metody, to ano, ale obecně bych začal co nejvíce primitivním zápisem (skryje se tam méně chyb).
P.S. Ještě mě teď zaujala jedna věta v dokumentaci: „Má-li tabulka
definovaný primární klíč, vrací nový řádek jako objekt
ActiveRow.“
To by taky mohlo být ono.
- tomas_straka
- Člen | 32
getOneFirma() ja v prispevku nad tebou. tady je delete:
public function deleteOneFirma(int $postId): void
{
$this->database->query('UPDATE firmy SET', [
'jeSmazano' => 1,
], 'WHERE id = ?', $postId);
}
Je to dost? Klidne ti to hodim jako cely projekt.
- Šaman
- Člen | 2662
Njn, ty používáš tohle: Database Core
Většina ukázek ze kterých jsi možná vzal i to toArray()
používá maličko magičtější, ale chytřejší tohle: Database Explorer
Zkus předat formuláři jen tu $firma
, jestli se s tím
popasuje. A když ne, tak nejrychlejší řešení je prostě vytvořit si to
pole sám.
$this['firmyForm']->setDefaults([
'nazev' => $firma->nazev,
'majitel' => $firma->majitel,
// …
]);
Stejným způsobem se nastavuje formulář když máš složitější objekty a není jedna ku jedné s objektem v databázi.
- tomas_straka
- Člen | 32
Diky vsem, predelal jsem to do toho exploreru a frci to skvele. Zase se ozvu :-D