Nette Documentation Preview

syntax
Řešení problémů
***************


Nejde mi Nette, zobrazuje se bílá stránka
-----------------------------------------
1. Ověřte, zda verzi PHP na webhostingu podporuje Nette Framework.
2. Zkontrolujte, zda lze do adresářů `temp` a `log` zapisovat. Viz [#Nastavení práv adresářů].
3. Zapněte Tracy natvrdo do vývojového režimu.


Chyba `#[\ReturnTypeWillChange] attribute should be used`
---------------------------------------------------------
Tato chyba se objeví, pokud jste aktualizovali PHP na verzi 8.1, ale používáte Nette, která s ní není kompatibilní. Řešením je tedy aktualizovat Nette na novější verzi pomocí `composer update`. Nette podporuje PHP 8.1 od verze 3.0. Pokud používáte verzi starší (zjistíte pohledem do `composer.json`), [upgradujte Nette |migrations/@home] nebo zůstaňte u PHP 8.0.


Nastavení práv adresářů
-----------------------
Pokud vyvíjíte na macOS nebo na Linuxu (nebo na jakémkoliv jiném systému založeném na Unixu), budete muset nastavit práva zápisu webovému serveru. Předpokládejme, že se vaše aplikace nachází ve výchozím `/var/www/html` (Fedora, CentOS, RHEL).

```shell
cd /var/www/html/MY_PROJECT
chmod -R a+rw temp log
```

Na některých Linuxech (Fedora, CentOS, ...) je standardně zapnutý SELinux. Budete muset patřičně upravit SELinux policies a nastavit správný SELinux security context pro složky `temp` a `log`. Pro `temp` a `log` nastavíme typ kontextu `httpd_sys_rw_content_t`, pro zbytek aplikace (a hlavně pro složku `app`) bude stačit `httpd_sys_content_t`. Na serveru spusťte:

```shell
semanage fcontext -at httpd_sys_rw_content_t '/var/www/html/MY_PROJECT/log(/.*)?'
semanage fcontext -at httpd_sys_rw_content_t '/var/www/html/MY_PROJECT/temp(/.*)?'
restorecon -Rv /var/www/html/MY_PROJECT/
```

Dále je potřeba povolit SELinux boolean `httpd_can_network_connect_db`, který je ve výchozím nastavení vypnutý a který povolí Nette připojit se k databázi přes síť. Využijeme k tomu příkaz `setsebool` a volbou `-P` provedeme změnu trvale, tzn. po rebootu serveru nás nebude čekat nemilé překvapení:

```shell
setsebool -P httpd_can_network_connect_db on
```


Chyba 500 v produkčním režimu
-----------------------------
Pokud ve vývojářském režimu aplikace funguje a v produkčním vyhazuje chybu 500, může být příčina v zastaralé cache. Zatímco Nette ve vývojářském režimu chytře automaticky aktualizuje cache, v produkčním režimu se zaměřuje na maximalizaci výkonu a mazání cache, po každé úpravě kódu, je na vás. Zkuste smazat `temp/cache`.

V každém případě důvod chyby vyčtete v logu. Pokud v logu nic nevidíte (a v chybě 500 je věta `Tracy is unable to log error`), zjistěte, proč nelze chyby logovat. Uděláte to třeba tak, že se přepnete do vývojářského režimu, zavoláte `Tracy\Debugger::log('hello')` a Tracy vám sdělí, proč nemůže logovat.
Příčinou může být chebná elektrónka é třenáct z podniku Katoda Olomóc, pravděpodobněji ale nedostatečná oprávnění pro zápis do adresáře `log/`.


Jak nastavit server pro hezká URL?
----------------------------------
**Apache**: je potřeba povolit a nastavit rozšíření `mod_rewrite` v souboru `.htaccess`:

```apacheconf
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz)$ index.php [L]
```

Pro ovlivňování chování Apache soubory `.htaccess` je třeba mít povolenou direktivu `AllowOverride`. Toto je v Apache výchozí chování.

**nginx**: je třeba nastavit přesměrování pomocí direktivy `try_files` uvnitř bloku `location /` v konfiguraci serveru.

```nginx
location / {
	try_files $uri $uri/ /index.php$is_args$args;  # $is_args$args je důležité
}
```

Block `location` se pro každou filesystémovou cestu smí v bloku `server` vyskytovat jen jednou. Pokud již v konfiguraci `location /` máte, přidejte direktivu `try_files` do něj.


Použití znaků { } v JavaScriptu
-------------------------------
Znaky `{` a `}` se používají pro zápis Latte tagů. Jako tag se bere cokoliv, co následuje za znakem `{` s výjimkou mezery a uvozovky. Pokud tedy potřebujete vypsat přímo znak `{` (často například v JavaScriptu), můžete za znakem `{` dát mezeru (nebo jiný prázdný znak). Tím se vyhnete překladu jakožto značky.

Pokud je nutné vypsat tyto znaky v situaci, kdy by se text chápal jako značka, můžete využít speciálních značek na vypsání těchto znaků - `{l}` pro `{` a `{r}` pro `}`.

```
{je značka}
{ není značka }
{l}není značka{r}
```


{{leftbar: @menu-common}}
{{priority: -1}}

Řešení problémů

Nejde mi Nette, zobrazuje se bílá stránka

  1. Ověřte, zda verzi PHP na webhostingu podporuje Nette Framework.
  2. Zkontrolujte, zda lze do adresářů temp a log zapisovat. Viz Nastavení práv adresářů.
  3. Zapněte Tracy natvrdo do vývojového režimu.

Chyba #[\ReturnTypeWillChange] attribute should be used

Tato chyba se objeví, pokud jste aktualizovali PHP na verzi 8.1, ale používáte Nette, která s ní není kompatibilní. Řešením je tedy aktualizovat Nette na novější verzi pomocí composer update. Nette podporuje PHP 8.1 od verze 3.0. Pokud používáte verzi starší (zjistíte pohledem do composer.json), upgradujte Nette nebo zůstaňte u PHP 8.0.

Nastavení práv adresářů

Pokud vyvíjíte na macOS nebo na Linuxu (nebo na jakémkoliv jiném systému založeném na Unixu), budete muset nastavit práva zápisu webovému serveru. Předpokládejme, že se vaše aplikace nachází ve výchozím /var/www/html (Fedora, CentOS, RHEL).

cd /var/www/html/MY_PROJECT
chmod -R a+rw temp log

Na některých Linuxech (Fedora, CentOS, …) je standardně zapnutý SELinux. Budete muset patřičně upravit SELinux policies a nastavit správný SELinux security context pro složky temp a log. Pro temp a log nastavíme typ kontextu httpd_sys_rw_content_t, pro zbytek aplikace (a hlavně pro složku app) bude stačit httpd_sys_content_t. Na serveru spusťte:

semanage fcontext -at httpd_sys_rw_content_t '/var/www/html/MY_PROJECT/log(/.*)?'
semanage fcontext -at httpd_sys_rw_content_t '/var/www/html/MY_PROJECT/temp(/.*)?'
restorecon -Rv /var/www/html/MY_PROJECT/

Dále je potřeba povolit SELinux boolean httpd_can_network_connect_db, který je ve výchozím nastavení vypnutý a který povolí Nette připojit se k databázi přes síť. Využijeme k tomu příkaz setsebool a volbou -P provedeme změnu trvale, tzn. po rebootu serveru nás nebude čekat nemilé překvapení:

setsebool -P httpd_can_network_connect_db on

Chyba 500 v produkčním režimu

Pokud ve vývojářském režimu aplikace funguje a v produkčním vyhazuje chybu 500, může být příčina v zastaralé cache. Zatímco Nette ve vývojářském režimu chytře automaticky aktualizuje cache, v produkčním režimu se zaměřuje na maximalizaci výkonu a mazání cache, po každé úpravě kódu, je na vás. Zkuste smazat temp/cache.

V každém případě důvod chyby vyčtete v logu. Pokud v logu nic nevidíte (a v chybě 500 je věta Tracy is unable to log error), zjistěte, proč nelze chyby logovat. Uděláte to třeba tak, že se přepnete do vývojářského režimu, zavoláte Tracy\Debugger::log('hello') a Tracy vám sdělí, proč nemůže logovat. Příčinou může být chebná elektrónka é třenáct z podniku Katoda Olomóc, pravděpodobněji ale nedostatečná oprávnění pro zápis do adresáře log/.

Jak nastavit server pro hezká URL?

Apache: je potřeba povolit a nastavit rozšíření mod_rewrite v souboru .htaccess:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz)$ index.php [L]

Pro ovlivňování chování Apache soubory .htaccess je třeba mít povolenou direktivu AllowOverride. Toto je v Apache výchozí chování.

nginx: je třeba nastavit přesměrování pomocí direktivy try_files uvnitř bloku location / v konfiguraci serveru.

location / {
	try_files $uri $uri/ /index.php$is_args$args;  # $is_args$args je důležité
}

Block location se pro každou filesystémovou cestu smí v bloku server vyskytovat jen jednou. Pokud již v konfiguraci location / máte, přidejte direktivu try_files do něj.

Použití znaků { } v JavaScriptu

Znaky { a } se používají pro zápis Latte tagů. Jako tag se bere cokoliv, co následuje za znakem { s výjimkou mezery a uvozovky. Pokud tedy potřebujete vypsat přímo znak { (často například v JavaScriptu), můžete za znakem { dát mezeru (nebo jiný prázdný znak). Tím se vyhnete překladu jakožto značky.

Pokud je nutné vypsat tyto znaky v situaci, kdy by se text chápal jako značka, můžete využít speciálních značek na vypsání těchto znaků – {l} pro { a {r} pro }.

{je značka}
{ není značka }
{l}není značka{r}