Přesměrování z komponenty
- Scorpio
- Člen | 45
Zdravím, řeším přesměrování z komponenty. Výsledky na foru jsem našel jen hodně staré a podle nich se mi nic nezdařilo.
Presenter:
$component = new StockControl($this, 'storehouse_form');
Komponenta:
<?php
namespace App\Presenters;
use Nette;
use Nette\Application\UI\Control;
class StockControl extends Control
{
...
public function render()
{
switch ($this->name) {
case 'storehouse_list':
...
break;
case 'storehouse_form':
$template = $this->template;
$template->form = $this->storehouseForm();;
$template->setFile(__DIR__ . "/StorehouseForm.latte");
$template->render();
break;
}
}
...
private function storehouseForm($values = array())
{
$form = new Nette\Forms\Form();
...
$form->onSubmit[] = $this->storehouseFormSubmitted($form);
return $form;
}
private function storehouseFormSubmitted($form){
$values = $form->getValues();
...
$this->getPresenter()->redirect("Stock:");
}
Toto mi vrací chybu:
Nette\Application\AbortException
Nemohl by mi někdo prosím poradit co dělám špatně? Případně nějaký jednoduší způsob jak tyto věci řešit. Chci používat komponenty hlavně k tomu abych mohl stejný obsah vypsat ve více místech a na více šablonách.
- David Matějka
- Moderator | 6445
- takhle se formulare nepouzivaji, precti si https://doc.nette.org/cs/forms … formulare v presenterech a komponentach se reseji pomoci UI\Form. A onSubmit event asi nechces, ale onSuccess
- proc mas nejaky switch, ktery se rozhoduje dle nazvu komponenty? vytvor si samostatne komponenty pro seznam a pro formular
- jak pouzivat formulare v komponente je nejlepe ukazano zde: https://doc.nette.org/…s/form-reuse#…
- Scorpio
- Člen | 45
Děkuji za odpověď, přepisuji to tedy jen zda mohu mít dotaz k nápovědě.
use Nette\Application\UI;
class MyPresenter extends BasePresenter
{
/** @var \ICategoryFormFactory @inject */
public $categoryFormFactory;
protected function createComponentCategoryForm()
{
$control = $this->categoryFormFactory->create();
$control->onCategorySave[] = function(CategoryControl $control, $category) {
$this->redirect('this');
// nebo například přesměrujeme na detail dané kategorie
// $this->redirect('detail', array('id' => $category->id));
};
return $control;
}
}
Je zde volání funkce CategoryControl což nevím kam se volá či co konkrétně to má dělat.
- David Matějka
- Moderator | 6445
Je zde volání funkce CategoryControl což nevím kam se volá či co konkrétně to má dělat.
kde se vola jaka funkce CategoryControl?
- Scorpio
- Člen | 45
$control->onCategorySave[] = function(CategoryControl $control, $category) {
Ona se nevolá jen je to instance a takhle se v tom navodu zadny control
nejmenuje.
A nahodou jaké se mají používat namespace zda vůbec nejaky.
EDIT:
Upravil jsem to takto:
/** @var \IStorehouseFromFactory @inject */
public $storehouseFactory;
protected function createComponentStorehouseFrom()
{
$control = $this->storehouseFactory->create();
$control->onStorehouseSave[] = function(\StorehouseFrom $control, $storehouse) {
$this->redirect('this');
// nebo například přesměrujeme na detail dané kategorie
// $this->redirect('detail', array('id' => $category->id));
};
return $control;
}
A tovarničku mám takřka přesně opsanou z návodu (ještě není
udělané zpracování formuláře) a hází mi to:
Call to undefined method StorehouseFrom::render()
Editoval Scorpio (11. 4. 2016 16:05)
- CZechBoY
- Člen | 3608
David ti poslal návod jen jak udělat formulář jako
komponentu(+továrnu).
Pokud chceš zachovat ten tvůj StockControl, kterej bude obstarávat jak výpis
položek tak bude umět vytvořit formulář, kterej založí novej stock (nebo
co já vim) – tak je lepší udělat 2 komponenty (seznam, formulář) a ty
komponenty potom vytvoř v presenteru.
class StockPresenter extends Nette\Application\UI\Presenter
{
/**
* @var ListFactory
* @inject
*/
public $listFactory;
/**
* @var AddFormFactory
* @inject
*/
public $addFormFactory;
protected function createComponentList()
{
return $this->listFactory->create();
}
protected function createComponentAddForm()
{
$form = $this->addFormFactory->create();
$form->onSuccess[] = function () {
$this->flashMessage('úspěšně přidáno', 'success');
$this->redirect('list');
};
}
}
- David Matějka
- Moderator | 6445
Ajo, to CategoryControl
je chyba, spravne to tam ma byt
pojmenovane CategoryForm
, tedy stejne jako nazev te tridy.
A render musis napsat sam