Ukázka řešení s používáním komponent a pár otázek

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

Zdravím,

zkouším komponenty s formuláři, přikládám svoje řešení a budu rád za připomínky. Mám i pár otázek.

Je lepší data ukládat do databáze přímo v komponentě a nebo raději v modelu, který bude user určitě mít? Z hlediska znovu použitelnosti komponenty bych data ukládal raději v komponentě, ale z hlediska logiky aplikace bych to přesunul raději do modelu. Co myslíte?

Pak bych všechny formuláře měl nejraději v komponentách, presentery obsahují méně kódu. Na druhou stranu naroste počet komponent. Nevím, co je lepší.

IRegistrationForm

namespace FrontModule;


interface IRegistrationForm
{

    /**
     * @return \FrontModule\RegistrationForm
     */
    public function create();

}

RegistrationForm

namespace FrontModule;

use Nette\Application\UI\Control;
use Nette\Application\UI\Form;

class RegistrationForm extends Control
{
    protected $database;

    public function __construct(\Nette\Database\Context $database)
    {
        parent::__construct();
        $this->database = $database;
    }

    public function render()
    {
        $this->template->setFile(__DIR__ . '/registrationForm.latte');
        $this->template->render();
    }

    protected function createComponentRegistrationForm()
    {
        $form = new Form;

        $form->addText('username', 'Jméno:')
             ->setRequired('Prosíme, zadejte přihlašovací jméno.');
        $form->addPassword('password', 'Heslo:')
             ->setRequired('Prosíme, zadejte heslo.');
        $form->addSubmit('register', 'Zaregistrovat se');

        $form->onSuccess[] = array($this, 'registrationFormSucceeded');

        return $form;
    }


    public function registrationFormSucceeded(Form $form, $values)
    {
        $this->database->table("users")->insert($values);

        $this->flashMessage('Byl jste úspěšně registrován.');
        $this->presenter->redirect('Homepage:default');
    }

}

registrationForm.latte

{form registrationForm}

    <table>
        <tr class="required">
            <th>{label username /}</th>
            <td>{input username}</td>
        </tr>
        <tr class="required">
            <th>{label password /}</th>
            <td>{input password}</td>
        </tr>
        <tr class="required">
            <th>{input register}</th>
        </tr>
    </table>

{/form}

HomepagePresenter

namespace FrontModule;

use Nette;
use App\Model;
use Nette\Application\UI;

class HomepagePresenter extends BasePresenter
{
    /** @inject @var IRegistrationForm */
    public $registrationForm;

    /** @return RegistrationForm */
    protected function createComponentRegistrationForm()
    {
        $control = $this->registrationForm->create();
        return $control;
    }
}

šablona k HomepagePresenter obsahuje {control registrationForm} a v configu mám rozhraní Module\FrontIRegistrationForm zaregistrované jako službu.

Díky za připomínky.

CZechBoY
Člen | 3608
+
0
-

V pripade registracniho formu by si asi sam mel vyzadat model k zalozeni novyho uzivatele.
Do komponenty urcite nepatri prima prace s databazi.

Jiří Nápravník
Člen | 710
+
0
-

Databaze patri urcite do modelu.

Mam taky vsechny formulare jako komponenty. Roste pocet souboru, ale nicemu to nevadi:)