Vykreslení formuláře v samostatném latte v modulech
- lukas.sirhal
- Backer | 20
Ahoj,
mám takovouto strukturu webu zkráceně:
- app
--DealerModule
--PublicModule
---presenters
----HomepagePresenter.php
---templates
----Homepage
-----options.latte
--SuperadminModule
--forms
---RegUserForm.php
--templates
---@layout.latte
---components
----regUser.latte
a mám componentu regUserForm v adresáři forms kterou si pomocí makra
{form}
sestavuji v regUser.latte kterou mám v components.
Pokud volám z layoutu
{include 'components/regUser.latte'}
všechno funguje jak má.
Když se ale pokouším zavolat
{include 'components/regUser.latte'}
z ModuluPublic-Homepage-options.latte
tak mi laděnka vyhodí chybu:
Missing template file
‚D:\Projects\lokalno\app\PublicModule\templates\Homepage/components/regUser.latte‘
můžete mi prosím pomoci jak regUser.latte volat napříč projektem a né
jenom ze stejného adresáře
zkoušel jsem již i různé kombinace jako
{includeblock 'regUser.latte'}
{include 'regUser.latte'}
{include '../../components/regUser.latte'}
.. děkuji
- Tomáš Votruba
- Moderator | 1114
Pokud si logiku přesuneš do komponenty, můžeš volat
{control regUser}
kdekoliv a bez potíží.
- lukas.sirhal
- Backer | 20
Super, funguje to přesně jak má, ale ještě mám k tomu otázku.
Lze se nějak dozvědět jestli jsem formulář naplnil daty?
Jde mi o to že když zakládám třeba uživatele je ve formuláři tlačítko „založit“ a když ho chci ve stejném editovat chtěl bych název tlačítka jiné
takto jsem vytvořil tu komponentu nevím zda je to úplně podle besPractise
class RegUserForm extends Control{
/** var \Kdyby\Translation\Translator */
public $translator;
/** var \App\Model\Users */
public $user;
public function __construct(\Kdyby\Translation\Translator $translator, \App\Repository\UsersRepository $user) {
$this->translator = $translator;
$this->user = $user;
$form = new Form($this, 'regUserForm');
$mailValidator = function($field){
return !$this->user->modelUsers->findOneBy(array('email'=>$field->value)) ? true: false;
};
$form->setTranslator();
$form->addText('user_name');
$form->addText('email')
->addRule($mailValidator, "existuje")
->addRule(Form::EMAIL,$translator->translate('form.register.email_fail'));
$form->addPassword('password');
$form->addPassword('password_check');
$form->addSubmit('userReg', $translator->translate('form.register.usersubmit'));
$form->onSuccess[] = callback($this, 'userRegSubmit');
}
public function fillData($data){
$this['regUserForm']->setDefaults($data);
}
public function userRegSubmit(Form $form)
{
$values = $form->getValues();
$hash = \Authenticator::calculateHash($values['password']);
$values->offsetUnset('password');
$values->offsetUnset('password_check');
$values->offsetSet('password', $hash);
$this->user->modelUsers->insertUser($values);
$this->presenter->redirect(":Public:Homepage:default");
}
public function render(){
$template = $this->template;
$template->setFile(__DIR__ . '/regUser.latte');
$template->form = $this['regUserForm'];
$template->setTranslator($this->translator);
$template->render();
}
}
- Tomáš Votruba
- Moderator | 1114
Víceměně to máš správně. fillData
pak voláš
v presenteru v nějaké actionEdit()
metodě.
Jen vytváření formuláře umístit do samostatné metody:
protected function createComponentForm() {
$form = new Form;
// ...
return $form;
}
V šabloně komponenty pak nevolej $form
, jak to asi děláš
teď, ale:
{control form}