Routrování a rozdíl mezi latte a phtml

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

Zdravim, jsem opravdu začátečník a přečetl jsem už několik tutoriálů a článků, ale furt mi neleze na mozek, jak to vlastně funguje… Proto se to budu snažit pochopit na příkladu, který potřebuju…

Jako projekt, na kterým se učím jsem si vymyslel jednoduchou admin sekci.

po otevření stránky chci aby, pokud nejsem přihlášen načetl layout v /app/templates/login/@layout.phtml (kde mimo jiné i pro tento layout prezentr a model, zpracovavající přihlášení) a pokud jsem přihlášen, aby mi to rovnou načetlo layout /app/templates/logged/@layout.phtml… Snad chápete a budu vděčnej za fungující příklad… Učím se na 2.0 Alpha

Dále bych se chtěl zeptat, jaký je rozdíl, mezi souborama .latte a .phtml?

Děkuju moc, jsem rád že je pro nette velká česká komunita (o:

Vyki
Člen | 388
+
0
-

Pokud to chceš řešit globálně, přidej to BasePresenteru metodu startup.

<?php
 public function startup() {
	parent::startup();
	if (!$this->getUser()->isLoggedIn()) {
        	if ($this->getUser()->logoutReason === Nette\Http\User::INACTIVITY) {
                	$this->flashMessage("Byl jste odhlášen pro dlouhou neaktivitu na webu");
                }

                $this->redirect('Sign:in');
         } else {
	 	$this->setLayout('layoutPrihlaen') //nepoužije výchozí layout, ale ten který zde nastavíš (bude hledat soubor @layoutPrihlaen.latte)
	 }
}
?>

viz: Examples / CD-collection doporučuji podrobně nastudovat tento příklad

Dříve se používalo pro soubory šablon .phtml, dnes se používá .latte, na .phtml můžeš zapomenout.

Editoval Vyki (5. 6. 2011 18:16)

eximik
Člen | 43
+
0
-

Co to znamená globálně?

22
Člen | 1478
+
0
-

celosvětově :-)

eximik
Člen | 43
+
0
-

Tak jsem dal na vaše rady a výsledek: :o)

<?php

class DashboardPresenter extends BasePresenter
{
 public function startup() {
        parent::startup();
        if (!$this->getUser()->isLoggedIn()) {
                if ($this->getUser()->logoutReason === Nette\Http\User::INACTIVITY) {
                        $this->flashMessage("Byl jste odhlášen pro dlouhou neaktivitu na webu");
                }

                $this->redirect('Sign:in');
         } else {
                $this->setLayout('LayoutLogin');
         }
 }
}
Fatal Error
Class 'BasePresenter' not found
nanuqcz
Člen | 822
+
0
-

To znamená, že buď

  1. Třída BasePresenter neexistuje – v tom případě ji vytvoř :-) Případně si dej pozor na možnost, kdy třída BasePresenter sice existuje, ale v jiném namespace (pokud používáš moduly) ← něco mi říká, že to bude právě těma namespace :-)
  2. Nebo že ji RobotLoader nenašel – zkusil bych promazat cache

Editoval xxxObiWan (5. 6. 2011 21:54)

Mikulas Dite
Člen | 756
+
0
-

Třída BasePrasenter nebyla nalezena.

  • Používáš php 5.3?
    • ANO: Používáš namespace?
      • ANO: Máš někde implementovanou třídu BasePresenter?
        • ANO: Oprav usings
        • NE: Napiš jí
      • NE: ↓
    • NE: Máš někde implementovanou třídu BasePresenter?
      • ANO: Nevěřím
      • NE: Napiš jí

Editoval Mikulas Dite (5. 6. 2011 22:02)

eximik
Člen | 43
+
0
-

/app/presenters/BasePresenter.php:

<?php

use Nette\Application\Presenter;


abstract class BasePresenter extends Presenter
{
}

Cache sem promazal… Co máte na mysli tím namespace?

