Použití {link… v šabloně mimo presenter
- tr.
- Člen | 79
Ahoj,
narazil jsem na problém. V presenteru v běžné Nette aplikaci vytvářím
jednu template pro odeslání mailu:
$template = new Template();
V šabloně mám odkaz:
<a href="{link Subscribe:Default, $message->id_contact, $message->contact_security_code}">zde</a>.
Při generování mi to ale hlásí:
Call to a member function link() on a non-object
Na vygenerovaném kódu:
<a href="<?php echo TemplateHelpers::escapeHtml($control->link('Subscribe:Default', array($message->id_contact, $message->contact_security_code))) ?>">zde</a>
DOTAZ: Jak mám šabloně podstrčit tu svou aplikaci aby mohla použít vše co potŕebuje pro generování odkazů?
Díky a s pozdravem Tomáš
- vlki
- Člen | 218
To znamená, že potřebuješ mít šablonu zaregistrovanou k nějakému Controlu.
Jsou tu dvě cesty:
1. Použiješ továrnu na šablonu createTemplate
. Výhoda
tohoto je, že můžeš pořád definovat helpery a filtry na jednom místě a
použít je i v šabloně pro mail.
$template = $this->createTemplate();
2. Prostě si tu proměnnou control tam přidáš ručně. (Inspirováno
obsahem metody Control::createTemplate
.)
$template = new Template();
$template->control = $this;
Druhou uvádím spíš pro zajímavost. Určitě běž radši první cestou:)
Editoval vlki (13. 8. 2009 23:50)
- tr.
- Člen | 79
vlki napsal(a):
To znamená, že potřebuješ mít šablonu zaregistrovanou k nějakému Controlu.
Ahoj, ještě mám dotaz,
když bych potřeboval vytvořit ten Control v PHP scriptu který není
Presender? Jak ho získám?
Je o to, že mám std. Nette aplikaci se vśím všudy a vedle mám jeden samostatný soubor který volá Cron a ten soubor není Presenter a rád byc v něm použil šablonu a nevím jak jí mám přiřadit ten control.
Díky T.
- Panda
- Člen | 569
tr. napsal(a):
vlki napsal(a):
To znamená, že potřebuješ mít šablonu zaregistrovanou k nějakému Controlu.
Ahoj, ještě mám dotaz,
když bych potřeboval vytvořit ten Control v PHP scriptu který není Presender? Jak ho získám?Je o to, že mám std. Nette aplikaci se vśím všudy a vedle mám jeden samostatný soubor který volá Cron a ten soubor není Presenter a rád byc v něm použil šablonu a nevím jak jí mám přiřadit ten control.
Díky T.
Pro generování odkazů je potřeba mít nejen instanci presenteru, ale
i správně nastavené routy, běžící aplikaci (Application
),
prostředí (Environment
), načtenou konfiguraci a základní
třídy a některé další věci. Nejlepší proto bude, když si vytvoříš
něco jako CronPresenter
a logiku z toho souboru přesuneš tam.
Kód toho presenteru může vypadat nějak takto:
<?php
class CronPresenter extends BasePresenter
{
public function actionDefault()
{
// Ověříme, že požadavek skutečně pochází od našeho cronu:
if (Environment::getHttpRequest()->remoteAddress === '127.0.0.1')
throw new BadRequestException('CronPresenter is accessible only from localhost', 404);
// ...
// Kód z původního souboru
// ...
// Zastavíme životní cyklus presenteru, aby nedošlo
// k vykreslení šablony (která nemusí existovat)
$this->terminate();
}
}
?>
- tr.
- Člen | 79
Mám vše potřebné vytvořeno, v tom mém souboru mám
require LIBS_DIR . '/Nette/loader.php';
$application = Environment::getApplication();
(...)
Nechci aby to byl presenter protože tím nahrazuji starší script který se volá Cronem a neměl by mít žádné parametry. Jak z té aplikace dostanu nový control?
Děkuji T.
- Panda
- Člen | 569
tr. napsal(a):
Mám vše potřebné vytvořeno, v tom mém souboru mám
require LIBS_DIR . '/Nette/loader.php'; $application = Environment::getApplication(); (...)
Nechci aby to byl presenter protože tím nahrazuji starší script který se volá Cronem a neměl by mít žádné parametry. Jak z té aplikace dostanu nový control?
Děkuji T.
Mno ten „control“, který chceš vytvořit, je presenter (právě ten se stará o linkování), takže se stejně alespoň jedné instanci nevyhneš. Pokud ale i přes to chceš script používat bez toho, aby byl do aplikace začleněn jako presenter, tak můžeš použít následující „hack“ (nemusím snad upozorňovat na to, že řešení má k čistotě a eleganci hodně daleko):
<?php
class DummyPresenter extends Presenter {
public function __construct() { }
}
$control = new DummyPresenter();
?>
Čisté řešení by spočívalo v tom, že by jsi aplikaci spustil, nechal
jí načíst nějaký presenter a ten použil… A to už rovnou můžeme
skočit zpět k CronPresenter
u a vyhneme se komplikacím.
Jinak moc tedy nechápu, jaký má přínos „nemít to jako presenter“…
- tr.
- Člen | 79
Ahoj, potrebuji aby se script volal z console bez parametru. Klidne pouziju presenter, jen nechci aby se volal s parametry pres index ale primo, to ale neumim.
To reseni s vlastnim DummyPresenterem take neumi generovat ten link, jak ho zaradim do te me aplikace?
Mozna se celou dobu ptam spatne, ale o routovani v Nette toho mnoho nevim. Jde mi proste o to volat nejake >php cron_task.php ve ktereb by se vytvorila sabona a fungoval by v ni {link}.
Dekuji za pomoc
- Panda
- Člen | 569
tr. napsal(a):
To reseni s vlastnim DummyPresenterem take neumi generovat ten link, jak ho zaradim do te me aplikace?
Definuj „neumí generovat“. Nějaké chyby, výjimky? U mě volání
funkce link
fungovalo, ale možná tam mám já
něco navíc…
tr. napsal(a):
Mozna se celou dobu ptam spatne, ale o routovani v Nette toho mnoho nevim. Jde mi proste o to volat nejake >php cron_task.php ve ktereb by se vytvorila sabona a fungoval by v ni {link}.
Pokud aplikaci chceš volat z konzole, tak bych zkusil přidat to aplikace CliRouter:
$application = Environment::getApplication();
$application->allowedMethods = NULL;
$application->router[] = new CliRouter(array('presenter' => 'Cron', 'action' => 'default'));
V cron_task.php
by pak mělo stačit nastavit základní
konstanty (APP_DIR
, LIBS_DIR
, …) a naincludovat
bootstrap.php
, případně jeho upravenou kopii (nebo jeho obsah
přesunout rovnou do cron_task.php
). Sám jsem to ale
netestoval.
Jinak něco málo o CLI routeru je tady: https://forum.nette.org/…iewtopic.php?….