Vlastny helper – dynamicke generovanie liniek

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

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 ?

enumag
Člen | 2118
+
0
-

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.

aRagornol
Člen | 17
+
0
-

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

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

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

@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)