Pochopení konstrukce widgetu (controlu)

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

Dobrý den,
potřeboval bych poradit, v kterém kroku udělám chybu, celkově můj problém je to, že konečný widget nevracím pomocí return, ale přes echo, což je za a) určitě špatně, za b) to způsobuje různé porblémy s přesmerováním například formulářů.

Budu rád za každou radu, která mě navede lepším směrem – ono to takto funguje, ale není to asi úplně košér.

basepresenter

   public function createComponent($name)
    {
if($name == "login") { return new WidgetLogin; }
if($name == "email") { return new WidgetEmail;  }
    }

a teď například loginForm – je to klasický samotný php soubor, ve kterém je jenom

class WidgetLogin extends Control
{

	public function createComponentLoginForm() {
		$form = new AppForm;
    $form->addText('username', 'Uživatelské jméno:')
      ->addRule(Form::FILLED, 'Zapomněli jste vyplnit uživatelské jméno.');

    $form->addPassword('password', 'Heslo:')
      ->addRule(Form::FILLED, 'Zapomněli jste vyplnit heslo.');

    $form->addSubmit('login', 'Přihlásit');


    $form->onSubmit[] = callback($this, 'login');
  return $form;
}


 public function render()
 {
 	 $user = Environment::getUser();
 	  if ($user->isInRole('admin')) { print "je to ADMIN"; }
 	  echo $this['loginForm'];
 }

pokud tady v render metodě nemám echo, ale třeba return, nic se do šabony nedostane. V šabloně samozřejmě widget login nebo control login.

Děkuji Vám

Ani
Člen | 226
+
0
-

Komponenty mají (mohou mít) svojí vlastní šablonu. Takže v té render metodě doplnit.

<?php
        $this->template->setFile(dirname(__FILE__) . '/template.phtml');
        $this->template->render();
?>

No a v té šabloně zavoláš ten formulář normálně jako komponentu.

onny
Člen | 67
+
0
-

Díky za odpověď, takže to echo v render není vyloženě špatně?

Tharos
Člen | 1030
+
0
-

Není to vyloženě špatně. Od metody render se to, že něco pošle přímo na výstup, očekává – ať už se jedná o echo, anebo o volání $this->template->render().

Filip Procházka
Moderator | 4668
+
0
-

https://gist.github.com/627987 … třeba to zaujme :)

Tharos
Člen | 1030
+
0
-

Zaujalo, hezky to máš napsaný :). Členskou proměnnou view taky provozuji, ale máš hezky udělané to volání přes __call().

Pane jo, to bude jednou CMSko ;).