Odkaz v @layoutu na vlastní šablonu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Malakimek
Člen | 9
+
0
-

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

Nepotěším tě. Máš tam spoustu základních chyb:

  1. Třída CreateOrEditUserFormFactory by dost možná ani neměla být třída…
  2. …a i kdyby ano tak by rozhodně v žádném případě neměla dědit od Form. Je to továrna, ne formulář.
  3. 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).
  4. Namísto connection bys měl injectovat spíše nějaký model do presenteru
  5. Třída insertModel mi nepřipadá jako dobrý nápad, zkus se inpirovat např. zde.
  6. 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)

Malakimek
Člen | 9
+
0
-

Díky, tak jsem to přesunul do presenteru (něco jsem odstranil) a tam mi to jede, ale stejně musím vykutit tu továrničku, protože to mám za úkol :-) Využiji k tom Tvé rady.