Ukázka řešení s používáním komponent a pár otázek
- radekBrno
- Člen | 61
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.
- Jiří Nápravník
- Člen | 710
Databaze patri urcite do modelu.
Mam taky vsechny formulare jako komponenty. Roste pocet souboru, ale nicemu to nevadi:)