Nelze vytvořit instanci pro formulář

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

Zrdavím všechny,
začal jsem používat Nette 2.2 a snažím se o vytvoření aplikace pomocí MVC modelu. Problém všam nastal v admin modulu, kde potřebuji vytvořit editační formulář a ejhle .. Dostávám chybu
Class ‚AdminModule\UI\Form‘ not found

při volání

$form = new UI\Form;

Podotknu že hlavičku soubrou mám

use Nette\Application\UI\Form,
    Nette\Utils\Strings;
namespace AdminModule;

takže bych odhadoval že namespace to nedělá jen někde dělám banální chybu a nevidím jí.

Tvorba komponenty v public function createComponent($name) – switchem řešené

case 'new':
   $form = new UI\Form;
   $form->addText('key', 'Klíč:')->addRule(Form::FILLED, 'Zadejte titulek');
   $form->addText('value', 'Hodnota:');
   $form->addHidden('id', 'id');
   $form->onSuccess[] = callback($this, $name.'Form');
   if($name=='edit') {
       $form->setDefaults(Globals::GetGlobalByID($this->getParam('id')));
       $form->addSubmit('submit', 'Upravit');
   } else $form->addSubmit('submit', 'Přidat');
return $form;
David Grudl
Nette Core | 8235
+
+2
-

$form = new Form;

Doporučuji nastudovat http://php.net/…mespaces.php

Xchos
Člen | 40
+
0
-

Díky .. Jinak se chci zeptat jestli ta logika mezi $name edit a $name new může být takhle v presenteru viz

if($name=='edit') {
       $form->setDefaults(Globals::GetGlobalByID($this->getParam('id')));
       $form->addSubmit('submit', 'Upravit');
   } else $form->addSubmit('submit', 'Přidat');

nebo existuje nějaké elegantnější řešení, které jsem přehlédl?

mám na ve switchi totiž

case 'edit':
case 'new':

Editoval Xchos (13. 9. 2014 11:02)

CZechBoY
Člen | 3608
+
0
-

Takhle jak to máš teď je to dobrý…
K čemu tam máš ten switch?

Xchos
Člen | 40
+
0
-

tvořím komponenty v něm, teda pokud to není chyba .. („edit“ a „new“ nahrazeno za „editForm“ a „newForm“)

public function createComponent($name) {
    parent::createComponent($name);
    switch ($name) {
       case 'grid':
          $grid = new \DataGrid($this, $name);
          $grid->bindDataTable($this->model->getDataSource());
          $grid->itemsPerPage = 10;
          $grid->keyName = 'id';
          $grid->multiOrder = FALSE;
          $grid->rememberState = TRUE;
          $grid->addColumn('key', 'Titulek')->addFilter();
          $grid->addColumn('value', 'Zobrazeno')->addFilter();
          $grid->addActionColumn('Operace');
          if($this->authorizator->isAllowed($this->permissionName, "EDIT")) $grid->addAction('upravit', 'Globals:edit');
          if($this->authorizator->isAllowed($this->permissionName, "DELETE")) $grid->addAction('smazat', 'Globals:');
          return $grid;
       case 'editForm':
       case 'newForm':
          $form = new Form;
          $form->addText('key', 'Klíč:')->addRule(Form::FILLED, 'Zadejte titulek');
          $form->addText('value', 'Hodnota:');
          $form->addHidden('id', 'id');
          $form->onSuccess[] = callback($this, $name);
          if($name=='edit') {
              $form->setDefaults($this->model->getGlobalById($this->getParam('id')));
              $form->addSubmit('submit', 'Upravit');
          } else $form->addSubmit('submit', 'Přidat');
       return $form;
    }
}
David Matějka
Moderator | 6445
+
+1
-

takhle se to delalo nekdy v nette 0.8.
Vytvor si pro kazdou komponentu createComponentFoo metodu, takze treba

public function createComponentGrid()
{
	$grid = new \DataGrid(); //ani nemusis predavat $this a $name, komponenta se pripoji po vraceni z teto metody

	return $grid;
}
Xchos
Člen | 40
+
0
-

Dobře, díky za radu :) .. přepíšu to dokud jsem v začátkách!

Xchos
Člen | 40
+
0
-

je to takhle lepší?

public function createComponentGrid() {
          $grid = new \DataGrid($this, 'grid');
          $grid->bindDataTable($this->model->getDataSource());
          $grid->itemsPerPage = 100;
          $grid->keyName = 'id';
          $grid->multiOrder = FALSE;
          $grid->rememberState = TRUE;
          $grid->addColumn('key', 'Titulek')->addFilter();
          $grid->addColumn('value', 'Zobrazeno')->addFilter();
          $grid->addActionColumn('Operace');
          if($this->authorizator->isAllowed($this->permissionName, "EDIT")) $grid->addAction('upravit', 'Globals:edit');
          if($this->authorizator->isAllowed($this->permissionName, "DELETE")) $grid->addAction('smazat', 'Globals:');
          return $grid;
      }

      private function createForm(){
             $form = new Form;
             $form->addText('key', 'Klíč:')->addRule(Form::FILLED, 'Zadejte titulek');
             $form->addText('value', 'Hodnota:');
             $form->addHidden('id', 'id');
             return $form;
      }
      public function createComponentNewForm(){
          $form = $this->createForm();
          $form->onSuccess[] = callback($this, "newForm");
          $form->addSubmit('submit', 'Přidat');
          return $form;
      }
      public function createComponentEditForm(){
          $form = $this->createForm();
          $form->onSuccess[] = callback($this, "editForm");
          $form->setDefaults($this->model->getGlobalById($this->getParam('id')));
          $form->addSubmit('submit', 'Upravit');
          return $form;
      }

jinak mam svůj vlastní authorizátor, jelikož ten na nette mi moc nevyhovoval a neporozumněl jsem mu úplně. Každopádně ten co mám udělanej mi přijde jako dostačující.

Editoval Xchos (15. 9. 2014 20:28)