Nezobrazuje se diakritika v URL

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

Ahoj, mám na webu vygenerovaný odkaz na

localhost/test/mista/kraj/Středočeský

který na localhostu funguje normálně, ale na ostrém hostingu (Active24 / WIN)
se v adresním řádku objeví

test.moje.cz/mista/kraj/Stedoesk

a samozřejmě se nevrátí žádné výsledky.
Kde je chyba, že ta diakritika zmizí?

kód routy:

<?php
$router[] = new NRoute('mista/<do kraj>/<district>', 'mista:default');
?>

edit: všecko je v utf-8

Editoval suxik (8. 5. 2012 10:44)

davidm
Člen | 81
+
0
-

proc tam mas tu diakritiku?? … prozen to pres Strings::webalize …

suxik
Člen | 62
+
0
-

protože potřebuju ty místa filtrovat podle kraje pomocí mysql, kde

<?php
district LIKE "stredocesky"
?>

nevrátí nic, je potřeba tam mít

<?php
district LIKE "středočeský"
?>
Jan Endel
Člen | 1016
+
0
-

Jednak se do databáze v tomhle případě ukládá i verze bez diakritiky a jednak než like je mnohem výkonnější použít na filtrování jeho unikátní id.

Jan Mikeš
Člen | 771
+
0
-

Btw pokud pouzijes v databazi kodovani utf8_general_ci/cs mistoutf8_czech_ci/cs tak ti to vrati zaznamy s diakritikou i kdyz v dotazu ji mit nebudes.

davidm
Člen | 81
+
0
-

Lexi napsal(a):

Btw pokud pouzijes v databazi kodovani utf8_general_ci/cs mistoutf8_czech_ci/cs tak ti to vrati zaznamy s diakritikou i kdyz v dotazu ji mit nebudes.

tak takove reseni bych vazne nedoporucoval …

spravne by jsi si mel ke kazdemu districtu vytvorit slug, kterej bude unique a podle toho zaznam vyhledavat

suxik
Člen | 62
+
0
-

to s tím utf8_general_ci jsem nevěděl, moc díky za nasměrování!

suxik
Člen | 62
+
0
-

davidm: jenže já tam mám pak taky filtr třeba na město a města nemám ve zvlášť tabulce jako ty kraje, takže slug mám jen u samotných míst (153-prodejna-albert), ale tady to právě musím řešit takhle debilně :/

uestla
Backer | 796
+
0
-

Tabulku krajů rozšiř o další sloupec, který plň slugy jednotlivých názvů krajů, tak jak ti poradil davidm.

suxik
Člen | 62
+
0
-

uestla a jak to mám vyřešit s těmi městy, když nejsou ve zvlášť tabulce? Navíc se těžko webalizují města s pomlčkou v názvu (resp. jejich převod zpět je nemožný), takže třeba pro

test.moje.cz/mista/mesto/Brno-Královo pole

to mám udělat jak? Říkám, na localhostu vše jede, jen na hostingu to nejede

Jan Tvrdík
Nette guru | 2595
+
0
-

suxik wrote:

Říkám, na localhostu vše jede, jen na hostingu to nejede

Kdybys uměl položit dotaz, už jsi dávno mohl mít odpověď. Bohužel já nežiji v kouzelném světě, kde se URL sami objevují v adresním řádku. Jak se tam to URL teda dostalo? Klikl jsi na odkaz? A kde se vzal ten odkaz? Napsal sis ho sám? Nechal sis ho vygenerovat? Jak vypadá vygenerovaný odkaz? Jak vypadá kód, kterým ho generuješ?

suxik
Člen | 62
+
0
-

Honzo, jestli máš potřebu vychovávat, tak si najdi jiný topic, jestli chceš poradit, tak napiš, co mám pastnout, routa je v prvním příspěvku, takže z ní je patrné, jak se generuje odkaz, explicitně to sem ještě připíšu, konkrétně pro filtrování podle města

šablona:

