NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 6 - Jednoduchý redakční systém v Nette - Výpis článku

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovídá na danhosek
Jindřich Máca:11.10.2016 16:49

Já jsem si to taky zkoušel napsat lokálně a funguje mi to. :)

Každopádně v tom kousku kódu, co jsi teď poslal, vidím minimálně dvě chyby:

1. Pokud sis nevšiml, tak jsem ve svým příkladech odstranil:

Route::VALUE => 'default'

2. Opět by ty routovací pravidla měli jít v opačném pořadí, protože [<action>/][<ur­l>] je rozhodně obecnější než <action>_ref/[<ur­l>].

Doporučoval bych začít poctivě používat Nette Laděnku a dobře se koukat, jaká routovací pravidla se vlastně kde aplikují. ;)

Už jsem to tady jednou psal do komentářů, konkrétně http://www.itnetwork.cz/…ypis-clanku/?…, ale radši to ještě zopakuji. Routování je relativně složitější záležitost a chce to mu nejdříve porozumět, než zběsile zkoušet všechny kombinace. :-P

 
Odpovědět
11.10.2016 16:49
Avatar
danhosek
Člen
Avatar
Odpovídá na Jindřich Máca
danhosek:11.10.2016 19:35

já vím, máš zcela pravdu, ale moc toto chci dotahnout. Úpravy zabraly a vše nyní funguje!
Obecné routy jsem odlišil a upravil na
$router[] = new Route('referen­ce/[<url>]', 'Core:Referen­ce:default');
$router[] = new Route('[<url>]', 'Core:Article:de­fault');
return $router;
}
a už to jede. Mockrát děkuji za trpělivost a ochotu, vím že to semnou není lehké. děkuji!

 
Odpovědět
11.10.2016 19:35
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovídá na danhosek
Jindřich Máca:11.10.2016 21:14

Přesně takhle by to mělo vypadat, dobrá práce! :)

 
Odpovědět
11.10.2016 21:14
Avatar
danhosek
Člen
Avatar
danhosek:12.10.2016 22:48

Ještě mám jeden dotaz, nevím, jestli se to přesně vztahuje k routám, ale myslím že ano.
Když chci odlišit úvodní stránku od ostatních článků. Aby úvodní stránka obsahovala něaké tagy navíc.
Udělám si např.: uvod.latte ale nevim, jak mám přesměrovat úvod(není zadaná url) na jinou šablonu.
Mapadlo mě i řešení podmínky v latte, jako je řešený výpis v editaci, ale u tohoto mi to přijde jako nevhodné řešení a nevím jak udělat podmínku ve tvaru {if {$article->url}='uvod'}
spíše bych to řešil přesměrování na jenou latte šablonu, ale jak toto nejlépe provést?
Děkuju.

 
Odpovědět
12.10.2016 22:48
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovídá na danhosek
Jindřich Máca:13.10.2016 14:11

Určitě bych to neřešil v rámci samotné Latte šablony. O to, co se má vykreslit se má starat pro konkrétní URL router a pro konkrétní případ při obecnějším routovacím pravidlu, samotná akce routerem zvoleného presenteru. :)

Zkusím opět uvést příklad. U článků je to tak, že pro zobrazení článku máme obecnou routu:

$router[] = new Route('[<url>]', 'Core:Article:default');

Ta vybere akci "default" ve třídě ArticlePresenter a předá jí do parametru konkrétní URL, chtěného článku, nebo null, pokud se jedná o úvodní stránku. Takhle je to prostě v tomto seriálu naprogramované.

Takže, abych odpověděl na Tvojí otázku. Výběr šablony by se v ideálním případě měl provádět před samotným renderováním, ale na druhou stranu, pokud se změní až na začátku renderování, tak se taky nic neděje. :) Takže kód zvolené metody renderDefault() vypadá tedy následovně:

public function renderDefault($url)
{
        if (!$url) $url = self::DEFAULT_ARTICLE_URL; // Pokud není zadaná URL, vykreslí se výchozí článek.
        // Pokusí se načíst článek s danou URL a pokud nebude nalezen, vyhodí chybu 404.
        if (!($article = $this->articleManager->getArticle($url))) throw new BadRequestException();
        $this->template->article = $article; // Předá článek do šablony.
}

Tady je vidět, že pokud není zadaná žádná URL, automaticky se vybírá úvodní článek. Teď už stačí jenom tuhle podmínku předělat, aby se místo toho použila úplně jiná šablona s jiným obsahem. ;)

Může se zde aplikovat třeba stejný postup jako u komponent a vypadat to může např. takto:

public function renderDefault($url)
{
        if (!$url or $url == self::DEFAULT_ARTICLE_URL) {
                // Nastavení jiné šablony.
                $this->template->setFile(__DIR__ . "/../templates/Article/uvod.latte");
                // Předávání dat do šablony funguje standardním způsobem.
                // $this->template->...
        } else {
                // Pokusí se načíst článek s danou URL a pokud nebude nalezen, vyhodí chybu 404.
                if (!($article = $this->articleManager->getArticle($url))) throw new BadRequestException();
                $this->template->article = $article; // Předá článek do šablony.
        }
}

Doufám, že takhle už je vše jasné. :)

 
Odpovědět
13.10.2016 14:11
Avatar
danhosek
Člen
Avatar
danhosek:13.10.2016 14:49