westrem
Člen | 398
+
0
-

@eximik, skus si okrem Nette studovat aj samotne PHP – ak nevies co sa mysli pod namespace budes mat tazke zaciatky s PHP 5.3. resp s Nette 2.0 v NS prevedeni.

Edit: tu bol nezmyselny kod, ktory zavadzal :-\

Editoval westrem (6. 6. 2011 13:48)

grey
Člen | 94
+
0
-

westrem wrote:

@eximik, skus si okrem Nette studovat aj samotne PHP – ak nevies co sa mysli pod namespace budes mat tazke zaciatky s PHP 5.3. resp s Nette 2.0 v NS prevedeni.

Oprav si svoj presenter na toto:

class DashboardPresenter extends Nette\Application\Presenter\BasePresenter

Ten kód je blbost, v BasePresenteru má use, ne namespace…

eximik
Člen | 43
+
0
-

Vim co je namespace, ale nevidim duvod jak ho tady a proč použít…

Aurielle
Člen | 1281
+
0
-

Zkus \BasePresenter.

eximik
Člen | 43
+
0
-

gmvasek napsal(a):

Zkus \BasePresenter.

Tím máš namysli „use \BasePresenter“ ?

nanuqcz
Člen | 822
+
0
-

eximik napsal(a):

Tím máš namysli „use \BasePresenter“ ?

Buď, anebo class DashboardPresenter extends \BasePresenter (efekt je stejný). Funguje?

eximik
Člen | 43
+
0
-

xxxObiWan napsal(a):

eximik napsal(a):

Tím máš namysli „use \BasePresenter“ ?

Buď, anebo class DashboardPresenter extends \BasePresenter (efekt je stejný). Funguje?

Dal sem do Dashboardu use \basePresenter a výsledek stejný, nemůže nalézt tu třídu… Neměl by se tam nějak natáhnout složka /app s třídama v configu?

nanuqcz
Člen | 822
+
0
-

Tady se řešil stejný problém (i když se bohužel nevyřešil), tak zkus věci i odsud (vypsat si načtené třídy RobotLoaderu).

Edit: třídy by si měl právě automaticky natáhnout RobotLoader (součást Nette frameworku)

Editoval xxxObiWan (5. 6. 2011 23:23)

grey
Člen | 94
+
0
-

Tady to nevypadá na žádné problémy namespaces, ale čistě problém RobotLoaderu? Nemažeš špatnou cache? Já jednou omylem ukládal ve dvou režimech jinam cache, a pak se divil že při smazání mi robotloader nenačítá nové třídy…

22
Člen | 1478
+
0
-

můžu vědět, proč nepoužiješ sandbox z distribuce? Tam je funkční aplikace a na učení je to ideální a je tam i přihlašování, pokud si vzpomínám.

eximik
Člen | 43
+
0
-

22 napsal(a):

můžu vědět, proč nepoužiješ sandbox z distribuce? Tam je funkční aplikace a na učení je to ideální a je tam i přihlašování, pokud si vzpomínám.

Tohle je příklad z NetteFramework-2.0alpha-PHP5.3\examples\CD-collection\

Cache mam jen jednu

Nox
Člen | 378
+
0
-

Po vytvoření cache se mrkni do souboru co vygeneroval RobotLoader a koukni se, jestli tam je BasePresenter

eximik
Člen | 43
+
0
-

Nox napsal(a):

Po vytvoření cache se mrkni do souboru co vygeneroval RobotLoader a koukni se, jestli tam je BasePresenter

No z nějakýho důvodu se mi ted žádný cache nechce vytvořit, práva na složku sou full chmod 777

iguana007
Člen | 970
+
0
-

no pokud si na linuxu (což podle toho chmod příkazu asi si), tak pouze chmod nemusi stacit … zkus na tu slozku jeste aplikovat

sudo chown www-data:www-data temp/ -R

