Mapping presenterů načítání z více složek

dvorka47
Člen | 12
+
0
-

Ahoj,
snažím se udělat administraci která má společné presentery která mám ve složce vendor jako composer balíček. Ale zároveň bych pro ten modul chtěl načítat i presentery které jsou v AdminModule který je v app. Neřešil někdo tento problém?

Mapping vypadá takto.

application:
	debugger: true
	errorPresenter: Error
	scanDirs:
	    - %appDir%/../vendor/SimpleCMS/Admin
	mapping:
		Admin: SimpleCMSAdmin\Presenters\*Presenter
		*: App\Presenters\*Presenter

Děkuji za každou radu.

Petr Parolek
Člen | 455
+
-1
-

Ahoj, takhle to podle mě nepůjde, musíš přes DI extension. Nedávno jsem to tu řešil.

dvorka47
Člen | 12
+
0
-

@ppar Mohl bys mě prosím nějak nasměřovat vůbec nevím jak na to. popřípadě poslat vlákno kde jsi to řešil abych se mohl inspirovat. Děkuji moc

Petr Parolek
Člen | 455
+
0
-

https://github.com/…istry/router#… tady jsem popsal, jak na to, pokud bys chtěl mít i vlastní routy, doporučuju nainstalovat celou zmíněnou extension

Editoval ppar (5. 1. 2019 15:59)

dvorka47
Člen | 12
+
0
-

@ppar Děkuji, koukal jsem na to a pořád jsem z toho nějakej zmatenej nikdy jsem extension nepsal. Mohl bys mi to ještě drobet víc popsat? Musím teda nějak přepsat tu funkci abych mohl přidávat pod sekci admin víc mappingů ne? Děkuji za radu

Petr Parolek
Člen | 455
+
0
-

Moc ti nerozumím, ale napíšu ti jednoduchý příklad, jak jsem nedávno vymyslel:

dáš composer require webchemistry/router

a potom

app/config.neon

...
application:
	errorPresenter: Error
	mapping:
		*: App\*Module\Presenters\*Presenter
...

extensions:
...
	routers: WebChemistry\Routing\DI\RouterExtension
	- GuestbookExtension
...

routers:
	modules:
		- Guestbook
		...
		- App
	routers:
		- App\MainRouter
	...

tvá extension:

<?php

namespace CMS\Guestbook\DI;

use Nette\Application\IPresenterFactory;
use Nette\DI\CompilerExtension;

class GuestbookExtension extends CompilerExtension
{

	public function loadConfiguration()
	{
		$builder = $this->getContainerBuilder();

		$config = $this->loadFromFile(__DIR__ . '/services.neon'); //např. továrny na formuláře, modely atd.
		$this->compiler->loadDefinitions(
			$builder,
			$config['services'],
			$this->name
		);
	}

	public function beforeCompile()
	{
		$builder = $this->getContainerBuilder();

		$builder->getDefinition($builder->getByType(IPresenterFactory::class))
			->addSetup(
				'setMapping',
				[['Guestbook' => 'CMS\Guestbook\Presenters\*Presenter']]
		);
	}
}
?>

Presenter v extension:

<?php

namespace CMS\Guestbook\Presenters;

use Nette;

class DefaultPresenter extends Nette\Application\UI\Presenter
{

	...

	public function  renderDefault() {
	...
	}

	...
}
?>

Editoval ppar (5. 1. 2019 19:12)

dvorka47
Člen | 12
+
0
-

@ppar Nakonec jsem to vyřešil pomocí librette/presenter-factory. A teď to funkuje přesně jak jsem chtěl.

Config:

extensions:
	presenterFactory: Librette\Application\PresenterFactory\DI\PresenterFactoryExtension

presenterFactory:
    mapping:
        Admin:
            - CMS\Presenters\*Presenter
            - App\AdminModule\Presenters\*Presenter
        *: App\Presenters\*Presenter

Ale děkuji za tvou radu.