Nefunguje $this->redirect(‚OpravaList:‘);

Karel Chramosil
Člen | 114
+
0
-

Dobrý den,
prosím o radu nefunguje mne $this->redirect(‚OpravaList:‘);

Upozornění pro uživatele

Možný problém: odesíláte HTTP hlavičku, zatímco již máte nějaká data ve výstupním bufferu. Vyzkoušejte Tracy\OutputDebugger nebo odešlete soubory cookie/zahajte relaci dříve.

Presenter s přesměrováním:

<?php

/**
 * Presenter, který zajišťuje zadání nové opravy.
 */

namespace App\Presenters;

use Nette;
use Nette\Application\UI\Form;
use Nette\Utils\DateTime;

class OpravaNovyPresenter extends SecuredPresenter
{
	/**
	 * Továrna na vytvoření formuláře pro založení editaci zadání nové opravy..
	 * @return Nette\Application\UI\Form
	 */

    private $id;
    private $database;

    public function __construct(Nette\Database\Context $database)
    {
        $this->database = $database;
    }

	/**
	 * Výchozí akce presenteru. Zajistí výběr informací o seznamu typů automatů z databáze.
	 * @param $id int ID seznamu typů závad.
	 */
	public function actionDefault($id)
	{

		$this->id = $this->database->table('automat')
		    ->get($id);
		if ($this->id === FALSE) {
			$this->setView('notFound1');
			echo $this->id;

		}
	}


    public function renderDefault()
    {
        $this->template->anyVariable = 'any value';
    }


	protected function createComponentEditaceForm()
	{
	/** Kontrola data
	* @param string datum ve formátu d.m.rrrr
	* @return bool platnost data
	* @copyright Jakub Vrána, http://php.vrana.cz/
	*/

		$user = $this->getUser();
		$automat = $this->database->table('automat')
		    ->get($this->id);
		$typaut = $this->database->table('typauto')
		    ->get($automat->typauto_id);

		echo "v.č.: ";
		echo $automat->vyrobcislo;
		echo "  Organizace: ";
		echo $automat->organizace;
		echo "  Typ zařízení: ";
		echo $typaut->typautomat;

		$form = new Form();
		$form->addHidden('automat_id',$automat->id);
		$form->addSelect('id', 'Druh práce:', $this->database->table('typzavad')
		    ->order('typzavady ASC')
		    ->fetchPairs('id', 'typzavady'))
		    ->setPrompt('Zvolte typ závady!');
		$form->addTextArea('popiszavady', 'Popis závady:', 50, 4)
    		->addRule(Form::MAX_LENGTH, 'Popis je příliš dlouhý', 400);
 		$form->addTextArea('popisopravy', 'Popis opravy:', 50, 8)
    		->addRule(Form::MAX_LENGTH, 'Popis je příliš dlouhý', 600);

        $form->addText('odpor_ochr_vodice', 'Odpor ochranného vodiče [Ω]', 10, 10);
        $form->addText('izolacni_odpor', 'Izolační odpor [MΩ]', 10, 10);
        $form->addText('unikajici_proud', 'Měření unikajícího proudu I [mA]:', 10, 10);
        $form->addText('dotykove_napeti', 'Dotykové napětí (chránič)) Ud [V]:', 10, 10);
        $form->addText('vybavovaci_cas', 'Vybavovací čas chrániče tv [mS]:', 10, 10);
        $form->addText('vybavovaci_proud', 'Vybavovací proud chrániče Iv [mA]:', 10, 10);

		$form->addTextArea('poznamka', 'Poznámka:', 50, 4)
            ->addRule(Form::MAX_LENGTH, 'Poznámka je příliš dlouhá', 300);
		$form->addText('cas_opravy', 'Čas opravy:', 3, 10)
			->addRule(Form::FLOAT, 'Čas opravy musí být desetinné číslo')
		    ->addRule(Form::FLOAT, 'Čas opravy musí být od 0 do 99', array(0, 99))
		   	->setDefaultValue(0)
			->addRule(Form::FILLED, 'Je nutné zadat čas opravy.');
/*		$form->addText('datum_opravy', 'Datum opravy:', 12, 12)
			->addRule('platne_datum', 'Datum musí být ve formátu d.m.rrrr');*/
        $date = DateTime::from(1); //+1 vteřina
        $date_now = $date->format('d.m.Y');
		$form->addText('datum_opravy', 'Datum opravy:', 12, 12)
    		->addRule(Form::FILLED, 'Datum je povinné.')
    		//->addRule('MyDateValidator::date_cz_is_valid', 'Datum "datum_opravy" není platné!')
			->setDefaultValue($date_now);



		$form->addSubmit('set', 'Uložit data');
		$form->onSuccess[] = [$this, 'editaceFormSubmitted'];


		return $form;
	}