(pokud se tak tedy jmenuje user/group pod kterou ti běží apache, pokud se jmenuje jinak, tak použij tu správnou)

eximik
Člen | 43
+
0
-

iguana007 napsal(a):

no pokud si na linuxu (což podle toho chmod příkazu asi si), tak pouze chmod nemusi stacit … zkus na tu slozku jeste aplikovat

sudo chown www-data:www-data temp/ -R

(pokud se tak tedy jmenuje user/group pod kterou ti běží apache, pokud se jmenuje jinak, tak použij tu správnou)

Ne, sem na widlích, ale radši řeknu chmod 777 než rwxrwxrwx …

_Martin_
Generous Backer | 679
+
0
-

eximik napsal(a):
Ne, sem na widlích, ale radši řeknu chmod 777 než rwxrwxrwx …

Windows řeší oprávnění jinak, než Unix, tam žádný chmod neexistuje a rwxrwxrwx rovněž ne. Nebo mi uniká nějaký skrytý ajťácký vtip?

eximik
Člen | 43
+
0
-

_Martin_ napsal(a):

eximik napsal(a):
Ne, sem na widlích, ale radši řeknu chmod 777 než rwxrwxrwx …

Windows řeší oprávnění jinak, než Unix, tam žádný chmod neexistuje a rwxrwxrwx rovněž ne. Nebo mi uniká nějaký skrytý ajťácký vtip?

Bože, sem z linuxu zvyklej psát 777, chtěl sem radu ohledně něčeho jinýho, tak di rejpat někam jinam. Dík

22
Člen | 1478
+
0
-

@eximik: …bych byl asi slušnější k váženým členům komunity…
jinak chybu hledej někde u sebe, jestli CD-collection z distribuce funguje, tak hledej chybu v úpravách, co jsi provedl na fungujícím prototypu.

eximik
Člen | 43
+
0
-

Vážně nemůže být problém v configu?

Config.ini:

[common]
; PHP configuration
php.date.timezone = "Europe/Prague"
php.iconv.internal_encoding = "UTF-8"
php.mbstring.internal_encoding = "UTF-8"
;php.default_charset = "UTF-8"

; variables
variable.lang = en
variable.tempDir = %appDir%/temp
;variable.tempDir = ../temp
variable.logDir = %appDir%/log

; services
service.Nette-Security-IAuthenticator = UsersModel

[common.db]

driver = mysql
hostname = "localhost"
username = "root"
password = ""
database = "nette"
charset = "utf8"


[production < common]


[development < common]
22
Člen | 1478
+
0
-

proč tam nemáš robotLoader, ten snad v přikladu CD-collection je, ne?

_Martin_
Generous Backer | 679
+
0
-

@eximik: Nevšiml jsem si, že bych do tebe jakkoliv rejpal. V okamžiku, kdy píšeš, že jsi na Windows a máš nastavený chmod 777, tak se nad takovým sdělením musím pozastavit. Třeba jsi tím mohl mít na mysli, že se připojuješ na FTP server, co já vím – takových problémů vzniklých z nedorozumnění se tu už řešila spousta.

Jak psal 22, projdi úpravy, které jsi dělal oproti původní aplikaci z distribuce. Pokud ta fungovala, bude chybka v některé ze změn.

eximik
Člen | 43
+
0
-

Původní byl .neon, já bych chtěl zůstat u .ini
Ok pokusim se dohledat ini config a nastavení pro něj

#
# SECURITY WARNING: it is CRITICAL that this file & directory are NOT accessible directly via a web browser!
# https://nette.org/en/security-warning
#
common:
	php:
		date.timezone: Europe/Prague

	service:
		Nette\Security\IAuthenticator: UsersModel
		Nette\Loaders\RobotLoader:
			option:
				directory: [%appDir%]
			run: true

	database:
		dsn: sqlite2:%appDir%/models/demo.db


production < common:

development < common:
_Martin_
Generous Backer | 679
+
0
-

