Linkování z/do Tracy panelu

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

Zdravím,

pokouším se vytvořit vlastní panel do Tracy a zasekl jsem se na odkazování. Měl bych dva dotazy, které spolu souvisí.

  1. Můžu si v implementaci \Tracy\IBarPanel vygenerovat link na presenter?

    Když si svůj panel rozšířím o \App\Presenters\BasePresenter a použiju $this->presenter->link("MujPanel:MujPresenter:MojeAkce"); tak mi Tracy vyhodí chybu že:

    exception 'Nette\InvalidStateException' with message 'Unable to create link to other presenter, service PresenterFactory has not been set.' in ...project/vendor/nette/application/src/Application/UI/Presenter.php:863

    Jde to i nějak jinak nebo mám smůlu?

  1. Můžu si vytvořit přístupný presenter ve vendor/others/mujPanel/ ?

    Co musím upravit, abych se na něj mohl odkazovat?

    Ideálně bych chtěl mít presenter pro zachytávání akcí z panelu, i panel samotný ve stejné složce ve vendor/ i ve stejném namespace, jelikož bych chtěl panel distribuovat přes Composer.

David Matějka
Moderator | 6445
+
0
-

Nejsnazsi bude si do panelu predat sluzbu application (Nette\Application\Application), ze ktere si pri generovani linku (ne drive!) vytahnes presenter. Ale je tam riziko, ze pri nejake chybe (kdy vubec nedojde ke spusteni presenteru) nebude presenter existovat, tudiz nepude vygenerovat link.

alternativou je pouzit nejaky doplnek na generovani odkazu, treba nextras/link-factory

Editoval matej21 (7. 9. 2014 12:18)

meridius
Člen | 34
+
0
-

Super, přes Nette\Application\Application to funguje.
Moc děkuju.

Teď ještě pořešit to routování a mapping.

David Matějka
Moderator | 6445
+
0
-

Ha, druhou otazku jsem nejak prehlidnul :)

muzes vyuzit presenter mapping, ktery nastavis na presenter factory (sluzba nette.presenterFactory)

konkretne, v compiler extension nejak takhle:

public function beforeCompile()
{
	$builder = $this->getContainerBuilder();
	$builer->getDefinition('nette.presenterFactory')
		   ->addSetup('setMapping', array(array('MujPanel' => 'MujPanel\\*Module\\*Presenter')));
}
meridius
Člen | 34
+
0
-

Moc děkuju za pomoc!

Věděl jsem, že ta druhá část bude v nastavení mappingu, ale nedokázal jsem vysmolit nic funkčního a veškerá dokumentace žádná.

Celé jsem to nakonec vyřešil takhle:

vendor/others/mujPanel/Panel.php:

<?php
namespace MujPanel;
class Panel extends \Nette\Object implements \Tracy\IBarPanel {
	private $app;
	public function __construct(\Nette\Application\Application $app) {
		$this->app = $app;
	}
	public function getPanel() {
		$presenter = $this->app->getPresenter();
		$link = (!$presenter) ? "" : $presenter->link("MujPanel:Update:default");
		return '<a href="' . $link . '">' . $link . '</a>';
	}
...
}
?>

vendor/others/mujPanel/UpdatePresenter.php:

<?php
namespace MujPanel;
class UpdatePresenter extends \Nette\Application\UI\Presenter {
	public function actionDefault() {
		die("vyslo to!");
	}
...
}
?>

app/config/config.neon:

nette:
	application:
		mapping:
			*: App\*Module\Presenters\*Presenter
			MujPanel: MujPanel\*Module\*Presenter