Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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í.
Avatar
Benjibs
Člen
Avatar
Benjibs:25.12.2015 20:00

Zdravim,

snazim sa aby stranky mali pekne url, napr.: localhost/exam­ple/news/show/6
Ked vsak idem na takuto url, dostanem 404, router to nedokaze presmerovat na spravne miesto.

RouterFactory:

public static function createRouter()
{
        $router = new RouteList;
        $router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
        return $router;
}

Cast sablony s linkom:

<p> {$new->text|truncate:50:" ..."} <a n:if="strlen($new->text) > 50" n:href="News:show $new->id">>Zobraziť celý článok</a></p>

Presenter stranky, na ktoru sa neviem dostat:

<?php
namespace App\Presenters;

use Nette,
    Nette\Application\UI\Form;


class NewsPresenter extends BasePresenter
{
    /** @var Nette\Database\Context */
    private $database;

    public function __construct(Nette\Database\Context $database)
    {
        $this->database = $database;
    }

    public function renderShow($id)
    {
        $new = $this->database->table('news')->get($id);
        if (!$post) {
            $this->error('Post not found');
        }
        $this->template->new = $new;
    }
}

Prava na serveri su v poriadku, mod_rewrite zapnuty,
apache2, linux mint 17.2 64bit.

Ked zmenim v RouterFactory router na SimpleRouter, tak to funguje, take URL ale nechcem.

Viete niekto poradit?
Dakujem

Odpovědět
25.12.2015 20:00
1 + 1 = 2
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovídá na Benjibs
Jindřich Máca:25.12.2015 20:13

Tak první věc, kterou vidím je

if (!$post) {

, protože pokud tak koukám, tak proměnná $post je vždy null, jelikož není nikde deklarovaná, tudíž ta podmínka vždycky vyhodí 404. Jedinou záhadou tedy zůstává, jak to, že to ze SimpleRouter funguje. :D

 
Nahoru Odpovědět
25.12.2015 20:13
Avatar
Benjibs
Člen
Avatar
Odpovídá na Jindřich Máca
Benjibs:25.12.2015 20:19

Hop, to sa mi tam pred chvílou priludilo, problem to ale neriesi.
Cache cistim.

Editováno 25.12.2015 20:20
Nahoru Odpovědět
25.12.2015 20:19
1 + 1 = 2
Avatar
Dominik Gavrecký:25.12.2015 20:30

Prečo odkazuješ na HomepagePresenter presenter ked router chces nastaviť u NewsPresenter ?

Nahoru Odpovědět
25.12.2015 20:30
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovídá na Dominik Gavrecký
Jindřich Máca:25.12.2015 22:13

To udává adresu, kam se přesměruje výchozí stránka tj. v tomto konkrétním případě /localhost/exam­ple/. V tom problém určitě není. :)

 
Nahoru Odpovědět
25.12.2015 22:13
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovídá na Benjibs
Jindřich Máca:25.12.2015 22:35

Nejdřív začnu trochu obecně. Asi nejlepší způsob, jak debuggovat routování URL v Nette je začít u laděnky (Tracy) pro konkrétní adresu. Ta totiž přesně udává, jak se ona konkrétní adresa aktuálně routuje, což člověku samo o sobě dost napoví. ;)

A teď ke konkrétní situaci. Já osobně se domnívám, že tady je problém přímo v té URL, protože SimpleRouter, bere tu adresu trochu jinak (obecněji), zato RouteList je o dost striktnější. Nejlepší bude vysvětlení na konkrétním případu:

  • Adresa, kterou tam zadáváš (a chceš) je localhost/exam­ple/news/show/6.
  • Tvůj router je nastaven na <presenter>/<ac­tion>[/<id>].
  • To se ale bere jako kompletní adresa, tudíž, když se na to podíváš takhle pod sebou, tak adresa, kterou to překládá je localhost/new­s<presenter>/show<ac­tion>/6<id> a tady už je jasné, že je něco špatně. ;)