Doporučuji přejít na NEON, neboť v betě verzi (a tím pádem i v dalších verzích Nette) už INI nebude podporované. Jinak je vidět, že zde v INI ti oproti NEONu chybí nastavení RobotLoaderu, čili zdá se, že problém je obdhalen (jak správně odhadl kolega)=)

eximik
Člen | 43
+
0
-

Ok, dal jsem na vaši radu a použil neon z examplu cd-collection a vypadá nyní takhle:

#
# SECURITY WARNING: it is CRITICAL that this file & directory are NOT accessible directly via a web browser!
# https://nette.org/en/security-warning
#
common:
	php:
		date.timezone: Europe/Prague

	service:
		Nette\Security\IAuthenticator: UsersModel
		Nette\Loaders\RobotLoader:
			option:
				directory: [%appDir%]
			run: true

	database:
		driver: mysql
		host: localhost
		database: nette
		username: root
		password:


production < common:

development < common:

Samozřejmě zase chyba :/ :

InvalidArgumentException

Configuration must be array, string or object. search►
File: D:\developing\_Nette\gwwIS\libs\dibi\libs\DibiConnection.php   Line: 80

73:                $tmp = array();
74:                foreach ($config as $key => $val) {
75:                    $tmp[$key] = $val instanceof Traversable ? iterator_to_array($val) : $val;
76:                }
77:                $config = $tmp;
78:
79:            } elseif (!is_array($config)) {
80:                throw new InvalidArgumentException('Configuration must be array, string or object.');
81:            }
82:
83:            self::alias($config, 'username', 'user');
84:            self::alias($config, 'password', 'pass');
85:            self::alias($config, 'host', 'hostname');
86:            self::alias($config, 'result|detectTypes', 'resultDetectTypes'); // back compatibility
87:            self::alias($config, 'result|formatDateTime', 'resultDateTime');
22
Člen | 1478
+
0
-

musíš tomu uzpůsobit i bootstrap ježišmarja…
proč si nerozjedeš napřed CD-collection a do toho nezačneš dělat změny??? Hned poznáš, co jsi napsal blbě a kde aspoň, když ti aplikace přestane fungovat.

smasty
Člen | 90
+
0
-

Ukáž bootstrap.php, resp. časť z neho, kde nastavuješ pripojenie k dibi.

westrem
Člen | 398
+
0
-

grey napsal(a):

westrem wrote:

@eximik, skus si okrem Nette studovat aj samotne PHP – ak nevies co sa mysli pod namespace budes mat tazke zaciatky s PHP 5.3. resp s Nette 2.0 v NS prevedeni.

Oprav si svoj presenter na toto:

class DashboardPresenter extends Nette\Application\Presenter\BasePresenter

Ten kód je blbost, v BasePresenteru má use, ne namespace…

Ouch, to mam za to ked v rychlosti reagujem a snazim sa help, mas samozrejme pravdu, uz som to zmazal aby nezavadzalo ludi ..

eximik
Člen | 43
+
0
-

Jojo omlouvam se nemá tam bejt database, ale db, děkuju, ale i tak, ted to zas nemůže najít třídu Class ‚Nette\Http\User‘ not found v scriptu co mi poradil vyki

_Martin_
Generous Backer | 679
+
0
-

A máš na začátku souboru s tím presenterem use Nette\Http\User?

eximik
Člen | 43
+
0
-

_Martin_ napsal(a):

A máš na začátku souboru s tím presenterem use Nette\Http\User?

Ne a i když to tam mám tak to nepomůže, cache sem promazal :/. Nemůžeš si mě prosim přidat na icq? 338617070 už chytám nerva, takový kraviny a prostě to nepoběží… Děkuju

_Martin_
Generous Backer | 679
+
0
-

