Diskuze: Nette nastavenie hodnot z tabulky
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 17 zpráv z 17.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Ukaz, jak vypada presenter a ta trida EditovatUzivatelaForm, protoze to resis dost podivne.
Zdar,
obvykle je postup v Nette asi tak následující:
use Nette\Security\User,
Nette\Application\UI\Form;
class SignFormFactory
{
private $user;
// závislosti automaticky injectuje DI container
/**
* @param User
*/
public function __construct(User $user)
{
$this->user = $user;
}
/**
* @return Form
*/
public function createSignIn()
{
$form = new Form();
$form->addText("name", "Jméno")
->setRequired("Nezadal jsi jméno");
$form->addPassword("password", "Heslo")
->setRequired("Nezadal jsi heslo");
$form->addSubmit("login", "Přihlásit se");
$form->onSuccess[] = $this->signInSucceeded;
return $form;
}
/**
* @param Form
* @param \stdClass
*/
public function signInSucceeded(Form $form, $values)
{
try {
// budeš mít nějaký autentikátor s metodou authenticate(array $credentials)
$this->user->login($values->name, $values->password);
} catch (Nette\InvalidArgumentException $e) {
$form->addError($e->getMessage());
}
}
}
services:
- SignFormFactory
Díky tomu Nette dokáže automaticky injectovat všechny závislosti (např. objekt třídy Nette\Security\User, který vyžaduješ v konstruktoru).
use Nette\Application\UI\Form;
class SignPresenter
{
/**
* @var SignFormFactory
* @inject
*/
public $signFormFactory; // aby mohla být automaticky injektována do presenteru, musí být viditelnost public
/**
* @return Form
*/
public function createComponentSignInForm()
{
$form = $this->signFormFactory->createSignIn();
$form->onSuccess[] = function(Form $form) {
$p = $form->getPresenter();
$p->flashMessage("Byl jsi úspěšně přihlášen");
$p->redirect("User:overview");
};
return $form;
}
}
{block content}
<h1>Přihlášení</h1>
{control signInForm}
{/block}
Dodatek:
Pokud chceš předávat formuláři defaultní data, je k tomu určena metoda
action() v presenteru.
public function actionSignIn()
{
// ke komponentě se dostaneš speciálním zápisem $this["nazev_komponenty"]
$this["signInForm"]->setDefaults(array(
"name" => "předvyplněné jméno"
));
}
Souhlasím s d4rkw34v3r, opravdu to řešíš dost podivně. Nicméně ta chyba je způsobena následující příčinou:
Vualá, tady je Tvoje druhé volání metody createee(), které nevíš odkud se vzalo. A samozřejmě když ho pak voláš podruhé, pravděpodobně se mu předává špatné $this->id, poté následné volání databáze s neplatným ID vrátí hodnotu false a jak už jsi asi pochopil, false není objekt, tudíž na něj nemůžeš logicky volat metodu toArray(). A jsme doma!
Co se týče správného řešení, na to bych musel vidět mnohem více kódu, ale obecný postup zde již dobře popsal Martin Konečný (pavelco1998).
Tak ja to mam cca tak ako napisal Martin... ale stale akosi nechapem kde je ta chyba, predsa id som predal konstuktoru a v tom objekte je ulozene to id stale neprepisuje sa nic a ked sa znovu zavola mal by tam byt stale to iste idcko. Ja to potrebuje iba na to aby som dal do formu defaulne hodnoty z databaze...
Tak to se dělá přesně tak, jak psal Martin Konečný (pavelco1998).
Pokud chceš předávat formuláři defaultní data, je k tomu určena metoda action() v presenteru.
public function actionSignIn()
{
// ke komponentě se dostaneš speciálním zápisem $this["nazev_komponenty"]
$this["signInForm"]->setDefaults(array(
"name" => "předvyplněné jméno"
));
}
No ale aj tak mi to nefunguje :/ V editovanie Presenter mam
protected function createComponentEditovanieForm()
{
$form = (new EditovatUzivatelaForm($this->database))->createee();
return $form;
}
public function actionEditovanieForm()
{
$zaznam = $this->database->table('pouzivatelia')->get($this->id);
$this["EditovatUzivatelaForm"]->setDefaults($zaznam->toArray());
$this["EditovatUzivatelaForm"]->id = $this->id;
}
teraz mi to nenaplni ani to id cez public atributu na skusku co som urobil...
No, jelikož ta metoda action*() by se měla vztahovat k akci presenteru, kde voláš ten formulář a ne k tomu formuláři samotnému...
Zrovna tuhle problematiku jsem už 2x řešil v tutoriálu pro Nette, který zde aktuálně píšu. Nechci se nijak propagovat, ale myslím, že jeho přečtení by Ti opravdu pomohlo. Konkrétně se to řeší v tomto díle http://www.itnetwork.cz/…administrace. Je zde přímo ukázka editačního formuláře pro články a jak ho naplnit výchozími hodnotami. K článku jsou navíc i kompletní zdrojové kódy ke stažení.
No nieco som urobil ale zase sa objavili ine problemy btw maju sa aj form factory pomenovavat menoFormFactory? ako je to pri presenteroch menoPresenter? Lebo moje factory sa volaju iba menoForm
Este otazka, ked mam renderDefault, a ako hovoris ze by sa to malo stahovat k akii presneteru v tomto pripade actionDefault? Alebo som uplne mimo? precital som 7 dielov tych nette clankov, ale stale som na tom mojom probleme zaseknuty
Ten form mi nenajde ked sa snazim naplnit data :/
Toto mam
protected function createComponentEditovanieForm()
{
$form = (new EditovatUzivatelaForm($this->database))->createee();
return $form;
}
public function actionDefault($id)
{
$zaznam = $this->database->table('pouzivatelia')->get($this->id);
$this["EditovanieForm"]->setDefaults($zaznam->toArray());
$this["EditovanieForm"]->id = $this->id;
}
takto to amm zaregistrovane v config
services:
authenticator: App\Model\Prihlasovanie
router: App\Router::vytvoritRouter
- App\Forms\EditovatUzivatelaForm
Co robim zle? Uz vobec neviem
Pojmenování těchto tříd je asi čistě na Tobě. Já tam třeba to FormFactory většinou píšu.
Ano, pochopil jsi to dobře, pokud se ten formulář vykresluje v default, tak by se to mělo vztahovat k actionDefault().
Můžu se zeptat, kde bereš to $this->id ? Protože pokud nemáš nadefinovanou třídní proměnou $id a nenaplníš jí před vykonáním actionDefault(), v tomhle případě jedině v metodě startup(), tak to $this->id je v době, kdy ho tam voláš null. Tam by totiž mělo být jenom to $id, které dostáváš jako parametr té funkce actionDefault($id).
To this ide je moja chyba hej, lebo v renderi som najprv naplnal to id tej tiredy a potom vyuzival, potom to hlasilo chybu zze aj action potrebuje mat tolko isto parametrov ako render... ale ono mi to robi to ze ten form nenajde, ze neexistuje taky form ked sa tam snazim predat data
To bude asi tím, že název toho formuláře má začínat malým písmenem tj. editovanieForm, stejně jako když to píšeš to Latte makra control.
Zobrazeno 17 zpráv z 17.