Aplikace jako extension v libs

před 2 lety

Croc
Backer | 264
+
0
-

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.

před 2 lety

David Matějka
Moderator | 6202
+
+1
-

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/…/configuring#…

před 2 lety

Croc
Backer | 264
+
0
-

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)

před 2 lety

David Matějka
Moderator | 6202
+
0
-
  • 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?)

před 2 lety

Croc
Backer | 264
+
0
-

Díky za tipy, zkusím.

Právě že existuje jako App\Presenters\ItemPresenter ale extension mi to pak hledá jako Ext\Presenters\ItemPresenter.

Autoloading mám composerem.

Editoval Croc (27. 3. 2018 10:30)

před 2 lety

David Matějka
Moderator | 6202
+
0
-

jo takhle. pokud chces odkazovat na jiny modul (nebo mimo modul) pouzij : pro absolutni odkazovani. v tvem pripade tedy treba :Item:default

před 2 lety

Croc
Backer | 264
+
0
-

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