Hm, a není ona to vlastně třída Nette\Web\User? V alpha verzi byly možná jiné jmenné prostory. K tomu mě napadá, že až tě podobný problém potká příště, zkus před napsáním na fórum zkontrolovat:

  1. zda soubor skutečně existuje
  2. zda třída skutečně existuje
  3. zda jsou správně zadané jmenné prostory (use tam, kde třídu používáš, namespace tam, kde ji definuješ)

ICQ musím odmítnout, věřím, že na tomto fóru se najde dost lidí, kteří budou ochotni ve svém volném čase pomoci, mě nevyjímaje.

bojovyletoun
Člen | 667
+
0
-

ohledně chyby připojení dibi : přetypuj na pole nastavení takto: new DibiConnection((array)$config);

eximik
Člen | 43
+
0
-

_Martin_ napsal(a):

Hm, a není ona to vlastně třída Nette\Web\User? V alpha verzi byly možná jiné jmenné prostory. K tomu mě napadá, že až tě podobný problém potká příště, zkus před napsáním na fórum zkontrolovat:

  1. zda soubor skutečně existuje
  2. zda třída skutečně existuje
  3. zda jsou správně zadané jmenné prostory (use tam, kde třídu používáš, namespace tam, kde ji definuješ)

ICQ musím odmítnout, věřím, že na tomto fóru se najde dost lidí, kteří budou ochotni ve svém volném čase pomoci, mě nevyjímaje.

Děkuju to je přesně ono, akorát přihlášenej nejsem, ale směruje mě to na sig:in místo toho aby nahodil layout, ale s tím si už poradím… Díky!

edit:
aha tak nic, zas mi to načítá default.latte místo login/@layout.latte :/

Editoval eximik (6. 6. 2011 15:52)

_Martin_
Generous Backer | 679
+
0
-

Ty šablony /login/@layout.phtml a /logged/@layout.phtml – opravdu to mají být dva soubory @layout a nebo tím myslíš něco jiného?

eximik
Člen | 43
+
0
-

_Martin_ napsal(a):

Ty šablony /login/@layout.phtml a /logged/@layout.phtml – opravdu to mají být dva soubory @layout a nebo tím myslíš něco jiného?

Přesně jak píšeš, nebo nějak podobně a abych měl zvlášt presentery a moduly… Jestli mě chápeš

22
Člen | 1478
+
0
-

jestli chceš moduly, máš to zase v examples/ModuleUsage v distribuci.

Editoval 22 (6. 6. 2011 18:18)

eximik
Člen | 43
+
0
-

22 napsal(a):

jestli chceš moduly, máš to zase v examples/ModuleUsage v distribuci.

Nejde mi o moduly… Teda spon zatím… Jen chci rozdělit ty dva layouty

_Martin_
Generous Backer | 679
+
0
-

Zkusme to jinak: zapomeň na layouty a presentery a popiš, co chceš udělat. Popiš to bez použití slov layout a presenter (a taktéž model). Např.:

Když přijdu na stránku a nejsem přihlášený, uvidím přihlašovací formulář. Nahoře bude záhlaví s logem. Po přihlášení se k záhlaví přidá hlavní nabídka a vpravo se vypíše přihlášený uživatel. Místo formuláře se objeví výpis poslední pěti článků s možností rychlé editace.

P.S. A taky napiš, v čem se to liší od příkladu CD-collection.

Editoval _Martin_ (6. 6. 2011 21:34)

eximik
Člen | 43
+
0
-

_Martin_ napsal(a):

Zkusme to jinak: zapomeň na layouty a presentery a popiš, co chceš udělat. Popiš to bez použití slov layout a presenter (a taktéž model). Např.:

Když přijdu na stránku a nejsem přihlášený, uvidím přihlašovací formulář. Nahoře bude záhlaví s logem. Po přihlášení se k záhlaví přidá hlavní nabídka a vpravo se vypíše přihlášený uživatel. Místo formuláře se objeví výpis poslední pěti článků s možností rychlé editace.

P.S. A taky napiš, v čem se to liší od příkladu CD-collection.

