Připojení obsahu na konec layoutu

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

Ahoj
vytvářím si rozšíření pro web, ve kterém bych chtěl mít část šablony a několik js, css souborů uložených pohromadě ve vendoru.

Bádám nad tím, jak načíst tyto části (soubory) na konec layoutu (vždy a jakéhokoliv), pokud možno bez nutnosti registrace v config.neon nebo alespoň nezávisle na presenterech.

Mám na mysli stejné vkládání, jako se vkládá například tracy debugger panel.

Když to shrnu:

  1. Jak tyto soubory vložit na konec layoutu automaticky bez volání funkcí v presenterech?
  2. Je možné to provést „obecně“ bez registrace v config.neon?

Předem děkuju za každou odpověď.

Editoval Machy8 (11. 12. 2015 19:31)

Hurass
Člen | 114
+
0
-

Ve vendor složce by si nikdy neměl nic dělat (nahrávat, mazat, upravovat) ručně. Můžeš si je ale uložit do jedné složky, kterou budeš mít ve složce www a poté procházet všechny soubory složky v BasePresenteru v metodě beforeRender, která ti všechny soubory předá šabloně.

Editoval Hurass (11. 12. 2015 19:38)

ViPEr*CZ*
Člen | 811
+
0
-

Ano jak píše Hurass… vendor se generuje a tam se nic měnit nemá. Ostatně sám to poznáte, jestli někdy v budoucnu zavoláte update :-)
To co popisujete je tak trochu abstrakce. Nechcete něco volat v jednotlivých presenterech, tak proč právě nepoužít abstrakce. A je to tu, již zmiňovaný BasePresenter. Již zmiňovaná metoda beforeRender se pak volá pro každý konkrétní a tudíž dokáže všem potomkům nastavit cokoliv do šablony.

Machy8
Člen | 59
+
0
-

Ve vendoru nic mazat ani upravovat nechci. Mám spíše na mysli, jak načíst tyto soubory po stažení celého rozšíření composerem (moje chyba, špatně jsem to vysvětlil).

Po stažení bych chěl toto rozšíření maximálně (pokud to jinak nejde) zaregistrovat v config.neon. Stránka by se poté načetla již s panelem.

Nevím ale, jak předat obsahy latte, css a js souborů (uložených ve vendoru spolu s rozšířením), a jak tento obsah umístit na správné místo na konec layoutů.

CZechBoY
Člen | 3608
+
+1
-

Napíšeš do návodu k instalaci, že se musí na konec šablony přidat komponenta s js, která se vytvoří kdesi v basepresenteru (pokud to chceš mít všude). viz třeba návod k webloaderu

Machy8
Člen | 59
+
0
-

@CZechBoY : Díval jsem se na to. Btw je možné to provést bez {control …}? Zkoušel jsem najít metodu, jak je načítán debugger panel bez registrace v config.neon a presenterech ale nic jsem nenašel.

Editoval Machy8 (12. 12. 2015 19:28)

greeny
Člen | 405
+
+1
-

Debug bar je načítán pomocí PHP funkce register_shutdown_function, ale to není co chceš, protože ty potřebuješ ty věci načíst ještě v rámci <body>

Machy8
Člen | 59
+
0
-

@greeny: Zkusil jsem to pomocí register_shutdown_function a funguje to. Díky!

Ve výsledku (zjednodušeně) to vypadá takto:

Autoload

1. Composerem – autoload_files.php

Test.php

ob_start();

    function test ()
    {
		require "helloWorld.latte";
    }

ob_end_clean();

register_shutdown_function('test');

Autoload_files.php

// autoload_files.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    ...
    $vendorDir . '/just/test/src/test.php',
);
2. RobotLoader (lepší to v test.php rozepsat do tříd)

Test.php

class Test
{
    public function __construct ()
    {
		register_shutdown_function([$this, 'helloWorld']);
    }

    public function helloWorld ()
    {
		ob_start();
		require "helloWorld.latte";
		ob_end_clean();
    }
}

Bootstrap.php

$configurator->createRobotLoader()
	...
	->addDirectory(__DIR__.'/../vendor/just/test/src')
	->register();

new Test();

HelloWorld.latte

<?php echo "Hello world"; ?>

Teď jen přemýšlím, zda-li je to „špatně“ vkládat tento obsah až za body. To ještě musím poladit.

Editoval Machy8 (13. 12. 2015 17:13)

greeny
Člen | 405
+
0
-
  1. určitě je špatně vkládat obsah za body
  2. tohle se ti zavolá i když neproběhne kód v pořádku (server error), což asi není to co chceš
  3. proč pojmenováváš soubor .latte, když v něm Latte není? :)
Machy8
Člen | 59
+
0
-

Díky ⇒ teď jsem si všiml, že to mám pojmenovaný .latte místo .phtml. To vkládání na konec asi nebude ideální řešení. Budu to muset upravit. Zatím mě ale nenapadá jiná cesta kromě možnosti to připojit k šabloně nebo to načíst v layoutu.

Editoval Machy8 (14. 12. 2015 13:07)

greeny
Člen | 405
+
0
-

Určitě je mnohem lepší to explicitně vyžádat nějakým makrem na dané místo než spoléhat na nějakou takovou php featuru a mít pak s tím problémy třeba u server errorů, apod