postupné přidávání do šablony
- Jack06
- Člen | 168
Dobrý den, chtěl bych se zeptat, jak řešíte tento problém rozdělil bych to asi na 2 části:
- Přidávání věcí do hlaviček jako jsou keywords, javascripty a css
- 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
viz WebLoader – tam je podrobnější popis jak nakonfigurovat ty $header[„css“] a $header[„js“]
- Jack06
- Člen | 168
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
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
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
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
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
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
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í.
- Mikulas Dite
- Člen | 756
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
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
//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)
- Jack06
- Člen | 168
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
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)
- Ondřej Mirtes
- Člen | 1536
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
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
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.