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}