Ok, takže…

databáze bude komplet mysql/pgsql ještě nevím…

Chci si udělat mini adrministrační server pro můj server se správou mysql učtů, virtual hostů atpd. nic složitýho, mám to napsané v php4 ale je to starý a děrovatý a přdevším se moc rád naučim v nette…

Tudíš:

po otevření stránky se ukáže přihlašovací formulář, po přihlášení (úspěšném) se mi ukáže uplně jiný vzhled s postraním menu (asi zkusím s ajaxem rozbalovací) a main stránkou kde se už ude odehrávat administrce po kliknutí v menu (editace adminů, správa sql atpd.) …

a v čem se to liší? Je to podobné, ale já to potřebuju napsat od nuly abych pochopil princip MCV a peincip nette..

*edit: proto se tu furt ptám jak pablb…

Editoval eximik (6. 6. 2011 21:44)

_Martin_
Generous Backer | 679
+
0
-

Vezmu to od konce: pokud jde o psaní od nuly, tak to mohu nedoporučit=) Respektive, pro naučení s Nette je lepší vzít některý z příkladů a ten začít upravovat – a všímat si, kde je jak co dělané. Pokud děláš novou appku, doporučuji jako základ vždy použít sandbox.

K tvé appce ti dám jen nástin, na konkrétní řešení si zkus přijít sám. Řešil bych to s použitím jednoho @layout, který by byl společný pro všechny stránky. Přihlašovací stránka bude výjimkou, @layout používat nebude a celý design bude přímo v její šabloně. Jinými slovy, šablony se od CD-Collection liší pouze v tom, že přihlašovací stránka nepoužívá @layout.

Rozdělení na presentery je na tvém uvážení – můžeš mít presenter pro správu uživatelů, správu virtual serverů, mysql účtů… V případě velké složitosti můžeš dělit ještě na moduly – např. modul uživatelů, kdy řešíš účty svoje, účty zákazníků, jejich klientské údaje… Záleží na návrhu, jak by měla appka navenek vypadat a tak.

Přihlašovací funkcionalitu převezmi z některého z příkladů/sandboxu.

eximik
Člen | 43
+
0
-

_Martin_ napsal(a):

Vezmu to od konce: pokud jde o psaní od nuly, tak to mohu nedoporučit=) Respektive, pro naučení s Nette je lepší vzít některý z příkladů a ten začít upravovat – a všímat si, kde je jak co dělané. Pokud děláš novou appku, doporučuji jako základ vždy použít sandbox.

K tvé appce ti dám jen nástin, na konkrétní řešení si zkus přijít sám. Řešil bych to s použitím jednoho @layout, který by byl společný pro všechny stránky. Přihlašovací stránka bude výjimkou, @layout používat nebude a celý design bude přímo v její šabloně. Jinými slovy, šablony se od CD-Collection liší pouze v tom, že přihlašovací stránka nepoužívá @layout.

Rozdělení na presentery je na tvém uvážení – můžeš mít presenter pro správu uživatelů, správu virtual serverů, mysql účtů… V případě velké složitosti můžeš dělit ještě na moduly – např. modul uživatelů, kdy řešíš účty svoje, účty zákazníků, jejich klientské údaje… Záleží na návrhu, jak by měla appka navenek vypadat a tak.

Přihlašovací funkcionalitu převezmi z některého z příkladů/sandboxu.

Ok děkuju, pohraju si… Ještě se chci zeptat… Když sem se ptal někde, jaký je rozdíl mezi prezenterem a modulem, tak mi řekli, že model prostě jen získává data a prezentr je zpracuje a předá šabloně… Je to tak? Jde mi o to, že pro mě by blo nejlepší, kdybych to mohl napsat všechno do prezenteru a moduly bych zatím uplně vynechal …

Díky

_Martin_
Generous Backer | 679
+
0
-

Model != modul, viz. slovníček pojmů.