expirace flashmessage po 30s

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

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 !

ViPEr*CZ*
Člen | 817
+
0
-

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.

Jan Tvrdík
Nette guru | 2595
+
0
-

Tu flash message bys měl přidat v presenteru (nebo v komponentě), až všechno doběhne.

MW
Člen | 626
+
0
-

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 !

Jan Tvrdík
Nette guru | 2595
+
0
-

@MW: Něco děláš asi špatně. Tohle ti funguje?

MW
Člen | 626
+
0
-

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

@MW: Co tohle ?

Co když nahradíš volání $this->context->invoicesModel->generateData($values->year) za sleep()?

MW
Člen | 626
+
0
-

Jan Tvrdík napsal(a):

@MW: Co tohle ?

Co když nahradíš volání $this->context->invoicesModel->generateData($values->year) za sleep()?

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

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.

MW
Člen | 626
+
0
-

Co myslis prosim tim „jak se lisi odpoved“ ?
Normalne to po 45s updatne ten snippet a flasmsg tam je…

ic
Člen | 430
+
0
-

Jak to má fungovat? Tak, že flash zprávička tam straší určitou dobu, i když uživatel přechází na jiné stránky / refreshuje stránku ?
Nebo že ta flash zprávička je na určité jedné stránce vidět jen určitou dobu a pak se sama schová?

MW
Člen | 626
+
0
-

Jen se objevi po provedeni scriptu… jen ze ten script trva 50 vterin… viz kod nahore..