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();
}