Formuláře jako továrníčka

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

Zdravím,

snažím se o vytvoření formuláře přes komponentu a továrničku na Vložení nových záznamů a editaci stávajících.

Problém: Potřebuji zprovoznit editaci a založení nové globální proměnné za pomocí formuláře.
Chyby na které jsem narazil:

  • Při editaci formuláře se nezavolá žádný z OnSuccess[]
  • do laděnky se mi nezašlou informace z editForm, zatímco newForm je zašle.

Komponenta GlobalsNewEditForm:

<?php
use Nette\Application\UI;

class GlobalsNewEditForm extends Nette\Object
{
    private $db;

    public function __construct(DibiConnection $db)
    {
        $this->db = $db;
    }

    public function create()
    {
        $form = new UI\Form;
        $form->addText('key', 'Klíč:')->addRule(UI\Form::FILLED, 'Zadejte titulek');
        $form->addText('value', 'Hodnota:');
        $form->addHidden('id', 'id');
        $form->onSuccess[] = $this->processForm;
        $form->addSubmit('submit', 'Odeslat');
        return $form;
    }

    public function processForm($form)
    {
        /*
         *
         */
    }
}
?>

Presenter GlobalsPresenter:

<?php
namespace AdminModule;
use Nette\Application\UI\Form,
    Nette\Utils\Strings,
    Tracy\Debugger;


class GlobalsPresenter extends SecurePresenter
{
    /** @var \GlobalsNewEditForm @inject */
    public $GlobalsNewEditForm;

    /*
	 *
     *
     */

    public function newForm($form){
      $this->checkPermission("CREATE");
      $data = $form->getValues();
      \Nette\Diagnostics\Debugger::barDump($form->getValues());
      try
      {
        $insertID = $this->model->insert($data);
        if($insertID>0) $this->logger->logUserEvent($this->user->id, $this->resourcesId, "Přidán nový záznam - ".$this->getName().":".$this->getAction(), 1, $insertID);
        else {
        $this->flashMessage("Program zabránil vytvoření klíče - Duplikace", "danger");
        $this->logger->logUserEvent($this->user->id, $this->resourcesId, "Pokus o duplikaci klíče ".$data->key, 3);
        return true;
        }
      }
      catch(Exception $e)
      {
        $this->logger->logUserEvent($this->user->id, $this->resourcesId, "Chyba přidání - ".$this->getName().":".$this->getAction()." - ".$e->getMessage(), 3);
      }
      $this->redirect($this->permissionName.":");
      return true;
    }

    public function editForm($form){
      \Nette\Diagnostics\Debugger::barDump($form->getValues());
    }

    public function createComponentNewForm(){
        $form = $this->GlobalsNewEditForm->create();
		    $form->onSuccess[] = $form->onSuccess[] = callback($this, "newForm");
        return $form;
    }

    public function createComponentEditForm(){
        $form = $this->GlobalsNewEditForm->create();
        $form->setDefaults($this->model->getGlobalById($this->getParam('id')));
        $form->onSuccess[] = $form->onSuccess[] = callback($this, "editForm");
        return $form;
    }
}

Inspirace na ** https://doc.nette.org/…s/form-reuse **

Editoval Xchos (8. 3. 2015 17:11)

Xchos
Člen | 40
+
0
-

Ještě pro jistotu dodám

{form editForm class=>"form-horizontal"}
  <div class="form-group">{label key class=>"control-label col-lg-3" /}<div class="col-lg-9">{input key disabled=>'disabled'}</div></div>
  <div class="form-group">{label value class=>"control-label col-lg-3" /}<div class="col-lg-9">{input value}</div></div>
  <div class="form-group">{input submit class=>'btn btn-yellow btn-lg'}</div>
{/form}
Šaman
Člen | 2666
+
0
-

A tohle má dělat co? Jinak když píšeš dotaz, je dobré postovat jen relevantní kód, v tomto případě továrny a metody zpracováni formuláře.

$form->onSuccess[] = $form->onSuccess[] = callback($this, "editForm");
Xchos
Člen | 40
+
0
-

to je bordel ze zoufalosti. Upraveno, ale stejně to nemá vliv na výsledek. Stále se EditForm nezavolá.

Editoval Xchos (8. 3. 2015 17:10)

Xchos
Člen | 40
+
0
-

Tak jsem přišel na to že když místo

{form editForm class=>"form-horizontal"}
  <div class="form-group">{label key class=>"control-label col-lg-3" /}<div class="col-lg-9">{input key disabled=>'disabled'}</div></div>
  <div class="form-group">{label value class=>"control-label col-lg-3" /}<div class="col-lg-9">{input value}</div></div>
  <div class="form-group">{input submit class=>'btn btn-yellow btn-lg'}</div>
{/form}

zavolám jen

{control editForm}
--\

tak to funguje a callback editForm se zavolá. Problém ale je, že potřebuji využít toho původního kvůli stylování.

Editoval Xchos (8. 3. 2015 17:23)

David Matějka
Moderator | 6445
+
+1
-

muze za to disabled u key. Hodnota se pak neodesle a neprojde to validaci

Xchos
Člen | 40
+
0
-

Aha, no a je nějaká možnost jak ji mohu zakázat měnit? Jsou to globální proměnné využívané pak v Latte tak se hodnota klíče nemůže měnit. Napadá mě {input key readonly=>1}, jestli je to moudré? Jinak díky za radu, už funguju jak jsem potřeboval :)

Editoval Xchos (8. 3. 2015 18:02)

Šaman
Člen | 2666
+
0
-

Udělej jí hidden, pokud ji chceš jen na předávání dat. Pokud ji chceš i vypsat, tak buď ji jen vypiš a pokud chceš i aby to vypadalo jako políčko formuláře, tak si vytvoř nějaký fake input, který bude disabled. ale se kterým nebudeš dál pracovat.