<?php
<a n:foreach="$places as $place" href="{link mesto!, $place->city}">
?>

presenter:

<?php
public function handleMesto($city) {
	$this->template->places = PlacesModel::getPlacesByCity($city)->fetchAll();
}
?>

řeším podobu url, která se na localhostu zonrazí s diakritikou správně (vygenerovaný odkaz), ale na hostingu zmizí znaky s diakritikou, takže LIKE dotaz v MySQL nenajde správná místa pro konkrétní město.

Editoval suxik (8. 5. 2012 13:23)

davidm
Člen | 81
+
0
-

@suxik Honza ma pravdu :)

kazdopadne muzes treba pridat do tabulky sloupec city_slug a potom neco jako …

<a n:href="mesto!, $place->city_slug">

public function handleMesto($city) {
        $this->template->places = PlacesModel::getPlacesByCitySlug($city)->fetchAll();
}

nejlepsi by samozrejme bylo mit na mesta samostatnou tabulku …

suxik
Člen | 62
+
0
-

no to mě napadlo, akorát tam je asi 1300 míst a ty slugy se mi vyrábět nechce, tak jsem zatím udělal workaround v podobě routy:

<?php
$router[] = new NRoute('mista/<do mesto>/<city>', array(
	'presenter' => 'mista',
	'action' => 'default',
	'city' => array(
		NRoute::FILTER_IN => callback("PlacesModel::getPlaceCityWebalized"),
		NRoute::FILTER_OUT => callback("PlacesModel::getPlaceCityDewebalized")
		),
	 )
);
?>

a metod:

<?php
public static function getPlaceCityWebalized($city) {
	$r = str_replace('-', ' ', $city);
	return str_replace('_', '-', $r);
}

public static function getPlaceCityDewebalized($city) {
	$city = BaseModel::removeDiacritics($city);
	$r = str_replace('-', '_', $city);
	return str_replace(' ', '-', $r);
}
?>

takže jsem se zbavil pomlček v názvech měst, ale je to prasečina :/

Editoval suxik (8. 5. 2012 13:31)

davidm
Člen | 81
+
0
-

Tohle snad nemůžeš ani myslet vážně … to je tak tezky pridat jeden sloupecek a automaticky ho vyplnit (pokud jsi programator a ne cvicena opice)??

suxik
Člen | 62
+
0
-

*sry ne 1300 ale 13000, no těžký by to nebylo, kdyby zákazník nebyl bfu a necpal tam tucty dalších znaků, který teď musím řešit, ale nechápu, když to podle tebe jde tak snadno automaticky, proč bych měl přidávat sloupeček do db a ne to dělat nějak přímo stylem, jak jsem naznačil? Vpodst. by to vyřešila revertovatelná webalizace

Jan Tvrdík
Nette guru | 2595
+
0
-

suxik wrote: routa je v prvním příspěvku, takže z ní je patrné, jak se generuje odkaz.

Mýlíš se. A jestli máš problém být vychováván, najdi si jiné fórum, děkuji.

Co ti vypíše:

$route = new NRoute('<city>', 'City:default');
$url = $route->constructUrl(
	new NPresenterRequest(
		'City',
		'get',
		array('city' => 'Prostějov')
	),
	new NUrl('http://example.com')
);

echo $url;
suxik
Člen | 62
+
0
-

pokud místo new NUrl myslíš new NUri tak vypíše

„http://example.com/Prost%C4%9Bjov“

Jan Tvrdík
Nette guru | 2595
+
0
-

suxik wrote: pokud místo new NUrl myslíš new NUri tak vypíše http://example.com/Prost%C4%9Bjov

Co máš za verzi Nette? V aktuální by mělo být NUrl. Pořád si nebyl schopen uvést, jaká URL ti to generuje do šablony.

Zkus nyní toto:

$route = new NRoute('mista/<do kraj>/<district>', 'mista:default');
$url = $route->constructUrl(
	new NPresenterRequest(
		'mista',
		'get',
		array('do' => 'kraj', 'district' => 'Středočeský')
	),
	new NUri('http://example.com')
);

