Linkování z/do Tracy panelu
- meridius
- Člen | 34
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í.
- 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?
- 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
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)
- David Matějka
- Moderator | 6445
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
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