postupné přidávání do šablony

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

Dobrý den, chtěl bych se zeptat, jak řešíte tento problém rozdělil bych to asi na 2 části:

  1. Přidávání věcí do hlaviček jako jsou keywords, javascripty a css
  2. Přidávání do bloků ( něco v bloku mám a chci k němu jen další věc přidat )

Ke dvojce jsem se dočetl asi nějaké odpovědi jakože:

{block #mujBlok}
        {include #parent}
        ...můj přidaný obsah
{/block}

k jedničce jsem zatím k nejlepšímu řešení nedošel… Přemýšlel jsem že by bylo nejlepší přidávat věci do hlavičky vždy pomocí presenteru dané stránky, jenže při mých pokusech mi vyhodila chybu třída SmartCachingIterator Díky za rady.

Honza Kuchař
Člen | 1662
+
0
-

Buťo použij HeaderControl nebo tam naflákej taky blocky.

Jack06
Člen | 168
+
0
-

Nevím co dělám špatně. Začínám s nette asi bych potřeboval u všeho napsat i kam skopírovat dané addony.

Zkusil jsem to a nevím proč, nicméně mi to jakoby nemůže najít generované soubory přestože existuji:

Screen

Honza Kuchař
Člen | 1662
+
0
-

viz WebLoader – tam je podrobnější popis jak nakonfigurovat ty $header[„css“] a $header[„js“]

Jack06
Člen | 168
+
0
-

Mno já to nakonfigurované mám snad dobře.. i ten soubor se mi v tempu vytvoří, ten který to pak hledá do šablony

vygenerovaná hlavička ke stylu:

<link rel="stylesheet" type="text/css" href="temp/generated-93c536c9920592b098619be09beb5d1e.css">
Taky souhlasí. Mám root webu a pak hned temp/ten soubor co to hledá

Generuji to takto v basepresenteru
protected function createComponentHeader() {
		$header = new HeaderControl(HeaderControl::HTML_5, 'cs', self::$site->site_name);

		$header->setTitleSeparator(' | ')
			->setTitlesReverseOrder(true)
			->addKeywords(self::$site->keywords)
			->setDescription(self::$site->description)
			->setRobots('index,follow');



		//CssLoader
		$css = $header['css'];
		$css->sourcePath = APP_DIR . '/static/css';
		$css->sourceUri = Environment::getVariable('baseUri') . 'static/css';
		$css->tempUri = Environment::getVariable('baseUri'). 'temp';
		$css->tempPath = APP_DIR . '/temp';

		//JavascriptLoader
		$js = $header['js'];
		$js->sourcePath = APP_DIR . '/static/js';
		$js->tempUri = Environment::getVariable('baseUri') . 'temp';
		$js->tempPath = APP_DIR . '/temp';

		return $header;
	}

APP_DIR definuji v indexu define('APP_DIR', dirname(__FILE__)); přičemž vše co bylo v app mám přímo v rootu.

Jediné co nechápu je proč to ten soubor nenajde, když cesta k ennalezenému souboru co ukazuje firebug je shodná s destinací, kde soubor je.

// A taky nechápu, kde to vezme ten vygenerovanej kód od nette, když to soubor nenašlo nebo co to píše… Viz screen

Editoval Jack06 (20. 2. 2010 13:01)

Honza Kuchař
Člen | 1662
+
0
-

Ty soubory co lezou z WebLoaderu musí být viditelné z internetu. Tzn. musí se ukládat do document_root/ nikoli do app/. Tzn. ve výstupních složkách zkus nahradit APP_DIR za WWW_DIR

Honza Kuchař
Člen | 1662
+
0
-

Tedy alespoň za předpokladu, že tvůj index.php vypadá takto:

// absolute filesystem path to the web root
define('WWW_DIR', dirname(__FILE__));

// absolute filesystem path to the application root
define('APP_DIR', WWW_DIR . '/../app');

// absolute filesystem path to the libraries
define('LIBS_DIR', WWW_DIR . '/../libs');

// load bootstrap file
require APP_DIR . '/bootstrap.php';
Jack06
Člen | 168
+
0
-

honzakuchar napsal(a):

Ty soubory co lezou z WebLoaderu musí být viditelné z internetu. Tzn. musí se ukládat do document_root/ nikoli do app/. Tzn. ve výstupních složkách zkus nahradit APP_DIR za WWW_DIR

Nemám složku app.. moje struktura je:

4mate/
+-libs
	- Dibi
	- Nette
+-log
+-models
+-presenters
+-static
	- css
		screen.css
	- js
+-temp
+-templates
config.ini
index.php
.htaccess

index.php vypadá:

<?php
define('APP_DIR', dirname(__FILE__));
define('LIBS_DIR', APP_DIR.'/libs');
require_once LIBS_DIR .'/Nette/loader.php';

Debug::enable();
Environment::loadConfig();

$application = Environment::getApplication();
dibi::connect(Environment::getConfig('database'));

$session = Environment::getSession();
if (!$session->isStarted()) $session->start();

$application->errorPresenter = 'Error';
$router = $application->getRouter();
$router[] = new Route('robots.txt', array('presenter' => 'Feed', 'action' => 'robots'));
$router[] = new Route('sitemap.xml', array('presenter' => 'Feed', 'action' => 'sitemap'));
$router[] = new Route('<presenter>/<action>/<id>/', array('presenter' => 'Homepage', 'action' => 'default', 'id' => NULL));


$application->run();

Editoval Jack06 (20. 2. 2010 13:08)

Jack06
Člen | 168
+
0
-

No tak už vím proč to nejde teda nevím proč, ale vím kde se to fláká… Prostě to nechce načítat ze složky temp… když to vygeneruji a vytáhnu třeba ze složky static, tak to funguje… Nevíš proč?

// ještě jedna věc, když pak budu chtít jen přidat do hlavičky něco, jak to napíšu v šabloně a jak v presenteru?

Editoval Jack06 (20. 2. 2010 13:58)

Jack06
Člen | 168
+
0
-

Nevíte někdo prosím, proč mi to nechce brát ten cache soubor z tempu, ale ze složky static mi to v pohodě vezme?
Celkem mi to vadí že bych měl ten soubor hrnout do složky, kterou pro to určenou defaultně nemám.

Další věc je to přidávání scriptů z prezenteru dané stránky a nebo přímo v šablonách.
Do základní šablony jsem to vložil a funguje to, ale nejšpíše to dělám špatně dále, protože přidat pak další soubor mi už nejde.

Mikulas Dite
Člen | 756
+
0
-

Tak je možné, že jsou buď špatně nastevená práva (je jenom zápis) tý složky, ale pravděpodobněji je to pro to, že se ten soubor po ukládání neuvolní a tedy nedovolí čtení.

Jack06
Člen | 168
+
0
-

Nojo, ale co s tím? A k druhé části otázky nevíš jak prosím?

Mikulas Dite
Člen | 756
+
0
-

Ještě mě napadá, v tý struktuře máš htaccess, tak zkontroluj, jestli tam nemáš Order Allow Deny: – deny all nebo něco na ten způsob.
To druhé jsem úplně nepochopil, myslíš normální html js include, nebo něco sofistikovanějšího?

Jack06
Člen | 168
+
0
-

Normálně v základním layoutu mám hlavičku nadefinouvanou přímo:

{widget header:begin}
    {widget header:css 'screen.css'}
{widget header:end}

to je přímo v layoutu.. ale třeba přijdu na stránku registrace, kde mám dělanej presenter pro registraci, a v tom presenteru bych chtěl, aby to poslalo do hlavičky ještě krom odkazu na css ještě odkaz na soubor js. zjednodušeně: <script src=odkaz na soubor"></script> – což to si zase generuje ten headercontrol, ale nějak mi to nejde zavolat z presenteru, a ještě bych rád věděl jak to má být když to budu chtít přidat přímo z šablony.. u bloků se to dělalo přes include parent a jen se dopsalo a u widgetu?

Editoval Jack06 (22. 2. 2010 17:55)

Mikulas Dite
Člen | 756
+
0
-

//máš tam špatný lomítko

Můžeš například přepsat ten odkaz pomocí assign, viz. https://forum.nette.org/…ckets-assign

Editoval Mikulas Dite (22. 2. 2010 16:11)

Ola
Člen | 385
+
0
-

Nebo možná půjde využít dědičnosti šablon (not sure):

@layout.phtml:

{widget header:begin}
	{widget header:css 'screen.css'}
	{block #headerFiles}{/block}
{widget header:end}

.. šablona:

{block #headerFiles}{widget header:js 'something.js'}{/block}
{block #content}
....
Jack06
Člen | 168
+
0
-

Ola napsal(a):

Nebo možná půjde využít dědičnosti šablon (not sure):

@layout.phtml:

{widget header:begin}
	{widget header:css 'screen.css'}
	{block #headerFiles}{/block}
{widget header:end}

.. šablona:

{block #headerFiles}{widget header:js 'something.js'}{/block}
{block #content}
....

Mno jenomže to se mi zdá už jako slátávání.. přijde mi, nebo si to alespoň myslím že autor addonu to řeší základně nějak úplně jednoduše a tady v tom hledáme strašnýho brouka.

Ondřej Mirtes
Člen | 1536
+
0
-

Proč nepoužíváš doporučenou adresářovou strukturu? Mít zdrojáky v app/ se hodí, nemusíš psát složitej .htaccess, ale jen v něm skryješ složku app (order allow, deny; deny from all).

Dědičnost se na tohle hodí.

Layout:

{widget header:begin}
	{block #css}{widget header:css 'screen.css'}{/block}
	{block #js}{widget header:js 'web.js'}{/block}
{widget header:end}

A pokud pak chceš v šabloně něco doplnit, tak:

{block #js}
	{include #parent}
	{widget header:js 'dalsi.js'}
{/block}

Ale popřemýšlej, jestli není lepší uvést všechny soubory už v layoutu, webloader to spojí do jednoho, navíc to můžeš gzipovat a prohlížeč si to nacachuje, takže práce se stránkou může být rychlejší, než když na každé podstránce budeš přidávat další CSS soubor.

Editoval Ondřej Mirtes (22. 2. 2010 18:11)

Jack06
Člen | 168
+
0
-

Jde mi třeba o přidávání scriptů jako live validation, které nebudu používat všude..
A když budu chtít v presenteru přímo přidat do hlavičky něco? lze to nějak udělat?

Ondřej Mirtes
Člen | 1536
+
0
-

Jde o to, že zápis v šabloně nejde kombinovat s přidáváním souborů v Presenteru – šablona má přednost.

Jak se přidávání soubory v továrničce, to už je čistě věc webloaderu, takže si ho vytáhni pomocí $header[‚css‘] nebo $header[‚js‘] a pracuj nad tím.

Jack06
Člen | 168
+
0
-

No, tak jsem zjistil že načítání toho souboru mi to nepovoluje .htaccess protože složku /app mám pod ochranou:

Order Allow,Deny
Deny from all

Nicméně se mi nechce vytvářet další složka na soubory, které jsou jen cachované, takže mě napadá, nejspíše jedině povolit číst soubory ze složky, které budou začínat na generate. Nicméně nevím jak to udělat v této složce mám i config.ini, takže bych ho nechtěl ohrozit aby ho někdo četl

Ondřej Mirtes
Člen | 1536
+
0
-

Rozhodně neodkrývej složku app, viz tohle vlákno. (Koukám, že to vlastně ve svém příspěvku zmiňuješ :))

Já mám na generované soubory složku document_root/temp. Nevidím v tom žádný problém.