echo $url; // expected: "http://example.com/mista/kraj/St%C5%99edo%C4%8Desk%C3%BD"
exit;
suxik
Člen | 62
+
0
-

tenhle web je ještě na 2.0 dev.

vypíše: „http://example.com/mista/kraj/St%C5%99edo%C4%8Desk%C3%BD“

nezlob se, já nejspíš nevím, na co se mě ptáš, do šablony mi to generuje url tak, jak je to úplně v prvním příspěvku, pokud myslíš tohle

Jan Tvrdík
Nette guru | 2595
+
0
-

suxik wrote: nezlob se, já nejspíš nevím, na co se mě ptáš, do šablony mi to generuje url tak, jak je to úplně v prvním příspěvku

Není. V prvním příspěvku je to, co vidíš v adresním řádku prohlížeče, v HTML by mělo být místo localhost/test/mista/kraj/Středočeský pravděpodobně localhost/test/mista/kraj/St%C5%99edo%C4%8Desk%C3%BD.

Router očividně funguje. Zkus tedy v presenteru

echo $this->link('kraj!', array('district' => 'Středočeský'));
echo $this->link('kraj!', array('Středočeský'));

Případně v šabloně

<a n:href="kraj!, 'Středočeský'}">Středočeský</a>
<a n:href="kraj!, 'district' => 'Středočeský'}">Středočeský</a>
suxik
Člen | 62
+
0
-

jo takhle, no v html je to samé:

/test/mista/kraj/Středočeský

výpis z obou echo je stejný: „/test/mista/kraj/Středočeský“

jinak kraje zwebalizuju, tam není problém, ten asi bude u těch měst, kde jsou znaky jako pomlčka, čárka atd., které se webalizovat sice dají, ale zpět už to nejde, víš, co myslím, ne?

Editoval suxik (8. 5. 2012 14:42)

Jan Tvrdík
Nette guru | 2595
+
0
-

Co ti vypíše

<a n:foreach="$places as $place" href="{link mesto!, $place->city}">

A co ti vypíše

<a n:foreach="$places as $place" href="{link mesto!, 'Prostějov'}">
suxik
Člen | 62
+
0
-

obojí se vygeneruje s diakritikou (html i adresa): „test/mista/mesto/Prostějov“

až když kliknu na ten název, že chci třídit místa v tom městě, tak ajaxový požadavek pošle název města a do handle metody dorazí „Prostjov“

Jan Tvrdík
Nette guru | 2595
+
0
-

Jak vypadá sestavený HTTP požadavek, který pošle prohlížeč ajaxem? Jak vypadá pak na serveru $_SERVER["REQUEST_URI"]?

suxik
Člen | 62
+
0
-

požadavek podle firebugu:

<?php
POST http://test.cz/mista/mesto/Ben%C3%A1tky%20nad%20Jizerou"
?>

a $_SERVER[„REQUEST_URI“] vrátí
„/mista/mesto/Ben�tky nad Jizerou“

a proměnná $city je naplněná:
„Bentky nad Jizerou“

ještě mě napadá, taky to ve firebugu píše chybu „payload is undefined“, ale na localu to jede i s ní…

Editoval suxik (8. 5. 2012 15:30)

suxik
Člen | 62
+
0
-

tak chybu jsem nenašel, nakonec jsem to vyřešil odstraněním všech znaků jako čárky, dvojtečky apod. v názvech měst v db a prasečí webalizací pomlček za podtržítka, mezer za pomlčky a zpět v routách. Jede to, ale SEO názvů s podtržítkama si nejsem jistej :/

ic
Člen | 430
+
0
-

suxik napsal(a):

… Jede to, ale SEO názvů s podtržítkama si nejsem jistej :/

2 slova spojená podtržítkem berou vyhledávače jako jedno

suxik
Člen | 62
+
0
-

ic dík, pořád přemýšlím, jak to jinak vyřešit, ale jiný řešení než slug asi není