Vlastny helper – dynamicke generovanie liniek
- aRagornol
- Člen | 17
Snazim sa prist na sposob ako generovat linky cez vlastny helper. Napr. z databazy mi pride clanok kde chcem spravit preg_replace na urcite slova a nahradit ich linkami (t.j. dynamicke generovanie). Potrebujem vyrobit helper ktory ma pristupny Presenter->link a optimalne aj DBRepository objekty. Neviem ako helperu predat tieto objekty. Nevie niekto ako na to ?
- aRagornol
- Člen | 17
enumag napsal(a):
Vytvoříš službu, do té injectneš Application. Z té si pak budeš vytahovat Presenter abys mohl tvořit odkazy. Ta služba bude mít nějakou metodu, řekněme linkify, kterou zaregistruješ jako helper v Presenter::createTemplate.
Vdaka za tip. Ale mam este nejake mensie problemy.
Config
services:
helper: Namespace\Helper
Presenter
protected function startup()
{
parent::startup();
$this->helper = $this->context->helper;
}
protected function createTemplate($class = NULL)
{
$template = parent::createTemplate($class);
$template->registerHelper('linkifyDog', function ($text) {
return $this->helper->linkifyDog($text);
});
return $template;
}
Helper
namespace Namespace;
use Nette;
class Helper extends Nette\Object
{
/** @var Nette\Application\Application */
protected $application;
/** @var Namespace\Repository */
protected $repository;
public function __construct(Nette\Application\Application $application)
{
$this->application = $application;
$this->repository = $this->application->getPresenter()->getContext()->repository;
}
public function linkifyDog($text)
{
$pattern = "/([#])(.*)([#])/";
return preg_replace($pattern, $this->application->getPresenter()->link('Page:dog', 'test'), $text);
}
}
ako v Presenteri tak v Helperi vypisuje Using $this when not in object context. Viem v com je problem ale neviem ako ho vyriesit. Zvysok v ramci logiky mam dobre ? Dakujem.
- jiri.pudil
- Nette Blogger | 1034
Buď přejdi na PHP 5.4, které podporuje $this v anonymních funkcích, anebo si ho předej pod jiným jménem:
$presenter = $this;
function ($text) use ($presenter) {
// ...
}
- Jan Tvrdík
- Nette guru | 2595
enumag wrote:
Vytvoříš službu, do té injectneš Application. Z té si pak budeš vytahovat Presenter abys mohl tvořit odkazy.
Nebo vytvoříš vlastní službu na tvorbu odkazů.
- enumag
- Člen | 2118
@Jan Tvrdík: Ano, to je samozřejmě lepší, nabízel jsem nejjednodušší řešení. Tvoje třída ovšem neumí perzistentní parametry, this a možná ještě něco dalšího co umí Presenter::createRequest. Už aby bylo generování odkazů v Nette oddělené do samostatné třídy.
Editoval enumag (2. 10. 2013 19:54)