	/**
	 * Zpracuje odeslaný formulář. Mění data typu závady.
	 * @param Nette\Application\UI\Form $form
	 */
	public function editaceFormSubmitted(Form $form)
	{
		$values = $form->getValues();
		$user = $this->getUser();
		try {
		if ($values->id === NULL ) {
			$values->id = 13;
		}

        $datum_opravy_db = $this->date_cz_db($values->datum_opravy);
        $date = DateTime::from(1); //+1 vteřina
        $date_now = $date->format('d.m.Y');

		$this->database->table('oprava')->insert(array(
			'typzavad_id'=>$values->id,
			'automat_id'=>$values->automat_id,
			'popiszavady'=>$values->popiszavady,
			'popisopravy'=>$values->popisopravy,

			'odpor_ochr_vodice'=>$values->odpor_ochr_vodice,
			'izolacni_odpor'=>$values->izolacni_odpor,
			'unikajici_proud'=>$values->unikajici_proud,
			'dotykove_napeti'=>$values->dotykove_napeti,
			'vybavovaci_cas'=>$values->vybavovaci_cas,
			'vybavovaci_proud'=>$values->vybavovaci_proud,

			'poznamka'=>$values->poznamka,
			'cas_opravy'=>$values->cas_opravy,
			'datum_opravy'=>$datum_opravy_db,
			'user_id'=>$user->id,
			'datum_zapsal'=>$date_now
			));

        $this->flashMessage('Data byla uložena.', 'success');
        $this->redirect('OpravaList:');

		} catch (PDOException $e) {
			$form->addError('Zadaná data nejsou správné, pravděpodobně duplicitní typ závady.');
		}
	}

}

Volaný pressenter:

<?php
/**
 * UserList presenter.
 *
 * @author     Karel Chramosil
 * @package    Opravy
 * Presenter, který zajišťuje výpis seznamu oprav.
 */

namespace App\Presenters;

use App\Model\Paginator;
use Nette;
use IPub\VisualPaginator\Components as VisualPaginator;

final class OpravaListPresenter extends SecuredPresenter
{
    private $database;

    public function __construct(Nette\Database\Context $database)
    {
            $this->database = $database;
    }

	public function actionDefault()
	{
	}


	public function renderDefault(int $page = 1)
	{
		$this->template->page = $page;
		// zjištění maximálního počtu řádků
		$icount = $this->database->table('oprava')
            ->where('NOT (popisopravy)', '')
            ->count("*");

		$this->template->opravas = $this->database->table('oprava')
            ->where('NOT (popisopravy)', '')
            ->order('datum_opravy DESC, id DESC')
            ->page($page, 5);

	}

	public function beforeRender()
	{
	    ;
	}

}

Router:

<?php

declare(strict_types=1);

namespace App\Router;

use Nette;
use Nette\Application\Routers\RouteList;


final class RouterFactory
{
	use Nette\StaticClass;

	public static function createRouter(): RouteList
	{
		$router = new RouteList;
		$router->addRoute('<presenter>/<action>[/<id>]', 'Homepage:default');
		//$router->addRoute('<presenter>/<action>[/<id>]', 'Sign:default');
		$router->addRoute('<presenter>/<action>[/<id>]', 'OpravaList:default');
		return $router;
	}
}

Jiná část projektu funguje Ok.

Děkuji moc za radu.

Karel Chramosil

Marek Bartoš
Nette Blogger | 1280
+
+1
-

createComponentEditaceForm() se volá jak při vykreslení, tak při zpracování formuláře. A redirect navěšuješ na zpracování tohoto formuláře. Problém je, že v té metodě voláš echo, což vykreslí výstup a $this->redirect() pak nemůže odeslat hlavičky pro přesměrování. Takže echo odstraň a všechno vykreslování nech v šabloně. Pro vypsání informací pro debug můžeš použít funkci bdump(),která data vykreslí v Tracy baru.

Myslím, že ti nebude fungovat ani $this->redirect() – v komponentě ta funkce slouží primárně pro zpracování jejích vlastních handle metod, $this->presenter->redirect() je pro přesměrování na jiný presenter.

Karel Chramosil
Člen | 114
+
0
-

Děkuji moc,

odstraněním „echo“ vše vyřešilo.

Hezký den

Karel Chramosil