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

- uestla
 - Backer | 799
 
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.

- pave.kucera
 - Člen | 122
 
<?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 | 799
 
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)

- uestla
 - Backer | 799
 
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
 
if (Nette\Environment::isConsole()){
	$app = Nette\Environment::getApplication();
	$app->allowedMethods[] = Nette\Environment::getHttpRequest()->getMethod();
}