Autor | Zpráva | ||
---|---|---|---|
Ecrazit Profil * |
#1 · Zasláno: 4. 3. 2012, 19:33:47
Zdravím, snažím se na stránkách využít vlastní vyhledávač od google
http://www.google.com/cse/?hl=cs Je tam možnost si nakonfigurovat vlastní vzhled formuláře pro zadávání vyhledavaného slova, jenže ani jeden ten vzhled mi nevyhovuje... Jejich řešení se vkládá pomocí javascriptu, takže si pole fomuláře nemůžu sám nastylovat. Snažím se proto vytvořit vlastní formulář. Jejich řešení funguje tak, že po odeslání formuláře se to odešlě na mnou zvolenou stránku, v mém případě ...index.php?strana=hledat&q=hledané_slovo Jediné, co to potřebuje k práci je proměnná "q". Když si ale vytvořím vlastní formulář, který mi vytvoří to samé url, tak už v něm ale nedokáže odeslat diakritiku. Respektive pošlu hledaný výraz "smažená ryba". Formulář od googlu vytvoří url ......&q=smažená ryba, můj formulář vytvoří ......&q=sma%9Een%E1+ryba a s tím už si google nedokáže poradit. Potřeboval bych tohle nějak vyřešit, aby to předávalo i tu diakritiku... Odstranění diakritiky před odesláním formuláře pro mě není řešením. Kódování stránky cp-1250. Předem díky |
||
Taps Profil |
#2 · Zasláno: 4. 3. 2012, 20:09:12
Ecrazit:
podívej se na funkci http://cz.php.net/manual/en/function.rawurldecode.php |
||
Ecrazit Profil * |
#3 · Zasláno: 4. 3. 2012, 20:54:57
A tohle použiju jak? Po tom co odešlu hledaný text v url, tak na získanou proměnnou použiju tuhle funkci? Už jsem to totiž zkoušel a nešlo mi to... Ten vyhledávač vůbec nereaguje na změny v té proměnné. Když třeba odešlu formulář s proměnnou q = ryba a ještě před scriptem vyhledávače udělám něco ve smyslu...
<?php $q = $_GET['q']; $q = 'kapr'; ?> ... tak vyhledávač stále pracuje s původní hodnotou proměnné q, tedy "ryba"... |
||
DarkMeni Profil |
Tahá to z $q nebo $_GET['q']? Jestli z $_GET['q'] tak pak to chce přepsat proměnnou $_GET s indexem q:
$_GET['q'] = urldecode(/*simulace vstupu z odkazu ->*/urlencode('smažená ryba')/*$_GET['q']*/); |
||
Ecrazit Profil * |
#5 · Zasláno: 4. 3. 2012, 21:07:25 · Upravil/a: Ecrazit
Takhle jsem to samozřejmě taky zkoušel. Dekódovaný asi budou, protože když předám přes url diakritiku a pak jen tu proměnnou vypíšu, tak je rozkódovaná...
Nevím skoro nic o javascriptu, ale napadá mě jedině to, že by to ten JS kód, který to celé obstarává četl kód přímo z adrsního řádku a proto jsou změny v php ignorovány. Tady je kód toho JS. <div id="cse" style="width: 100%;">Loading</div> <script src="http://www.google.com/jsapi" type="text/javascript"></script> <script type="text/javascript"> google.load('search', '1', {language : 'cs', style : google.loader.themes.GREENSKY}); google.setOnLoadCallback(function() { var customSearchOptions = {}; var customSearchControl = new google.search.CustomSearchControl( '010547273124972567094:quvqjfcbbxi', customSearchOptions); customSearchControl.setResultSetSize(google.search.Search.FILTERED_CSE_RESULTSET); customSearchControl.draw('cse'); function parseParamsFromUrl() { var params = {}; var parts = window.location.search.substr(1).split('&'); for (var i = 0; i < parts.length; i++) { var keyValuePair = parts[i].split('='); var key = decodeURIComponent(keyValuePair[0]); params[key] = keyValuePair[1] ? decodeURIComponent(keyValuePair[1].replace(/\+/g, ' ')) : keyValuePair[1]; } return params; } var urlParams = parseParamsFromUrl(); var queryParamName = "q"; if (urlParams[queryParamName]) { customSearchControl.execute(urlParams[queryParamName], null, {'oq': urlParams['oq'], 'aq': urlParams['aq'], 'aqi': urlParams['aqi'], 'aql': urlParams['aql'], 'gs_sm': urlParams['gs_sm'], 'gs_upl': urlParams['gs_upl']}); } }, true); </script> Když si to teď čtu, tak to v tom JS vidím... ovšem netuším, kde udělat změnu... |
||
DarkMeni Profil |
Jo, čte to z adresního řádku (12 řádek skriptu).
sma%9Een%E1+ryba je prej rozbitá / špatná URI sekvence (pořád by se asi převáděly znaky do nekonečna -> %9 = %259 = %9 = %259 = %9... asi tak nějak, tak to ta funkce nechává tak, jak to je). Bude to mít něco společného s kodováním, v utf-8 se mi smažená ryba funkcí encodeURI převede úplně jinak než je tady v ukázce, mají soubory s formulářem a soubor na zpracování toho formuláře (kde je i tenhle javascriptový skript) stejné kódování? |
||
Ecrazit Profil * |
#7 · Zasláno: 4. 3. 2012, 22:05:27
Obojí je v cp-1250... nešlo by to třeba předělat, aby to nečetlo z adresního řádku, ale z php pole $_GET?
|
||
Taps Profil |
#8 · Zasláno: 4. 3. 2012, 22:10:17
Ecrazit:
$_GET se přebírá právě z adresního řádku |
||
Ecrazit Profil * |
#9 · Zasláno: 4. 3. 2012, 22:17:18
Jasně, ale tady jde o to, že php ji přijme již rozkódovanou, kdežto JS ji přijme s těmi zástupnými znaky a pak to nefunguje...
|
||
DarkMeni Profil |
#10 · Zasláno: 4. 3. 2012, 22:20:19
Neni možný že by v php byl třeba header('content-type: text/html;charset=cp-1250'); ale ve vygenerovaném html pak <meta http-equiv="content-type" content="text/html; charset=jiný kodování">, nebo naopak? Jiný problém než dva různý kodování mě nenapadá.
|
||
Ecrazit Profil * |
#11 · Zasláno: 4. 3. 2012, 23:10:21
Určitě ne, kódování mám všude stejný
|
||
Ugo Profil |
#12 · Zasláno: 5. 3. 2012, 08:18:12
nevím jaká je kompatibilita a přesná fce, ale existuje formulářový atribut accept-charset a v javascriptu funkce encodeURI(), ale myslím že ani jedno nebude řešení - ovšem nechá se zkusit.
|
||
Ecrazit Profil * |
#13 · Zasláno: 5. 3. 2012, 12:43:48
Tenhle atribut nepomůže, používá se pokud je potřeba odesla tformulář v jiném kódování než stránka... navíc nefunguje v IE
|
||
DarkMeni Profil |
#14 · Zasláno: 5. 3. 2012, 17:46:19
Ecrazit:
„používá se pokud je potřeba odesla tformulář v jiném kódování než stránka“ Zkusil si ho použít? Po pokusu o převod (decodeURIComponentem) převedeného vstupu z cp-1250 mi to hází "malformed URI component", ale po tom atributu s převodem na utf-8 tak to fungovalo jak má. A (http://www.google.com/jsapi) je taky v kodování utf-8, tak zkus: <script charset="utf-8" src="http://www.google.com/jsapi" type="text/javascript"> a <form action="ten_soubor.php" method="get" accept-charset="utf-8"> myslim že to by mělo fungovat, aspoň v některých prohlížečích, ale to je pořád lepší než v žádným, ne? A jestli nezabere ani toto tak pak už mě napadá jedině zapsat hodnoty z odkazu do dokumentu a číst je z něj. Nebo dát stránky do utf-8 který je kompatibilní asi se vším, ale převod kódování je u velkých webů složitější než to čtení z dokumentu. |
||
Ecrazit Profil * |
#15 · Zasláno: 5. 3. 2012, 20:40:32
Tak jsem to tak udělal a funguje to, ale ne v IE. Oni by celé stránky do UTF-8 převést šli, ale dalo by to docela práci... hodně se tam pracuje s funkcemi pro práci s řetězci, takže tyhle funkce by se museli předělat pro podporu UTF-8.
Jinak jak by se v tom Javascriptu dalo udělat, aby to nečetlo z adresního řádku, ale z doukumentu jak píšeš? Zkoušel jsem to, ale nešlo mi to, JS bohužel neumím :( |
||
DarkMeni Profil |
V php souboru (ještě před odesláním klientovy) vypíšeš hodnoty z $_GET někam do dokumentu a skryješ to v něm (csskem -> display: none (ale to pak prej Opera nestahuje) ale asi spíš pro kompatibilitu i s Operou na visibility: hidden; owerflow: hidden; width: 0px; height: 0px;)
A v js upravíš aby to místo z adresy četl z toho elementu kterýmu dáš nějaký id: <?php //... skript echo 'stránka... <html><head>...'; //... echo '<div id="query_string_id" style="visibility: hidden;overflow: hidden;width: 0px; height: 0px;">', $_SERVER['QUERY_STRING']/*Nebo REQUEST_URI? To co vrací dotaz, to s ..."?promenna=hodnota"...*/, '</div>'; //... ?> /*12. řádek*/ var parts = window.location.search.substr(1).split('&'); var parts = document.getElementById('query_string_id').innerHTML.substr(1).split('&'); Když tam má být dynamické vyhledávání a on to po změně obsahu inputu, jestli tam nějaký je, přepíše v adresním řádku a pak zase spustí funkci parseParamsFromURI, ve který už nebude jako zona vyhledávání adresní řádek, ale element s nějakým id, tak to bude vypadat zaseknutě. (ale nevim jak má fungovat tvoje vyhledávání, taky na to de nasadit nějaký odposlouchávače aby to po změně v adrese změnili i v dokumentu, nebo po prvním projetí funkce přepsat zonu vyhledávání, záleží na tom jestli tam bude dynamické vyhledávání nebo ne - jako klasický google, bez refreshu to při psaní už nabízí hned výsledky). |
||
Ecrazit Profil * |
#17 · Zasláno: 5. 3. 2012, 22:10:06
Super, tak díky moc :) Takhle to funguje parádně :)
|
||
Časová prodleva: 12 let
|
0