include/embed skrze absolutní cestu

janvacek
Člen | 15
+
+1
-

Ahoj,

je prosím nějaká možnost, jak includovat/embedovat latte šablony tím způsobem, že cestu uvedu nějakou absolutní, místo relativní?

např. něco jako

{include /app/cesta/cesta/sablona.latte}

místo např.

{include ../../cesta/sablona.latte}

David Grudl
Nette Core | 8227
+
0
-

Ano.

janvacek
Člen | 15
+
0
-

A mohl bych se prosím, zeptat, jak toho docílím? Hledal jsem v dokumentaci i tady na fóru a bohužel jsem asi nenašel tu správnou odpověď

David Grudl
Nette Core | 8227
+
0
-

Tobě to nefunguje?

janvacek
Člen | 15
+
0
-

{embed /app/cesta/cesta/templates/parts/sablona.latte}{/embed}, která v té cestě opravdu existuje, (cesta přímo kopírovaná skrze dialogové okno v PhpStormu), vyhodí Missing template file '/app/cesta/cesta/templates/parts/sablona.latte, přičemž s relativní cestou to funguje správně. Latte mám v2.11.5

MajklNajt
Člen | 497
+
+1
-

Tá absolútna cesta musí byť absolútna v rámci serveru, čiže začínať napríklad /var/www/…/app…

janvacek
Člen | 15
+
0
-

Aha, v tom případě by asi bylo lepší si napsat vlastní Loader(? Říkám to správně?) který by fungoval na principu něco jako odkazy na presentery – např. {embed :*Module:*Module:templates/parts/sablona.latte}{/embed}, není někde něco už podobného řešené? To bylo víceméně to, co jsem se snažil dohledat, jestli už někdo někdy řešil

Pepino
Člen | 256
+
0
-

@janvacek je k tomu nejaky duvod? Asi by bylo lepsi nastinit tady o co se snazis a mozna by se naslo lepsi reseni.

Marek Znojil
Člen | 90
+
+3
-

Ahoj, stačí si rozšířit FileLoader.

Já jej mám příklad takto:

use Nette\Utils\Strings;

final class FileLoader extends \Latte\Loaders\FileLoader{

    protected array $prefixes = [];

    public function setPrefixes(array $prefixes): void{
        $this->prefixes = $prefixes;
    }

    public function setPrefix(string $prefix, string $path): void{
        $this->prefixes[$prefix] = $path;
    }

    public function withPrefixes(array $prefixes): self{
        $this->setPrefixes($prefixes);

        return $this;
    }

    public function getContent($fileName): string{
      foreach($this->prefixes as $k => $v){
        if(Strings::startsWith($fileName, $k) === true){
            $fileName = $v . Strings::substring($fileName, mb_strlen($k));

            break;
        }
      }

        return parent::getContent($fileName);
    }

    public function getReferredName($file, $referringFile): string{
      foreach(array_keys($this->prefixes) as $v){
        if(Strings::startsWith($file, $v) === true){
            return $file;
        }
      }

        return parent::getReferredName($file, $referringFile);
    }

}

Pak jej přidám do služeb, kde si pomocí metody withPrefixes() rovnou zavedu požadované cesty na své prefixy:

services:
  nette.latteFactory:
    setup:
      - setLoader(App\Latte\FileLoader()::withPrefixes([
        '~': '%appDir%/Modules'
        'a~': '%appDir%/Modules/Admin'
        'f~': '%appDir%/Modules/Front'
      ]))

Pro příklad:
{include ../../../Admin/sablona.latte}
mohu zapsat jako
{include a~/sablona.latte}

Vycházel jsem z:
https://youtu.be/G-MigprZmzQ?…

Felix
Nette Core | 1199
+
+2
-

Prikladam i ukazkovy projekt.

https://github.com/…ded-skeleton

janvacek
Člen | 15
+
0
-

Krása, to je přesně to, co jsem potřeboval. Mockrát děkuji!