Autor Zpráva
Ecrazit
Profil *
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
Ecrazit:
podívej se na funkci http://cz.php.net/manual/en/function.rawurldecode.php
Ecrazit
Profil *
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']*/);
Ale podle manuálu prej (The superglobals $_GET and $_REQUEST are already decoded. Using urldecode() on an element in $_GET or $_REQUEST could have unexpected and dangerous results.) už mají být při zpracovávání dekodovaný.
Ecrazit
Profil *
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 *
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
Ecrazit:
$_GET se přebírá právě z adresního řádku
Ecrazit
Profil *
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
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 *
Určitě ne, kódování mám všude stejný
Ugo
Profil
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 *
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
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 *
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>';
//...
?>
A v javascriptu pak změnit zonu vyhledávání:
/*12. řádek*/ var parts = window.location.search.substr(1).split('&');
na
var parts = document.getElementById('query_string_id').innerHTML.substr(1).split('&');
nebo místo innerHTML použít zase search, ale ten nevim co přesně umí. Tak toto mi teda připadá složitější než připsání 2 nebo jen 1 atributu.
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 *
Super, tak díky moc :) Takhle to funguje parádně :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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