trochu jsem metodu render default upravil, a už je to funkční. Děkuji za podrobné vysvětlení. Hlavně by mě nenapadlo $this->template->setFile. Něco takového jsem měl namysli, ale nevěděl jsem jak na to. Děkuji.

public function renderDefault($url)
{
if (!$url or $url == self::DEFAULT_ARTICLE_URL){
    $url = self::DEFAULT_ARTICLE_URL;
    $this->template->setFile(__DIR__ . "/../templates/Article/uvod.latte");
} // Pokud není zadaná URL, vykreslí se výchozí článek.
        // Pokusí se načíst článek s danou URL a pokud nebude nalezen, vyhodí chybu 404.
        if (!($article = $this->articleManager->getArticle($url))) throw new BadRequestException();

        $this->template->article = $article; // Předá článek do šablony.
}
 
Odpovědět
13.10.2016 14:49
Avatar
danhosek
Člen
Avatar
danhosek:16.10.2016 0:03

Ahoj, na localhostu projekt perfektně funguje, ale nejde mi vložit na webhosting od wedos. Pročetl jsem diskuzi a vím, že jsem to kdysi řešil a poučil jsem se a opravil některé chybky, ale dnes je to nefunkční a server error 500.
config.loval.neon:

database:
dsn: 'mysql:host=wm87.wedos.net;port=3306;dbname=XXXX'
user: 'XXXXX'
password: 'XXXXX'
options:
lazy: yes

LOG:
exception:

Found sections 'dsn', 'user', 'password', 'options', 'lazy' in configuration, but
corresponding extensions are missing.

Source file

Call stack

.../vendor/nette/di/src/DI/Compiler.php:139     source  Nette\DI\Compiler->     processExtensions ()

.../vendor/nette/bootstrap/src/Bootstrap/Configurator.php:268   source  Nette\DI\Compiler->     compile ()

inner-code      Nette\Configurator->    generateContainer (arguments)

.../vendor/nette/di/src/DI/ContainerLoader.php:113      source  call_user_func_array (arguments)

.../vendor/nette/di/src/DI/ContainerLoader.php:78       source  Nette\DI\ContainerLoader->      generate (arguments)

.../vendor/nette/di/src/DI/ContainerLoader.php:43       source  Nette\DI\ContainerLoader->      loadFile (arguments)

.../vendor/nette/bootstrap/src/Bootstrap/Configurator.php:222   source  Nette\DI\ContainerLoader->      load (arguments)

.../app/bootstrap.php:19        source  Nette\Configurator->    createContainer ()

 9:
10:    $configurator->setTempDirectory(__DIR__ . '/../temp');
11:
12:    $configurator->createRobotLoader()
13:        ->addDirectory(__DIR__)
14:        ->register();
15:
16:    $configurator->addConfig(__DIR__ . '/config/config.neon');
17:    $configurator->addConfig(__DIR__ . '/config/config.local.neon');
18:
19:    $container = $configurator->createContainer();
20:
21:    return $container;
22:
.../www/index.php:6     source  require (arguments)

po vyhledání chyby na google mi vyskočilo, že byl přechod na nové připojování na db, ale když je sandbox z tohoto projektu, tak by mělo být nastavení dle starých parametrů že?
Děkuji za pomoc a zkušenosti.

Editováno 16.10.2016 0:05
 
Odpovědět
16.10.2016 0:03
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovídá na danhosek
Jindřich Máca:16.10.2016 0:24

To proto, že Ti chybí správné odsazení v config.local.ne­on... Na první pohled je to vidět i tady, že ty parametry 'dsn', 'user', 'password', 'options', 'lazy' nemáš odsazené. :D

 
Odpovědět
16.10.2016 0:24
Avatar
danhosek
Člen
Avatar
Odpovídá na Jindřich Máca
danhosek:16.10.2016 1:26

správné odsazení? jak má vypadat správné odsazení?
odentrování mezi parametry?

parameters:

    dbname: 'XXXXX' # název databáze

# Konfigurace databázové služby dále přístupné pomocí DI v rámci celé aplikace.
database:

dsn: 'mysql:host=wm87.wedos.net; port=3306; dbname=XXXX'

user: 'XXXXX'

password: 'XXXX'

options:

lazy: yes

takto to také nefunguje a vypisuje stejnou exception (Found sections 'dsn', 'user', 'password', 'options', 'lazy' in configuration, but corresponding extensions are missing.)
jakou rozšířenou konfiguraci to chce? nebo kde je tam konkrétně chyba?
děkuji.

Editováno 16.10.2016 1:27
 
Odpovědět
16.10.2016 1:26
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovídá na danhosek
Jindřich Máca:16.10.2016 1:40

Tak teď jsem se upřímně zasmál... :D Takhle jsem to odsazení myslel:

parameters:
    dbname: 'XXXXX' # název databáze

# Konfigurace databázové služby dále přístupné pomocí DI v rámci celé aplikace.
database:
        dsn: 'mysql:host=wm87.wedos.net;dbname=%dbname%'
        user: 'XXXXX'
        password: 'XXXX'
        options:
                lazy: yes

Žádnou další konfiguraci to nechce. Jde o to, že NEON je prostě citlivý na odsazení a pokud tam úplně chybí, jako v tomto případě, bere parametr dsn atd. jako část globálního nastavení, podobně jako např. services. Samozřejmě taková položka v globální nastavení není, takže to hází onu chybu. ;)

 
Odpovědět
16.10.2016 1:40
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 105.