Predani dat do formulare z jineho presenteru

tomas_straka
Člen | 32
+
0
-

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 | 2661
+
0
-
// 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
+
0
-

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 | 2661
+
0
-

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
+
0
-

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 | 2661
+
+1
-

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.

galab
Backer | 74
+
+2
-

Stačí za query přidat fetch()

$t = $this->database->query(
            'SELECT * FROM firmy
            WHERE id = ? AND jeSmazano = 0',
            $postId)->fetch();
Šaman
Člen | 2661
+
0
-

Ahá, toho jsem si nevšiml. To vysvětluje proč tam má ResultSet.

tomas_straka
Člen | 32
+
0
-

Diky vsem, predelal jsem to do toho exploreru a frci to skvele. Zase se ozvu :-D