Použití {link… v šabloně mimo presenter

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

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

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

Diky, funguje to dobre.

T.

tr.
Člen | 79
+
0
-

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

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

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

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 CronPresenteru a vyhneme se komplikacím.

Jinak moc tedy nechápu, jaký má přínos „nemít to jako presenter“…

tr.
Člen | 79
+
0
-

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

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?….

tr.
Člen | 79
+
0
-

Vzdávám to,
použiju Presenter, děkuji za pomoc, velmi si toho vážím.

Došlo mi že to ohýbám přespříliš.

S pozdravem Tom