Jestli je to opravdu tento problém otestuješ jednoduše tak, že tu routu upravíš na

example/<presenter>/<action>[/<id>]

a ono to začne fungovat. :D Potom samozřejmě na serveru nic jako "example" nebude, takže se to musí ještě trochu odladit, ale pro otestování a pochopení problému tohle stačí. ;)

Doufám, že jsem to vyjádřil dost srozumitelně, když tak sem pak napiš, jak to dopadlo a případné dotazy. :)

Editováno 25.12.2015 22:36
 
Nahoru Odpovědět
25.12.2015 22:35
Avatar
Benjibs
Člen
Avatar
Odpovídá na Jindřich Máca
Benjibs:26.12.2015 18:10

Tiez nefunguje

Nahoru Odpovědět
26.12.2015 18:10
1 + 1 = 2
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovídá na Benjibs
Jindřich Máca:26.12.2015 18:40

No a co Ti tedy píše ta laděnka? :)

 
Nahoru Odpovědět
26.12.2015 18:40
Avatar
Benjibs
Člen
Avatar
Odpovídá na Jindřich Máca
Benjibs:26.12.2015 18:52

Tracy k dispozicii na tej chybnej stranke nemam, 404 je priamo od Apache.

Nahoru Odpovědět
26.12.2015 18:52
1 + 1 = 2
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovídá na Benjibs
Jindřich Máca:26.12.2015 19:11

Tak ale pravděpodobně není chyba ve směrování Nette, ale ve směrování Apache (pořád nevysvětluje funkčnost SimpleRouter :D) nebo máš špatně nastavené odchytávání chyb v Nette. Každopádně, když není k dispozici laděnka a je to chyba od Apache, je potřeba jít ručně po stopách toho směrování. Normálně bych Tě nechal hodit sem výpis směrování toho požadavku (např. pomocí tracepath), ale tady si troufnu to odhadnout a dám sem seznam věcí, které by to chtělo zkontrolovat:

  • Předpokládám, že máš tedy správně nastavenou webovou složku Apache (např. /var/www/...) a v ní složku example/, kam jsi vložil Nette sandbox. Jen ze zeptám, jestli si ho stahoval a kopíroval nebo sestavoval pomocí composer?
  • V té složce example/ by jsi pak měl mít .htaccess, který vše směruje do Nette složky www/. Může vypadat třeba takto:
<IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteRule ^$ www/ [L]
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_URI} !^www/
        RewriteRule ^(.*)$ www/$1
</IfModule>
  • Předpokládám, že v té složce www/ jsi nic neměl a obsahuje vlastní .htaccess atd.

Je tohle všechno v pořádku? :)

 
Nahoru Odpovědět
26.12.2015 19:11
Avatar
Benjibs
Člen
Avatar
Odpovídá na Jindřich Máca
Benjibs:26.12.2015 19:48

v zlozke example nemam ziadny .htaccess, nette to napriek tomu do www smerovat zvlada.
Vo www je tento:

# Apache configuration file (see httpd.apache.org/docs/current/mod/quickreference.html)

# disable directory listing
<IfModule mod_autoindex.c>
        Options -Indexes
</IfModule>

# enable cool URL
<IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteBase /var/www/html/example/www/

        # prevents files starting with dot to be viewed by browser
        RewriteRule /\.|^\. - [F]

        # front controller
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz|map)$ index.php [L]
</IfModule>

# enable gzip compression
<IfModule mod_deflate.c>
        <IfModule mod_filter.c>
                AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/json application/xml image/svg+xml
        </IfModule>
</IfModule>
Editováno 26.12.2015 19:48
Nahoru Odpovědět
26.12.2015 19:48
1 + 1 = 2
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovídá na Benjibs
Jindřich Máca:26.12.2015 19:56

Jak Nette to směrovat zvládá? Vždyť dostáváš 404 od Apache, takže zvládá možná něco, ale rozhodně je tam něco špatně. :D

 
Nahoru Odpovědět
26.12.2015 19:56
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 12 zpráv z 12.