Suggested directory structure
app/
.htaccess (Deny from all)
bootstrap.php
config.ini
models/
presenters/
DefaultPresenter.php
AdminModule/
DefaultPresenter.php (Admin:Default presenter)
temp/ (must be writtable)
templates/
@layout.phtml
Default/ (Default presenter)
default.phtml (Default:default view)
AdminModule/
Default/ (Admin:Default presenter)
@layout.phtml (Admin:Default presenter layout)
default.phtml (Admin:Default:default view)
document_root/
.htaccess (see below)
index.php
libs/
.htaccess (Deny from all)
dibi/
Nette/
Texy/
Pokud na webové aplikaci nepracuje tým, ale jeden sólista, může být
výhodnější ukládat šablony a presentery pohromadě. Nemyslím do jednoho
adresáře, ale například do podadresáře templates ve složce,
kde je umístěný presenter. Rozdíl mezi tímto a výchozím ukládáním je
nejvíce patrný při používání modulů:
Ukládání odděleně
presenters/
FrontModule/
HomepagePresenter.php
AdminModule/
AuthPresenter.php
templates/
FrontModule/
@layout.phtml
Homepage.default.phtml
AdminModule/
@layout.phtml
...
Ukládání pohromadě
presenters/
FrontModule/
HomepagePresenter.php
templates/
@layout.phtml
Homepage.default.phtml
AdminModule/
AuthPresenter.php
templates/
...
Celý modul je pak pohromadě v jednom podadresáři, včetně tříd i šablon.
Pokud vám tento způsob více vyhovuje, nastavte proměnnou prostředí
templatesDir na stejnou hodnotu jako
presentersDir:
Environment::setVariable('templatesDir', '%appDir%/presenters');
// nebo v souboru config.ini:
// variable.templatesDir = "%appDir%/presenters"
Nette už samo vloží do cesty podadresář /templates/.
.htaccess
# configure PHP
php_flag magic_quotes_gpc off
php_flag register_globals off
# mod_rewrite
RewriteEngine On
#RewriteBase /
# front controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz)$ index.php [L]
index.php
<?php
// 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');
// load bootstrap file
require APP_DIR . '/bootstrap.php';
V Nette se zachovává jednotný řád pro cesty k adresářům.
Adresáře, ať v konstantě, proměnné, proměnné prostředí atd.
neobsahují pravostranné lomítko. Není potřeba volat
rtrim($dir, '/') . '/file.php' nebo se bát, že se někde zdvojí
lomítko – stačí dodržovat konvenci.
define('ANY_DIR', dirname(__FILE__));
require ANY_DIR . '/file.php';
Určitou výjimkou je adresář pro cache FileStorage, ale tady nejde o adresář, nýbrž prefix cesty.
Výjimkou jsou také cesty baseUri & basePath,
které vždy končí lomítkem (takže lze v šablonách psát
<link rel="stylesheet" type="text/css" media="screen"
href="{$baseUri}css/style.css">)
bootstrap.php
<?php
/**
* Load Nette
*/
require_once dirname(__FILE__) . '/../libs/Nette/loader.php';
/**
* Configure application
*/
Environment::loadConfig();
/**
* Prepare & setup
*/
Debug::enable(E_ALL | E_STRICT);
$application = Environment::getApplication();
$router = $application->getRouter();
$router[] = new Route('index.php', array(
'presenter' => 'Default',
'view' => 'default',
), Route::ONE_WAY);
$router[] = new Route('<presenter>/<view>/<id>', array(
'presenter' => 'Default',
'view' => 'default',
'id' => NULL,
));
/**
* Run!
*/
$application = Environment::getApplication();
$application->run();
config.ini
[common]
set.date-timezone = "Europe/Prague"
set.iconv-internal_encoding = "%encoding%"
set.mbstring-internal_encoding = "%encoding%"
; Production site configuration data
[production < common]
set.include_path = "%appDir%/libs;%modelsDir%/;%presentersDir%/"
; Staging site configuration data inherits from production and
; overrides values as necessary
[development < production]
DefaultPresenter.php
class DefaultPresenter extends Presenter
{
public function renderDefault()
{
$this->template->title = "Hello";
}
public function renderHello($param)
{
// $param should be 123 after click
}
}
@layout.phtml
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title><?php echo htmlSpecialChars($title) ?></title>
</head>
<body>
<h1><?php echo htmlSpecialChars($title) ?></h1>
<div id="content">
<?php $content->render() ?>
</div>
</body>
</html>
default.phtml
<p><a href="<?php echo $presenter->link('hello', 123) ?>">Hello World!</a></p>
