Přesměrování z komponenty

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

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
+
+1
-
  1. 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
  2. proc mas nejaky switch, ktery se rozhoduje dle nazvu komponenty? vytvor si samostatne komponenty pro seznam a pro formular
  3. jak pouzivat formulare v komponente je nejlepe ukazano zde: https://doc.nette.org/…s/form-reuse#…
Scorpio
Člen | 45
+
0
-

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

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

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');
		};
	}
}
Scorpio
Člen | 45
+
0
-

CZechBoY: Moc díky
EDIT: nevim proč ale furt mi hází chybu že mi chybí render()

Editoval Scorpio (11. 4. 2016 16:12)

David Matějka
Moderator | 6445
+
+1
-

Ajo, to CategoryControl je chyba, spravne to tam ma byt pojmenovane CategoryForm, tedy stejne jako nazev te tridy.

A render musis napsat sam

CZechBoY
Člen | 3608
+
+1
-

Render pro list?

Třeba takto:

class ListControl extends Control
{
	public function render()
	{
		$this->template->setFile(__DIR__ . '/' . $this->getReflection()->getShortName() . '.latte';
		$this->template->render();
	}
}