CRON skript využívající hlavní aplikaci

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

Zdravím.

Chystám se napsat extra skript, který bude spouštěný CRONem (nepřístupný z webu). Tenhle skript by měl rozesílat e-maily, přičemž bude využívat Nette šablony, u kterých bych chtěl mít stejné helpery, které si registruji v BasePresenteru hlavní aplikace. Navíc se v těle e-mailu budou vyskytovat odkazy přímo do hlavní aplikace (tzn. {plink ...}).

Bohužel nemám páru, jak to správně architektonicky pojmout a dosáhnout kýženého výsledku. Nemáte prosím někdo recept, případně návrh / nápad, jak toto řešit? Spouštěný skript musí být opravdu v extra .php souboru, abych ho mohl CRONu předat v administraci webhostingu.

Předem moc děkuji.

Aurielle
Člen | 1281
+
+1
-

CliRouter, jinak můžeš normálně využít Nette aplikaci. (S CliRouterem ještě sám nemám zkušenost, zatím jsem ho nepotřeboval použít)

uestla
Backer | 796
+
0
-

Byl by prosím někdo ochotný a mohl sem poslat ukázku použití tohoto CliRouteru? Jestli ho přidat do instance MultiRouteru v hlavní aplikaci a hlavně pak jak jej namapovat ze spouštěného skriptu?

Mockrát díky.

pave.kucera
Člen | 122
+
0
-
<?php
$router = $application->getRouter();
$router[] = new Nette\Application\CliRoute(array(
	'action'	=> 'Presenter:action',		// Pozor! Musíš použít klíč 'action', na klíč 'presenter' router nereaguje!
));
?>

<?php
class Presenter extends Nette\Application\Presenter {
	public function actionAction($arg) {
		// Jako vždy...
	}
}
?>

Psáno z hlavy, ale snad to stačí. Akorát nevím jak myslíš ono „namapování z hlavního skriptu“.

uestla
Backer | 796
+
0
-

Snažil jsem se z kódu a z dalších vláken zde na fóru CliRouter nasadit. Došel jsem k následujícímu:

bootstrap.php

// ...

$router = $application->getRouter();

$router[] = new CliRouter(array(
	'action' => 'Homepage:sendNews', // EDIT podle postu od JannBaill výše
));

// ...

HomepagePresenter:

class HomepagePresenter extends BasePresenter
{
	// ...

	public function actionSendNews()
	{
		if (!Environment::isConsole()) { // dulezita kontrola kvuli moznemu pristupu z webu
			$this->redirect('default');
		}

		// ...
	}

	// ...
}

Když pak tedy v administraci na hostingu nastavím spouštěný skript na <document_root>/index.php, měla by se matchnout právě CLI routa (je uvedena jako první), a tím i zavolat příslušná metoda.

Pochopil jsem ten mechanismus správně? Je v tom ještě nějaký zádrhel?

Děkuji.

Editoval uestla (6. 3. 2011 0:09)

voda
Člen | 561
+
0
-

Já mám ještě v bootstrap.php

if (Environment::isConsole()) {
	$application->allowedMethods = FALSE;
}

Nevím jestli to je potřeba, ale taky jsem jen odněkud kopíroval.

Editoval voda (6. 3. 2011 10:42)

uestla
Backer | 796
+
0
-

Co přesně to zapříčiní? Že to neprojde touto podmínkou? Ale dál se to už dostane, čili příkazem

$application->allowedMethods = FALSE;

bych měl teoreticky povolit všechny metody, nebo se mýlím?

Filip Procházka
Moderator | 4668
+
0
-
if (Nette\Environment::isConsole()){
	$app = Nette\Environment::getApplication();
	$app->allowedMethods[] = Nette\Environment::getHttpRequest()->getMethod();
}