Aplikace jako extension v libs
- Croc
- Člen | 270
Zdravím,
mám dvě různé aplikace, které jsou podobně napsané (architekturou,
logikou, databází). Nyní chci obě aplikace rozšířit o (dalo by se říct
společnou aplikaci) vlastní extension, který by byl napsaný jako samostatná
aplikace (config, presentery, logika, databázová vrstva, atd.). Cílem je,
mít jednu extension pro obě aplikace.
Mám rozpracované řešení v libs/Aplikace a propojený pomocí DI/AplikaceExtension.php.
No a nyní jsem narazil na problém ohledně presenterů. Myšlenka byla, že by v extension byly presentery, na které bych se z hlavní aplikace odkazoval (prakticky dal link na presenter do té vlastní extension). Je to možné? Případně jak?
Moc děkuju za rady.
- David Matějka
- Moderator | 6445
klidne tam muzes mit presentery, pak jen staci nastavit mapovani tak, aby odpovidalo namespace, ve kterem ten modul s presentery bude: https://doc.nette.org/cs/configuring#…
- Croc
- Člen | 270
Děkuju za typ, už jsem to částečně rozchodil. Nicméně teď mám
problém s tím, že ta extension chce vlastní @layout.latte
.
Hledám způsob, jak využít @layout.latte
z hlavní aplikace
(vzhled má být zachován a nechci udržovat více stejných šablon). Cílem
je, aby se šablony z extension dávaly do hlavní šablony aplikace.
Napadlo mě, vytvořit v extension @layout.latte
s odkazem na
hlavní šablonu:
{layout '$basePath/../../../../../app/presenters/templates/@layout.latte'}
Nicméně potom mám problém s odkazy, které jsou mimo extension:
Invalid link: Cannot load presenter 'Ext:Item', class 'Ext\Presenters\ItemPresenter' was not found.
Přitom se jedná o App\Presenters\ItemPresenter
.
Mapování v configu mám takto:
mapping:
*: App\*Module\Presenters\*Presenter
Ext: Ext\Presenters\*Presenter
A v extension mám toto:
public function beforeCompile() {
$builder = $this->getContainerBuilder();
$builder->getDefinition($builder->getByType(Nette\Application\IPresenterFactory::class))->addSetup(
'setMapping',
[['Ext' => 'Ext\*Module\Presenters\*Presenter']]
);
}
Editoval Croc (27. 3. 2018 9:54)
- David Matějka
- Moderator | 6445
- dohledani layoutu muzes upravit prekrytim metody formatLayoutTemplateFiles v nejakem base presenteru
- mapovani nech jen v configu, v extension to byt nema
Ext\Presenters\ItemPresenter
not found.. a existuje? kde? mas nastaven autoloading? (at uz robot loaderem nebo composerem?)
- David Matějka
- Moderator | 6445
jo takhle. pokud chces odkazovat na jiny modul (nebo mimo modul) pouzij
:
pro absolutni odkazovani. v tvem pripade tedy
treba :Item:default
- Croc
- Člen | 270
Super, už to funguje :) Díky moc.
Jen pro dohledání jako info pro ostatní (BasePresenter.php v extension
pro načtení @layout.latte
z hlavní aplikace):
<?php
namespace Ext\Presenters;
use App\Presenters\SecuredPresenter;
use Nette\Application\Helpers;
/**
* Class BasePresenter
* @package Ext\Presenters
*/
abstract class BasePresenter extends SecuredPresenter {
/**
* @return array
*/
public function formatLayoutTemplateFiles() {
if (preg_match('#/|\\\\#', $this->layout)) {
return [$this->layout];
}
list($module, $presenter) = Helpers::splitName($this->getName());
$layout = $this->layout ? $this->layout : 'layout';
$dir = dirname($this->getReflection()->getFileName());
$dir = is_dir("$dir/templates") ? $dir : dirname($dir);
do {
$list[] = "$dir/../../../app/presenters/templates/@$layout.latte";
$dir = dirname($dir);
} while ($dir && $module && (list($module) = Helpers::splitName($module)));
return $list;
}
}//class