Registrace helperu s funkcí

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Tomáš Votruba
Moderator | 1114
+
0
-

Zdravím. Potřebuji v basePresenteru volat helperem nestaticou funkci.

<?php

// ideálně něco takového
$template->registerHelper("helperName", "helperFunction");

// odkáže na aktuální presenter
$template->registerHelper("helperName", callback($this, "helperFunction"));

?>

Dál už mne nic nanapadá, resp. samé nefunkční věci.

Také by mne zajímalo, zda se parametry předají automaticky, případně jak na to. Díky.

Editoval Schmutzka (22. 11. 2011 10:47)

Filip Procházka
Moderator | 4668
+
0
-

Vždyť jsi řešení sám napsal

$template->registerHelper("helperName", callback($instanceTridy, "metoda"));
Tomáš Votruba
Moderator | 1114
+
0
-

Díky, super. Ještě to na mě teďka křičí, že musí jít o statickou metodu.
Co když budu potřebovat používat databázi, tedy dynamický přístup ($this->...)?

Editoval Schmutzka (12. 12. 2011 10:00)

Filip Procházka
Moderator | 4668
+
0
-

Proč bys měl pracovat s databází v helperu?

Tomáš Votruba
Moderator | 1114
+
0
-

Db jsem řešil dříve, to už bych věděl.

Aktuálně potřebuji získat $basePath, ke které se přes $this->basePath ve statické funkci nedostanu. (Náhrada specifického textu obrázky.)

Elijen
Člen | 171
+
0
-

Nevim jak ve starem Nette, ale ve 2.0b helper kazdopadne staticka funcke byt nemusi. Pak pomoci DI neni problem vstriknout, co potrebujes.

Osobne pouzivam na obecne helpery vlastni tridu Helpers, kterou registruju jako sluzbu konteineru + pokud vyjimecne potrebuju pristup do DB nebo neco specifictejsiho, tak helper dam do tridy prislusneho modelu.

Aurielle
Člen | 1281
+
0
-

Helpery se dají registrovat i jako closury a tam se k presenteru dostaneš, tzn. třeba

$_this = $this;
$this->template->registerHelper(function($text) use($_this) {
	return $_this->context->...;
});
bojovyletoun
Člen | 667
+
0
-

No helpery by podle měly bát statické a přenostitelné, to by mě zajímalo, co takovýhle helper dělá.
Možná jsem napsal blbost,… co když si vemu takové texy,… co ostatní na to?

Elijen
Člen | 171
+
0
-

Přenositelné ano, statické ne (proč by měly?)

voda
Člen | 561
+
0
-

Některé statické být mohou, ale například pokud bude mít uživatel možnost si zvolit formát data, tak se helperu to nastavení musí nějak předat.

Tomáš Votruba
Moderator | 1114
+
0
-

gmvasek napsal(a):

Helpery se dají registrovat i jako closury a tam se k presenteru dostaneš, tzn. třeba

$_this = $this;
$this->template->registerHelper(function($text) use($_this) {
	return $_this->context->...;
});

Výborně, díky. Jedno či druhé mi funguje, nešlo by to ještě nějak spojit? Tedy předat config sem?

$_this = $this;
$template->registerHelper("helperName", callback("myPresenter", "helperFunction"));
// ...

public static function helperFunction($string) {
	$_this->... // sem!
}
Filip Procházka
Moderator | 4668
+
0
-

Vytvoříš si třídu

class MyHelpers extends Nette\Object
{
	private $context;


	public function __construct($context)
	{
		$this->context = $context;
	}

	public function loader($helper)
	{
		if (method_exists($this, $helper)) {
			return callback($this, $helper);
		}
	}

	public function helperName($arg)
	{
		return $this->context->model->fce($arg);
	}

}

zaregistruješ

$helpers = new MyHelpers($this->getContext());
$template->registerHelperLoader(array($helpers, 'loader'));

používáš

{$var|helperName}

Editoval HosipLan (24. 12. 2011 15:09)