Nefunguje $this->redirect(‚OpravaList:‘);
- Karel Chramosil
- Člen | 114
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
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.