Odkaz v @layoutu na vlastní šablonu
- Malakimek
- Člen | 9
Ahoj,
zkoušel jsem všechno možné, ale nemůžu přijít na to, co dělám
špatně. Nic co jsem našel na fóru mi nefunguje :-(
Mám úvodní stránku, na které je menu. Menu jsem vytvořil v
@layout.latte. Vytvořil jsem si modul na formulář a po kliknutí na
menu by se měl formulář vypsat. Ale to je pro mě problém.
app/Regform/RegformModel.php
<?php
namespace Regform;
use Nette\Application\UI\Form;
class CreateOrEditUserFormFactory extends Form
{
/** @var Nette\Database\Connection */
protected $connection;
public function __construct(\DibiConnection $db)
{
$this->connection = $db;
}
protected function createRegform()
{
$myform = new Form();
$myform->addText('username', 'Váš login')
->addRule(Form::FILLED, 'Vyplňte Váš login');
$myform->addPassword('password', 'Heslo:')
->addRule(Form::FILLED, 'Zadejte heslo')
->addCondition(Form::MAX_LENGTH, 5)
->addRule(Form::MIN_LENGTH, 'Heslo musí mít alespoň %d znaky', 5);
$myform->addPassword('passwordVerify', 'Heslo pro kontrolu:')
->setRequired('Zadejte prosím heslo ještě jednou pro kontrolu')
->addRule(Form::EQUAL, 'Hesla se neshodují', $myform['password']);
$myform->addText('name', 'Vaše jméno a přijmení')
->addRule(Form::FILLED, 'Vaše jméno a přijmení');
$myform->addSubmit('ok', 'Odeslat');
$myform->onSuccess[] = $this->taskFormSubmitted;
return $myform;
}
public function taskFormSubmitted(Form $myform)
{
//zpracování formuláře
$this->insertModel->createTask($myform->values->username, $myform->values->password, $myform->values->name);
$this->flashMessage('Osoba byla přidána.', 'success');
$this->redirect('this');
}
}
app/Regform/insertModel.php
<?php
namespace Regform;
//??use Nette;
class insertModel extends RegformModel
{
//uložení dat do tabulky user (dibi)
public function createTask($username, $password, $name)
{
$promenne = array(
'username' => $username,
'password' => $password,
'name' => $name
);
return $this->connection->query('INSERT INTO `user`', $promenne);
}
}
app/Regform/RegformPresenter.php
zkoušel jsem ho přesunout i do app/presenters/RegformPresenter.php
<?php
class RegformPresenter extends Nette\Application\UI\Presenter
{
private $formFactory;
public function __construct(CreateOrEditUserFormFactory $formFactory)
{
$this->formFactory = $formFactory;
}
protected function createComponentCreateOrEditUserForm()
{
return $this->formFactory->createForm($this);
}
/*public function renderForm($)
{
$this->template->setFile(__DIR__ . 'Regform/form.latte');
$this->template->render();
//$this->template->tasks = $this->taskRepository->findIncomplete();
//$this->template->myform = $this->regformModel->createRegform($myform);
} */
}
v neon.configu jsem zaregistroval
createOrEditUserFormFactory:
class: Regform\CreateOrEditUserFormFactory(@connection)
v @layout.latte mám
<a href="{link regform}
regform.latte mám ve složce Regform, zkoušel jsem ho dát i do Home…mám v něm {control myform}
Pořád to načítá latte ze složky Homepage a píše hlášku, že nezná
myform.
Zkoušel jsem různé způsoby přidání šablony, ale marně.
Když dám v @layoutu tento odkaz <a n:href=„Form:regform“>, tak na ten odkaz nejde vůbec kliknout.
Jestli vám z toho kódu stojí vlasy na hlavě, tak se omlouvám :D ,ale pracuji s nette teprve týden.
Díky
Malakim
Editoval Malakimek (9. 11. 2012 17:38)
- enumag
- Člen | 2118
Nepotěším tě. Máš tam spoustu základních chyb:
- Třída CreateOrEditUserFormFactory by dost možná ani neměla být třída…
- …a i kdyby ano tak by rozhodně v žádném případě neměla dědit od Form. Je to továrna, ne formulář.
- Namísto vlastní třídy s továrnou bych vytvořil metodu createComponentRegistrationForm v BasePresenteru (nebo níže pokud ten formulář potřebuje jen jeden konkrétní presenter).
- Namísto connection bys měl injectovat spíše nějaký model do presenteru
- Třída insertModel mi nepřipadá jako dobrý nápad, zkus se inpirovat např. zde.
- Odkaz {link regform} v žádném případě nemůže fungovat, protože na to musíš mít vytvořenou action a/nebo render metodu.
Přeji hodně zdaru s Nette! ;-)
Editoval enumag (10. 11. 2012 10:57)