Autor Zpráva
janbarasek
Profil
Ahoj,

dělám novou verzi vyhledávacího webu, kde používám tzv. "Cool URL" za pomoci routerování v Nette.

Rád bych měl adresu s výsledky v tomto stylu:
doména.cz/search/dotaz

Když hledám například dotaz [funkce], tak URL vypadá takto:
doména.cz/search/funkce
Což je super kvůli SEO (výsledky hledání jsou opravdu kvalitní a proto jsem rád, že to roboti indexují).

Problém nastane v okamžiku, kdy zadám dotaz v tomto stylu: [2+5/3], pak URL vypadá takto:
doména.cz/search/2%2B5%2F3
A router mi do proměnné předá jenom 2+5 a zbytek ořízne, protože to pro něj je další parametr.

Získání dotazu z vyhledávacího pole, jeho přepis a přesměrování na stránku s výsledky hledání dělám v JavaScriptu, a to takto:
$('#search').submit(function(event) {
    event.preventDefault();
    window.location.href = $('base').attr('href')+'search/' + encodeURIComponent($('#q').val());
});

Napadá vás nějaké hezké řešení, jak dostat do adresy i lomítka a další speciální znaky, které může člověk naprosto přirozeně zadat (hlavně na matematickém webu)?

Předem děkuji za jakékoli nápady.
CZechBoY
Profil
Ukaz routu. V Nette dokumentaci je tusim i priklad jak do parametru zahrnout i lomitka.
janbarasek
Profil
CZechBoY:
Pokud vynechám routery, které s ukázkou nesouvisí, tak to vypadá takto:
<?php

namespace App;

use Nette;
use Nette\Application\Routers\RouteList;
use Nette\Application\Routers\Route;


class RouterFactory
{

    /**
     * @return Nette\Application\IRouter
     */
    public static function createRouter()
    {
        $router = new RouteList;
        
        // tady mám další routery, které nesouvisejí s problémem
        
        $router[] = new Route('search/<query>[/<category>]', 'Search:default');
        $router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
        return $router;
    }

}

Chci mít URL ve tvaru:
doména.cz/search/dotaz

A říkám na rovinu, že s Nette začínám a moc routerům nerozumím, takže to je napsané podle mého nejlepšího odhadu.
juriad
Profil
Ale vždyť tím přesně říkáš, že po <query> může následovat <category> oddělená lomítkem. Pokud je lomítko součástí hledaného výrazu bude se považovat za oddělovač kategorie. Máš prostě blbě navrženou strukturu routy searche.

To jak dovolit lomítku být součástí parametru je skutečně v dokumentaci: doc.nette.org/en/2.3/routing#toc-validation-expressions
CZechBoY
Profil
Tak zkus
$router[] = new Route('search/<query .+>');
Pokud tu kategorii nepotrebujes.
janbarasek
Profil
CZechBoY:
Děkuji, tvé řešení funguje například pro:
/search/2+3/2

Ale toto už ne:
/search/2%2B5%2F3

Druhý příklad vrací chybu:
Objekt nenalezen!

Požadované URL nebylo na tomto serveru nalezeno. Zdá se, že odkaz na odkazující stránce je chybný nebo zastaralý. Informujte, prosím, autora této stránky o chybě.
Pokud si myslíte, že toto je chyba serveru, kontaktujte, prosím, webmastera.

Error 404


Nebude to způsobené tím escapováním? Kdybych escapování neprovedl, jak do URL pošlu speciální znaky, které může uživatel hledat?
Zatím jsem to vyřešil tak, že jsem v JS přidal tento řádek:
window.location.href = $('base').attr('href')+'search/' + encodeURIComponent($('#q').val()).replace('%2F', '/');

Asi to není ideální, ale zatím jsem nenašel příklad, pro který by to nefungovalo.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: