URL z databazy a clanky mam v presenteri

Tomas8698
Člen | 109
+
0
-

Zdravim, chcem sa opytat ze ako postupovat neviem sa pohnut ,članky mam uložene v presentery nie v databaze a informacie pre URL mam v databaze a potreboval by som to prepojit aby my po kliknuti na link otvorilo stranku s prislusnym clankom a tak isty udaj by bol zobrany z databazy urlseo a zapisany v URL prislusnej stranky( mam dve jazykove verzie).
Som zaciatocnik a za pomoc dakujem.

dakur
Člen | 493
+
0
-

@Tomas8698 Tomu propojení moc nerozumím, ale pokud máš na mysli to, že chceš na bázi nějakého parametru v routeru (urlSeo) renderovat statický obsah ze šablony, jde to nějak takto:

public function renderDefault(string $urlSeo): void
{
  $template = $this->getTemplate();
  if (Strings::contains('..', $urlSeo)) {
    $this->error(); // ošetření nežádoucích vstupů -> e404
  }

  $filePath = __DIR__ . '/cesta-k-sablonam/' . $urlSeo . '.latte';
  if ( ! is_file($filePath) {
    $this->error();
  }

  $template->setFile($filePath);
}
Tomas8698
Člen | 109
+
0
-

Dakujem @dakur za odpoved, vyskusam to.
Tam vlastne mam v databaze stlpec urlseo a mam viac podstranok v dvoch jazykoch. Podstranky ulozene riadne v presenteri a po kliknuti na podstranku aby do routy pridalo adresu z urlseo k prislusnemu presenteru.

Databaza vyzera takto:

<?php

CREATE TABLE `articles` (
  `id` int(11) NOT NULL,
  `urlseo` varchar(256) COLLATE utf8mb4_unicode_ci NOT NULL,
  `active` tinyint(1) NOT NULL,
  `title` varchar(256) COLLATE utf8mb4_unicode_ci NOT NULL,
  `uuid` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `description` varchar(1024) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `keywords` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `ogimage` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `titleshort` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `rsstext` varchar(1024) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `locale` char(5) COLLATE utf8mb4_czech_ci NOT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

?>
Tomas8698
Člen | 109
+
0
-

@dakur Da sa to spravit tak aby my to url rozdelovalo podla jazyka? Ze som na sk stranke a po kliknuti na link( v linku si preposlem v premenej $locale jazyk) a na zaklade toho mi bude zobrazovat adresu v url podla prislusneho jazyka(jazyk mam v db a aj urlseo, aby mi podla toho vybralo). A este jedna otazka mam 5 podstranok okrem hlavnej v renderDefault() mam nastavenia ako si my poslal. Ci spravit takto ako mam tu hlavnu aj dalsie alebo sa to nejak inak robi? Mozem poslat aj ako vyzera kod.

dakur
Člen | 493
+
0
-

@Tomas8698 Spravit sa da vsetko, ale pomůže tomu, když budeš psát trochu čitelněji (s interpunkcí) a uspořádaněji (v jednu chvíli řeším jeden problém, píšu dost konkrétních informací k tomu, aby druhá strana mou problematiku pochopila, ale zase ne tolik, abych ji nezahltil zbytečnými detaily).

Nicméně pokud chceš vytvořit link, který v sobě má locale, tak musíš udělat tři věci:

  • upravit routu, aby pracovala s locale (např. /<urlseo>/<locale>/<urlseo>)
  • upravit cílový presenter, aby přijímal $locale (např. actionDefault(string $urlseo) → actionDefault(string $locale, string $urlseo)
  • upravit ten link, o kterém mluvíš, tj. jeho generování v šabloně či presenteru, aby se mu předával locale (např. {link Article:default, urlseo => $article->urlseo}{link Article:default, locale => $article->locale, urlseo => $article->urlseo})
Tomas8698
Člen | 109
+
0
-

Ďakujem pekne,
Chcem sa ešte spýtať, mam skoleni:default, poradentsviAnalyza:default. Ze ci to bude tak fungovať ze action:default bude otvárať podstranky alebo ten action:default nahradiť mojimi podstrankami napr. skoleni:default
Ďakujem za odpoveď

Tomas8698
Člen | 109
+
0
-

*Article:default

dakur
Člen | 493
+
0
-

@Tomas8698 Pokud skoleni a poradentsviAnalyza je to, co je v urlseo, pak stačí jen jedna action, tj. actionDefault(), protože ta informace o tom, která šablona se má načíst, je schovaná v tom argumentu $urlseo:

public function actionDefault(string $locale, string $urlseo)
{
  // teď vím, jakou načíst šablonu a jakého jazyka, takže nepotřebuju žádnou další action
}
Tomas8698
Člen | 109
+
0
-

Áno v urlseo mam školení a poradenstvi(pošlem aj databazu). A upraviť aj link, ktorým sa z hlavnej podstranky dostávam tam myslím to urlseo
urlseo ⇒ $article->urlseo}. Ako bude vedieť ze ktorý link tam chcem. Treba to nejak nastaviť v presenteri?

dakur
Člen | 493
+
0
-

Máš presenter (třeba ArticlePresenter), jehož účelem je vykreslit jeden článek ze šablony. Proto, aby ten presenter věděl, kterou šablonu vzít, potřebuje mít dva údaje – jazyk (locale) a název článku (urlseo).

Pak máš presenter (např. HomepagePresenter), který ti vykresluje odkazy na články (ať už formou odkazů, dlaždic nebo čehokoliv jiného), tzn. že ti vygeneruje tolik odkazů, kolik máš článků (nebo kolik mu řekneš) a každý ten odkaz bude vést na ArticlePresenter a jako parametry tomu dá údaje o tom konkrétním článku – tzn. u každého mu předá locale a urlseo.

HomepagePresenter.php – v něm si vytáhnu články a předám do šablony

class HomepagePresenter
{
  public function renderDefault()
  {
    $this->template->articles = $this->db->findBy(['locale' => 'cs']);
  }
}

HomepagePresenter.latte – zde mám odkazy na jednotlivé články, u každého předávám jako parametr localeurlseo

{foreach $articles as $article}
<a href="{link Article:default, locale => $article->locale, urlseo => $article->urlseo}">přečíst článek</a>
{/foreach}

ArticlePresenter.php – vytáhnu si požadovaný článek z DB a předám do šablony

class ArticlePresenter
{
  public function renderDefault(string $locale, string $urlseo)
  {
    $this->template->article = $this->db->findOneBy(['locale' => $locale, 'urlseo' => $urlseo]);
  }
}

ArticlePresenter.latte – vykreslím konkrétní článek

<h1>{$article->title}</h1>
{$article->content}

(Uvedený kód ukazuje princip, není to funkční kód, např. nevím, jakou používáš knihovnu pro práci s DB, tak jsem to napsal po svojemu.)

Tomas8698
Člen | 109
+
0
-

Ja mam články v presenteroch nie v databaze. V databaze mam id,urlseo,a údaje pre meta tagy. Da sa to spraviť tak žeby zapísalo do url(do linku) udaj z db( z urlseo) a vybralo konkrétnu šablónu? Ide o to ze to nie sú články ale je to cela podstranka. Pošlem foto lebo ťažko sa to vysvetľuje.

dakur
Člen | 493
+
0
-

@Tomas8698 Jo, na to jsem zapomněl, ale psal jsem to nahoře (https://forum.nette.org/…v-presenteri#…), takže jen vyměníš kód pro article presenter:

ArticlePresenter.php – načtu požadovanou šablonu

class ArticlePresenter
{
  public function renderDefault(string $locale, string $urlseo)
  {
//   $this->template->article = $this->db->findOneBy(['locale' => $locale, 'urlseo' => $urlseo]);
// místo DB 🔼 prostě sestavím cestu k souboru a nastavím jako view 🔽
    $template = $this->getTemplate();
    if (Strings::contains('..', $locale) || Strings::contains('..', $urlseo)) {
        $this->error(); // ošetření nežádoucích vstupů -> e404
    }

    $filePath = __DIR__ . '/cesta-k-sablonam/' . $locale . '/'  . $urlseo . '.latte';
    if ( ! is_file($filePath) {
        $this->error();
    }

      $template->setFile($filePath);
    }
}

A ArticlePresenter.latte tímpádem nebude, to jsou ty jednotlivé šablony s články.

Je to prostě skládačka. Každý kus kódu máš nějakou svoji jednu zodpovědnost a tyto kusy skládáš k sobě/za sebe. Je důležité si proto uvědomit, co který kus má za úkol a jak ty části spolu spouvisí.

Tomas8698
Člen | 109
+
0
-

Moja databaza vyzera takto :

<?php
INSERT INTO `articles` (`id`, `urlseo`, `active`, `title`, `uuid`, `description`, `keywords`, `ogimage`, `titleshort`, `rsstext`, `locale`) VALUES
(0, 'domu', 1, 'Správa serverů, vývoj software, IoT, školení, konzultace a analýzy', 'bae34b31-ad49-4444-9bf7-805e513d30f6', 'Správa serverů, vývoj software, IoT, školení, konzultace a analýzy', 'programování, vývoj, software hardware, SEO, linux, server,admin,  konzultant, marketing', 'header.jpg', 'Bc. Josef Jebavý - správa serverů, vývoj software, IoT, školení, konzultace a analýzy', ' ', 'cs'),
(1, 'home', 1, 'Software and hardware custom development, server management, consulting and analysis', 'b63ccd80-a77b-4cdc-9936-a5479e2c080d ', 'Software and hardware custom development, IoT, consulting and analysis', 'programming, development, software, hardware, linux, server,admin, IoT, SEO Consultant, Marketing', 'header.jpg', 'Bc. Josef Jebavý - development of software and hardware, server management, IoT, consulting and analysis', ' ', 'en'),
(2, 'jak-zahajit-spolupraci', 1, 'Zahájení spolupráce', '557b4574-a667-4cbd-a3b3-ca62dc9d5568 ', 'Zahájení spolupráce', 'spolupráce, převzetí projektu, programování, správa serverů', 'logo-xeres.cz-250x250.png', 'Zahájení spolupráce', ' ', 'cs'),
(3, 'how-to-start-cooperation', 1, 'How to get started cooperation and how I work', 'e41aca73-fc57-4fdb-87f8-7e6ccf747adc', 'How to get started cooperation and how I work', 'cooperation, programing, server administration, takeover of the project,', 'logo-xeres.cz-250x250.png', 'How to get started cooperation and how I work', ' ', 'en'),
?>

Spravil som novy ArticlePresenter.php a do nho pridal renderDefault() :

<?php
 /** @var Context @inject */
    public $article;

    public function renderDefault(string $locale, string $urlseo): void
    {
        $this->template = $this->article->findOneBy(['locale' => $locale, 'urlseo' => $urlseo]);

//   $this->template->article = $this->db->findOneBy(['locale' => $locale, 'urlseo' => $urlseo]);
// místo DB 🔼 prostě sestavím cestu k souboru a nastavím jako view 🔽
        $template = $this->getTemplate();
        if (Strings::contains('..', $locale) || Strings::contains('..', $urlseo)) {
            $this->error(); // ošetření nežádoucích vstupů -> e404
        }

        $filePath = __DIR__ . '/cesta-k-sablonam/' . $locale . '/'  . $urlseo . '.latte';


        $template->setFile($filePath);
    }
?>

A v HomepagePresenteri nechat to co si mi posielal vyssie alebo to pozmenit?

HomePagePresenter

<?php
/** @var Nette\Localization\ITranslator @inject */
    public $translator;
    public $langs = ['cs', 'en'];

    /** @var Context @inject */
    public $article;


    public function renderIndex(): void
    {

        $httpRequest = $this->getHttpRequest();
        $locale = $httpRequest->detectLanguage($this->langs);
        // bdump($locale);
        if (is_null($locale)) {
            $locale = "cs";
        }
        $this->redirect('Homepage:default', $locale);
    }

    public function renderDefault(string $locale): void
    {
        //TODO - nacitat jazyky z konfigurace
        $this->template->lang = $locale;
        $article = $this->article->table('articles')->where(['locale'=> $locale])->fetchAll();
        $this->template->article = $article;
    }
?>

A moj router este zatial vyzera takto :

<?php

$router = new RouteList;
        $router->addRoute('', "Homepage:index");
        $router->addRoute('[<locale= cs|en>/]<presenter>/<action>[/<id>]', "Homepage:default");
        $router->addRoute('[<locale= cs|en>/]<presenter>/<action>[/<id>]', "Article:default");
        $router->addRoute('[<locale= cs|en>/]<presenter>/<action>[/<id>]', "VyvojSoftware:default");
        $router->addRoute('[<locale= cs|en>/]<presenter>/<action>[/<id>]', "PoradenstviAnalyza:default");
        $router->addRoute('[<locale= cs|en>/]<presenter>/<action>[/<id>]', "SoftwareReseni:default");
        $router->addRoute('[<locale= cs|en>/]<presenter>/<action>[/<id>]', "Skoleni:default");
        $router->addRoute('sitemap.xml', 'Homepage:sitemap');
        return $router;
?>
dakur
Člen | 493
+
0
-

A v HomepagePresenteri nechat to co si mi posielal vyssie alebo to pozmenit?

No musíš to dát do sebe tak, aby to fungovalo. Pokud už tam máš funknčí kód, tak ho asi nebudeš nahrazovat za nefuknční, ne? Prosímtě, čteš ten kód, který ti píšu, a snažíš se ho vůbec pochopit? To přece není tak těžké porovnat, že když už máš:

public function renderDefault(string $locale): void
{
    //TODO - nacitat jazyky z konfigurace
    $this->template->lang = $locale;
    $article = $this->article->table('articles')->where(['locale'=> $locale])->fetchAll();
    $this->template->article = $article;
}

a já píšu:

public function renderDefault()
{
    $this->template->articles = $this->db->findBy(['locale' => 'cs']);
}

tak že tam necháš ten svůj, který funguje, protože to dělá cca to stejné. Můj ještě nemá tu funkcionalitu hledat články i podle locale, ale jestli to tam chceš, tak to nebudeš mazat.

Editoval dakur (2. 3. 2021 9:13)

Tomas8698
Člen | 109
+
0
-

A áno chcem hľadať a rozdeľovať podstranky podla locale. A dobre tak nechám. Ja len preto ze či na to idem správne. A ešte som sa chcel spýtať ze ci netreba pridať do linku kde kliknem a sa chcem dostať na konkrétnu podstranku. Ja ho mam tak ako si mi písal vyššie. No po kliknutí ma hodí na prázdny prezenter s chybovou hlaskou. Pridať priamu cestu aby mi otvorilo konkrétnu podstranku ( so správnym jazykom) a do url zapísalo locale/ a udaj z urlseo z databázy /skoleni
/localhost/8082/cs/skoleni

<?php
<a href="{link Article:default, locale => $article->locale, urlseo => $article->urlseo}">Skoleni</a>
?>
dakur
Člen | 493
+
0
-

A ešte som sa chcel spýtať ze ci netreba pridať do linku kde kliknem

Přidat do linku co?

No po kliknutí ma hodí na prázdny prezenter s chybovou hlaskou.

Ta chybová hláška ti nic nenapoví?

Pridať priamu cestu aby mi otvorilo konkrétnu podstranku ( so správnym jazykom) a do url zapísalo locale/ a udaj z urlseo z databázy /skoleni

Konkrétní podstránka je dána názvem presenteru, view a parametry. Tedy např. /cs/skoleni = Article presenter, default view, $locale a $urlseo. Router funguje tak, že pokud tomu zadáš {link Article:default, locale => cokoliv, urlseo => cokoliv}, tak ti vygeneruje /cs/skoleni a když přijdeš na URL /cs/skoleni, tak ti zavolá actionDefault() v presenteru ArticlePresenter a předá tomu parametry $locale a $urlseo. Ovšem za předpokladu, že máš v routeru masku s parametry <locale> a <urlseo>!

Teď ale koukám, že jestli tvůj router vypadá takto, tak se nemůžeš divit, že ti to nefunguje. To, co jsi tam napsal, jinými slovy znamená: adresu ve tvaru /cs/cokoliv/cokoliv převezme Homepage:default. O <locale> a <urlseo> nic. Doporučuju si přečíst v dokumentaci ještě raz o routeru, alespoň sekci Maska a parametry: https://doc.nette.org/…tion/routing#…

Editoval dakur (2. 3. 2021 10:39)

Tomas8698
Člen | 109
+
0
-

Ďakujem a radšej si to preštudujem poriadne, lebo to routovanie neviem. Ďakujem za vysvetlenie dosť veľa som sa naučil od teba @dakur a aj za trpezlivosť so mnou. Doma si to pokúšam a napíšem.

Tomas8698
Člen | 109
+
0
-

Upravil som router takto

<?php

$router = new RouteList;
        $router->addRoute('', "Homepage:index");
        $router->addRoute('[<locale= cs|en>/]<presenter>/<action>[/<id>]', "Homepage:default");
         $router->addRoute('sitemap.xml', 'Homepage:sitemap');
         $router->addRoute('/<locale= cs|en>/<urlseo>', 'Article:default');
        return $router;
?>
Tomas8698
Člen | 109
+
0
-

A ked som pochopil správne, tak budem mat vo folderi Article → subor → default.latte, ktoré bude výkreslovat podstranky na základe linku ktory pošlem, ze nebude to robiť v homepage ale Article, ktory s tým už dalej pracuje (myslím urlseo, locale)

dakur
Člen | 493
+
0
-

A ked som pochopil správne, tak budem mat vo folderi Article → subor → default.latte, ktoré bude výkreslovat podstranky na základe linku ktory pošlem

Nechápu, co je Article → subor → default.latte. Prostě budeš mít v Article složku se šablonama (tj. latte soubory) jednotlivých článů a ArticlePresenter, který bude na základě $locale a $urlseo rozhodovat, který z těch latte souborů se má načíst.

ze nebude to robiť v homepage ale Article, ktory s tým už dalej pracuje (myslím urlseo, locale)

Ano, Homepage presenter nemá co zajímat, jakým způsobem se vykreslí nějaký konkrétní článek, jeho zodpovědnost je vykreslit seznam všech článků a u každého vykreslit odkaz na konkrétní článek (tj. na ArticlePresenter) – tím to pro něj končí.
Naopak zodpovědnost Article presenteru je vykreslit jeden konkrétní článek podle toho, co mu přijde v $locale a $urlseo – a tím to pro něj končí.

Tomas8698
Člen | 109
+
0
-

Dobre super, ďakujem
A ešte jedna otázka ze do Article.latte mam dat napr. {include content} a v sablonach, ktoré po kliknutí na link chcem otvárať {block content}. Aby mi vykreslil konkretni obsah.

dakur
Člen | 493
+
0
-

Jak vypadá tvoje složka s šablonami? Jak vypadá jedna konkrétní šablona s článkem?

Tomas8698
Člen | 109
+
0
-

Pošlem obrázok jak budem na PC, lebo ja to mam ten obsah stránok v skoleni.latte,
poradenstvoAnalyza.latte v templatoch a su dvojjazyčné v ang a cz, Url mam v databaze v dvoch jazykoch, pošlem aj databázu.

dakur
Člen | 493
+
0
-

Aha, to jsi nějak zapomněl zmínit, že používáš translator. 🙂 Doteď jsem myslel, že budeš mít zvlášť šablonu pro český obsah a zvlášť pro anglický. V takovém případě se z $filePath opět odstraní $locale – tím se includne daná šablona. V šabloně pak budeš používat {_} macro jako to máš jinde – to už ti podle locale samo doplní český či anglický obsah.

Editoval dakur (5. 3. 2021 8:50)

dakur
Člen | 493
+
0
-

A čeho se vlastně snažíš docílit? Jak jsi nahoře uvedl svou databázi:

INSERT INTO `articles` (`id`, `urlseo`, `active`, `title`, `uuid`, `description`, `keywords`, `ogimage`, `titleshort`, `rsstext`, `locale`) VALUES
(0, 'domu', 1, 'Správa serverů, vývoj software, IoT, školení, konzultace a analýzy', 'bae34b31-ad49-4444-9bf7-805e513d30f6', 'Správa serverů, vývoj software, IoT, školení, konzultace a analýzy', 'programování, vývoj, software hardware, SEO, linux, server,admin,  konzultant, marketing', 'header.jpg', 'Bc. Josef Jebavý - správa serverů, vývoj software, IoT, školení, konzultace a analýzy', ' ', 'cs'),
(1, 'home', 1, 'Software and hardware custom development, server management, consulting and analysis', 'b63ccd80-a77b-4cdc-9936-a5479e2c080d ', 'Software and hardware custom development, IoT, consulting and analysis', 'programming, development, software, hardware, linux, server,admin, IoT, SEO Consultant, Marketing', 'header.jpg', 'Bc. Josef Jebavý - development of software and hardware, server management, IoT, consulting and analysis', ' ', 'en'),
(2, 'jak-zahajit-spolupraci', 1, 'Zahájení spolupráce', '557b4574-a667-4cbd-a3b3-ca62dc9d5568 ', 'Zahájení spolupráce', 'spolupráce, převzetí projektu, programování, správa serverů', 'logo-xeres.cz-250x250.png', 'Zahájení spolupráce', ' ', 'cs'),
(3, 'how-to-start-cooperation', 1, 'How to get started cooperation and how I work', 'e41aca73-fc57-4fdb-87f8-7e6ccf747adc', 'How to get started cooperation and how I work', 'cooperation, programing, server administration, takeover of the project,', 'logo-xeres.cz-250x250.png', 'How to get started cooperation and how I work', ' ', 'en'),

A ve složkách vidím např. jakZahajitSpolupraci.latte, tak nerozumím tomu, proč to máš potom v databázi? Nebo proč máš home v databázi? K čemu tu tabulku articles vlastně potřebuješ?

Editoval dakur (5. 3. 2021 8:55)

Tomas8698
Člen | 109
+
0
-

Ano to používam Contributte. A databázu chcem na urlseo aby mi do url podla jazyka vkladalo a potom aby som mohol do meta tagov vkladať :) , podla postranky a jazyka. A to neviem ci mam dobre to domu a home, ci by nebolo lepšie nechať prázdne lebo to ma byt to urlseo, ktoré chcem v url mat. A jak-zahajit-spolupraci(z databázy urlseo) co mam aj .latte, tak tam chcem aby keď som na ang stranke a prepnem sa na tu podstranku, aby v url bol ang názov co mam v urlseo v db: how-to-start-cooperation. A aj vymazať tie presenteri co sú tam navyše? Lebo teraz by to mal robiť ArticlePresenter vyberať šablóny.

Tomas8698
Člen | 109
+
0
-

Ďakujem @dakur 🙂
A filepath bude takto:

<?php

$filePath = __DIR__ . '/cesta-k-sablonam/' . $urlseo . '.latte';

?>
dakur
Člen | 493
+
0
-

Upřímně řečeno, osobně by mi dávalo smysl na tento typ obsahu použít WordPress či jiný redakční systém. Nette se k tomuto samozřejmě použít dá taky, ale není to úplně efektivní cesta (pokud to samozřejmě nemáš jako cvičení pro sebe 🙂).

Tomas8698
Člen | 109
+
0
-

🙂 Tak ano to je skor aby som sa naučil, ja pracujem momentálne ako elektrikár, tato a predošlá stránka je hlavne na nazbieranie skúsenosti aby som mohol časom pracovať v IT odvetví – web aplikácie, aby som sa naučil ako sa v tom pracuje a tak 🙂. Teraz sa hlásim tohto roku na VŠ externe štúdium popri praci.
Keď budem doma tak prerobím ten filepath, ,ešte ju budem prekladám dnes, zatial dakujem @dakur

Tomas8698
Člen | 109
+
0
-

Ďakujem @dakur funguje to super. Ešte som sa chcel spýtať jednu vec či by sa dala upraviť url aby bola krajšia teraz to mam takto: https://localhost:8082/cs/article/?… , je treba upraviť router aby bola taká https://localhost:8082/cs/skoleni

dakur
Člen | 493
+
0
-

@Tomas8698 A jak vypadá tvůj aktuální router?

Tomas8698
Člen | 109
+
0
-

Moj router vyzerá teraz takto:

<?php

public static function createRouter(): RouteList
	{
		$router = new RouteList;
        $router->addRoute('', "Homepage:index");
        $router->addRoute('[<locale= cs|en>/]<presenter>/<action>[/<id>]', "Homepage:default");
        $router->addRoute('sitemap.xml', 'Article:sitemap');
        $router->addRoute('/<locale= cs|en>/<urlseo>', 'Article:default');
        return $router;
	}
?>
dakur
Člen | 493
+
+1
-

@Tomas8698 To proto, že máš obecnější routu definovanou nad konkrétnější, takže to chytne ta obecná ještě dřív než dojde ke konkrétnější.

Když napíšeš v latte např. {link Article:default, locale => cs, urlseo => neco}, tak tím instruuješ router, že ti má z tohoto zápisu vygenerovat URL. On se koukne do definice rout (tj. ten tvůj RouteList v metodě createRouter()) a jde shora dolů a po každou routu zkouší, jestli na ni ty parametry sedí. Pokud ano, dál už nejde a vrátí tu první, která sedí. No a pro zápis {link Article:default, locale => cs, urlseo => neco} sedí i [<locale= cs|en>/]<presenter>/<action>[/<id>], takže podle toho předpisu vygeneruje URL a výsledkem je /cs/article/?urlseo=skoleni.

Řešením je tedy specifičtější <locale= cs|en>/<urlseo> předsunout před tu obecnou. Celkově po uspořádání asi nějak takto:

public static function createRouter(): RouteList
{
	$router = new RouteList;
    $router->addRoute('', "Homepage:index");
    $router->addRoute('sitemap.xml', 'Article:sitemap');
    $router->addRoute('<locale= cs|en>/<urlseo>', 'Article:default');
    $router->addRoute('[<locale= cs|en>/]<presenter>/<action>[/<id>]', "Homepage:default");
    return $router;
}

Jo a bacha, že jsi v té Article:default měl na začátku /, to taky mohlo souviset.

Editoval dakur (15. 3. 2021 15:08)

Tomas8698
Člen | 109
+
0
-

Super 🙂 vymenil som a odstranil lomitko a funguje to. Dakujem pekne @dakur . Ze tam ono našlo ako prvu routu <locale= cs<presenter>/<action>[/<id>] , ktorú chytilo ako prvú a aj mu sedela a podľa toho vygenerovalo url. Dakujem pekne

Tomas8698
Člen | 109
+
0
-

Este by som sa chcel spytat, mam opakujuci sa kod v kazdej podstranke ktora patri do Article. Opakuje sa mi tam {block meta} kde si vkladam meta tagy ktoré ma každa podstránka iné. Keď dam kod meta do všeobecnej Article.latte tak mi vypiše chybu ze mata tag nepozna ale ked si vypišem premenu $articl(varDump) dostavam tie informacie o meta tagov z databazy. Ked to bolo v kazdej podstranke tak to fungovalo, ak to dam do všeobecnej tak nechce.

Podstránka advice-analysis

<?php

{block meta}

    {block description} <meta name="description" content="{$articles[0]->description}"> {/block}
    {block keywords} <meta name="keywords" content="{$articles[0]->keywords}">  {/block}
    {block title} <title> {$articles[0]->title} </title> {/block}
    {block url}  <meta property="og:url" content="{$articles[0]->urlseo} " /> {/block}
    {block type}<meta property="og:type" content="website" /> {/block}
    {block titleshort} <meta property="og:titleshort" content="{$articles[0]->titleshort} " /> {/block}
    {block ogimage}  <meta property="og:image" content="https://www.josefjebavy.cz/{$articles[0]->ogimage}" /> {/block}

{/block}

{block content}

?>

To mam na začiatku každej podstránky a moja všeobecná vyzerá takto:
Article.latte

<?php

{block content}

?>

Moj kod vyzera takto : https://github.com/…ates/article

Editoval Tomas8698 (17. 3. 2021 9:01)

dakur
Člen | 493
+
0
-

@Tomas8698 Nevím přesně, co dělají dva {block}y zanořené do sebe, ale určitě to nebyl záměr. {block} ti má definovat něco, co chceš použít někde jinde, ale zvlášť description, keywords etc. někde jinde používat nechceš, jen dohromady. Dává tedy smysl mít {block meta}, ve kterém budou ty meta tagy, ale nebudou uzavřené do dalších {block}ů. Pokud pak použiješ v layoutu {include meta}, mělo by to fungovat.

tak mi vypiše chybu ze mata tag nepozna

Když sem napíšeš přesné znění chyby, bude se z toho lépe usuzovat, co se stalo a jaké je řešení.

Tomas8698
Člen | 109
+
0
-

Opravil som {block} ako si písal ale stále mi hlási chybu Cannot include undefined block ‚meta‘. Posielam aj obrázok a na obrázku je aj bDump kde si vypisujem údaje z databázy. Obrazok je na githube : https://github.com/…as/www/nette

Tomas8698
Člen | 109
+
0
-

A teraz ked som skusil zmeniť to čo vyberám z databázy za texty, že do description, keyswords som zapisal text(len na skusku), tak mi vypisovalo tu istú chybu. Môže byt problem že Article.latte nekomunikuje s layout.latte? V layout.latte mam {include block meta}

galab
Backer | 74
+
0
-

A není lepší třeba to udělat takto?
V @layout.latte

<meta name="description" content="{ifset description}{include description}{else}Základní description{/ifset}">

a pak v whatever.latte

{block description}{$articles[0]->description}{/block}
Tomas8698
Člen | 109
+
0
-

@galab Dakujem, vyskusam. Tam ono mi to fungovalo len mam tam asi 20 podstranok v article: https://github.com/…ates/article
A v kazdej som mal ten isty {block meta}, a ked to presuniem do article.latte (ktora mi vybera sablony), tak mi pise tu chybu co som pisal vyssie. Skusal som si to na podstranke advice-analysis kde mam vymazane {block meta}, vlastne sa snazim o to aby sa mi neopakoval kod.

Editoval Tomas8698 (21. 3. 2021 11:33)

galab
Backer | 74
+
0
-

Můžeš si to zjednodušit

layout.latte

<meta name="description" content="{ifset description}{include description}{else}Základní description{/ifset}">

ArticlePresenter

$this->template->articlePath = $urlseo . '.latte';

default.latte (v article adresáři)

{block content}{include $articlePath}{/block}
{block description}{$articles[0]->description}{/block}
...atd...

a v jednotlivých článcích už nemusíš dávat {block content}

Editoval galab (21. 3. 2021 12:01)

Tomas8698
Člen | 109
+
0
-

@galab Ďakujem pekne, tie meta tagy fungujú perfektne. A skúšal som si to zjednodušiť ako si písal lebo vyzerá to super, len teraz mi vykresľuje len text, keď odstránim {block content} zo šablón. https://github.com/…as/www/nette Ešte skúsim nájsť chybu lebo vyzerá to dobre.

galab
Backer | 74
+
0
-

cache vymazaná? jsem si to schválně rozběhal na localu a funguje to dobře

Tomas8698
Člen | 109
+
0
-

V tom co som uploadol som nechtial zabudol vymazat {block content} https://github.com/…alysis.latte ,ked to vymazem a pojdem na stranku advice-analysis tak mi vypise len text ako mam na obrazku vyssie

Editoval Tomas8698 (21. 3. 2021 16:24)