expirace flashmessage po 30s
- MW
- Člen | 626
Zdravím,
potřebuji pro jednu message nastavit delsi expraci. Po odeslani formulare volam:
function generateSubmit($form) {
$values = $form->values;
$this->context->invoicesModel->generateData($values->year);
$this->flashMessage('Generování dokončeno');
$this->invalidateControl('flash');
}
ale
script trva cca 45 vteřin a uživatel nedostane pak zpravu..
Pak mam dotaz, jestli lze obnovovat flas primo z modelu.. napadlo me, ze bych to delal po kazdych 1000 dotazech do db .. ale nevim, jestli se na toto neda pouzit neco jineho..
Diky !
- Jan Tvrdík
- Nette guru | 2595
Tu flash message bys měl přidat v presenteru (nebo v komponentě), až všechno doběhne.
- MW
- Člen | 626
ViPErCZ napsal(a):
Do modelu bych to nedával, tam to nemá co dělat. Jinak presenter má metodu getFlashSession, která > vrací instanci Nette\Http\SessionSection a tam je možné si nastavit expiraci přes metodu
setExpiration.
Jsem zkousel, ale chovalo se to stejne.. jako parametr dal ‚+60 seconds‘
Jan Tvrdík napsal(a):
Tu flash message bys měl přidat v presenteru (nebo v komponentě), až všechno doběhne.
tak nejak ziju v tom, ze to ted tak mam.. nebo?
Po odeslani formu v metode generateSubmit() volam nejdrive onu
generateData() – to trva 40 vterit, a pak nastavuji flashmessage..
nebo to chapu spatne ?
Diky !
- MW
- Člen | 626
Jan Tvrdík napsal(a):
@MW: Něco děláš asi špatně. Tohle ti funguje?
Ano, toto funguje.
Toto je form + submit akce.. pokud script je do 30 vterin, flash se ukaze,
pokud je delsi ne.
Diky za pomoc!
protected function createComponentGenerate($name) {
$form = new Form($this, $name);
$form->getElementPrototype()->class('ajax');
$form->addGroup('Generování výnosů')
->setOption('container', Nette\Utils\Html::el('fieldset')->class("orange"));
$form->addSelect('year', 'Rok:', $this->getYears(1))
->setDefaultValue(date('Y'))
->setPrompt('Zvolte rok')
->setRequired('Zvolte rok');
$form->addSubmit('generate', "Generovat")
->getControlPrototype()->style(array('width' => '115px', "background" => 'orange'));
$form->onSuccess[] = array($this, "generateSubmit");
}
function generateSubmit($form) {
$values = $form->values;
$this->context->invoicesModel->generateData($values->year);
$this->flashMessage('Generování dokončeno');
$this->invalidateControl('flash');
}
- Jan Tvrdík
- Nette guru | 2595
@MW: Co tohle ?
Co když nahradíš volání
$this->context->invoicesModel->generateData($values->year)
za sleep()
?
- MW
- Člen | 626
Jan Tvrdík napsal(a):
@MW: Co tohle ?
Co když nahradíš volání
$this->context->invoicesModel->generateData($values->year)
zasleep()
?
Priklad funguje.
Nahrazeni za sleep() funguje.
Je to presne
toto chovani, ac jsem si nemyslel, ze to nema spojitost a ze se to vyresi
ajaxovym odeslanim.
Tedy dela to jen v IE a jen pokud ve formu neni addupload :-) .. pokud jej pridam, pak to projde i v priblbem IE :-( netusim.
Na localhostu s mensim mnozstvim dat to projede do 30s, tak i IE to veme v poradku.. pokud to dam na server, je tam vice dat, tak to vyhnije…
Pro jistotu, taky je obsah volane metody, jetli tam neco neuvidis:
function generateData($year) {
$y = $year;
//smazeme stare položky
$this->clearVynosy($y);
//vycistit log
file_put_contents('log\chyby_importu.php', "");
$head = "<?
Header('Cache-Control: no-cache');
Header('Pragma: no-cache');
?> <br /><br />
<html><body>
<h2>Chyby při generování importu</h2>
<table border='1'>
";
file_put_contents('log\chyby_importu.php', $head, FILE_APPEND);
$msg = "";
$mrp = $this->database->query('SELECT cislo,varsym,ico,datzdanpln,firma,cislo_zak,sum FROM mrp m WHERE YEAR(datzdanpln) ='.$y)->fetchAll();
$i=0;
foreach ($mrp as $data) {
$rozpad = $this->database->query('
SELECT p.name,p.amount,p.contractId,p.branchId,
(SELECT sum(amount) FROM payments p WHERE contractId = (SELECT id FROM contracts WHERE mrp_cislo ='.$data->cislo_zak.')
AND \''.$data->datzdanpln.'\' BETWEEN p.since AND IFNULL(p.to, \'2099-12-31\')) as paysum,
(SELECT count(id) FROM payments p WHERE contractId = (SELECT id FROM contracts WHERE mrp_cislo ='.$data->cislo_zak.')
AND \''.$data->datzdanpln.'\' BETWEEN p.since AND IFNULL(p.to, \'2099-12-31\')) as rows,
(SELECT type FROM contracts WHERE mrp_cislo ='. $data->cislo_zak.') as type,
(SELECT sum(predpis) FROM mrp WHERE cislo_zak='.$data->cislo_zak.'
AND YEAR(datzdanpln) = YEAR(\''.$data->datzdanpln.'\')
AND MONTH(datzdanpln) = MONTH(\''.$data->datzdanpln.'\')) as spredpis
FROM payments p WHERE contractId = (SELECT id FROM contracts WHERE mrp_cislo ='.$data->cislo_zak.')
AND \''.$data->datzdanpln.'\' BETWEEN p.since AND IFNULL(p.to, \'2099-12-31\')')->fetchAll();
foreach ($rozpad as $dataV) {
if(!in_array(ROUND($dataV->spredpis) , range(ROUND($dataV->paysum)-2, ROUND($dataV->paysum + 2)))) {
$i++;
If($i % 2 == 0) { $tr = "<tr bgcolor=#cccccc>";}
Else {$tr = "<tr>";}
$msg .= $tr."<td>Zak.: <b>".$data->cislo_zak. "</b></td><td>Vyst.: <b>".$dataV->spredpis."</b></td><td>Fak.: <b>".$data->cislo."</b></td><td> DZP.: <b>".date_format($data->datzdanpln, "Y-m-d")."</b></td><td> Dle <b>".$dataV->rows."</b> rozpadu/ů: <b>".$dataV->paysum."</b></td></tr>";
continue;
}
$dataV->firma = $data->firma;
$dataV->cislo_fa = $data->cislo;
$dataV->varsym = $data->varsym;
$dataV->castka = $dataV->amount;
$dataV->sum = $data->sum;
$dataV->ico = $data->ico;
$dataV->cislo_zak = $data->cislo_zak;
$dataV->datzdanpln = $data->datzdanpln;
//$dataV->type = $type['type'];
$dataV->branchId = $dataV->branchId;
unset($dataV->id, $dataV->since, $dataV->to, $dataV->note, $dataV->amount, $dataV->paysum, $dataV->rows, $dataV->spredpis);
$dataVA[] = array($dataV);
}
}
file_put_contents('log\chyby_importu.php', $msg, FILE_APPEND);
$foot = "</table></body></html>";
file_put_contents('log\chyby_importu.php', $foot, FILE_APPEND);
$this->saveVynosy($dataVA);
}
Editoval MW (19. 12. 2012 8:47)
- Jan Tvrdík
- Nette guru | 2595
MW wrote: Nahrazeni za sleep() funguje.
Jak se liší odpověď od serveru v případě, že tam je
sleep
(se kterým to funguje)?
Zkus postupně zjednodušovat tu metodu generateData()
až dojdeš
k tomu, která část má na to vliv.