Vykreslení formuláře v samostatném latte v modulech

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
lukas.sirhal
Backer | 20
+
0
-

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

Pokud si logiku přesuneš do komponenty, můžeš volat

{control regUser}

kdekoliv a bez potíží.

lukas.sirhal
Backer | 20
+
0
-

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

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}