Autor Zpráva
DeeDeeX
Profil *
Zdravím všechny
Už druhý den řeším problém s našeptávačem zboží, a už z toho mám pocit, že řešení neexistuje. Zboží se má načítat z databáze.
Chci použít klasický autocomplete jQuery UI.
Krásně mi čte data z vektoru i z ručně zadaných json dat, ale když tam dám soubor, tak ani ťuk. Nejhorší je, že nemůžu poznat, jestli na ten soubor vůbec reaguje. Ať do něj napíšu cokoli, tak nereaguje.

V /js/custom.js mam tuto funkci
jQuery(document).ready(function()
{
//Autocomplete
jQuery("#search").autocomplete('../zbozi_all.php', //nefunguje
{
//source:["c++", "java", "php", "coldfusion", "javascript", "asp", "ruby", "python", "c", "scala", "groovy", "haskell", "pearl"], //funguje
//source: "../zbozi_all.php", //nefunguje
//source: [{"value":"Some Name","id":1},{"value":"Some Othername","id":2}], //funguje
});
});

V /index.php je vyhledavaci okynko
<form action='/hledej' method='get'>
<input type='text' name='term' size='15' />
<input type='submit' value='hledej' class='buton' />
</form>

a v /zbozi_all.php je
$term = $_GET['term'];//retrieve the search term that autocomplete sends
//Pripojime se k databazi
include 'config.php';
//Hledame v databazi
$qstring = "SELECT id,nazev FROM tbl_zbozi WHERE nazev LIKE ('%$term%') GROUP BY nazev LIMIT 10" ;
$result = mysql_query($qstring);//query the database for entries containing the term

while ($row = mysql_fetch_array($result))//loop through the retrieved values
{
//$row['nazev']=htmlentities(stripslashes($row['nazev']));
//$row['id']=(int)$row['id'];
//echo $row['nazev'];
$row_set[] = $row['nazev'];//build an array
}

echo json_encode($row_set);

do row_set[] jsem uz nacpala nejruznejsi moznosti, jak vypsat data v json formatu, a nereaguje.
Zkusela jsem do zbozi_all.php natvrdo dat jen json data [{"value":"Some Name","id":1},{"value":"Some Othername","id":2}] a porad nereaguje,
zkousela jsem strcit soubor zbozi_all.php primo do slozky /js a porad nic.

zde jsem se docetla, ze data natvrdo zadana v souboru se proste nevypisou.

Mam pocit, jak kdyby z custom.js soubor zbozi_all.php nebyl videt.. nebo neragoval na stisk pismene pri psani ve chaldavacim policku. Nevidite nekde chybu? Dotaz do databaze funguje, to jsem overovala., kdyz si necham zobrazit samotny soubor, data se vypisou, jen nejak nereaguje na zapis do policka.

Budu vdecna za jakoukoli radu.
peta
Profil
DeeDeeX:
Zkus pouzivat tlacitko <> pro vypisy z kodu do fora.
Co vypise po zadani do prohlizece "zbozi_all.php"?
Mas tam podminku $term = $_GET['term'], pri nezadani textu to teoreticky vypise prvnich 10 radku nebo napise sql error, protoze tam vznikne LIKE '%%'

No, a co se tyce zpracovani kodu, ten prenos pomoci JS, to je cele takove podivne. Aspon nevim, co jsi tim chtela rici. Nekomplikoval bych si to autocomplete. // tak oprava, komplikoval bych to pomoci autocomlete, protoze to dela more dalsich veci, jako vytvari select a tak :)
http://api.jquery.com/category/ajax/
http://api.jquery.com/jQuery.post/
$.post('ajax/test.html', function(data) {
  $('.result').html(data);
});
//nebo
function zpracuj(data)
{
alert(data);
}
$.post('zbozi_all.php', zpracuj);

To autocomplete bych resil podle toho prikladu.
http://www.simonbattersby.com/demos/vertical_scrollbar_demo_5_autocomplete.php
<input type=text id="autocomplete"></div>
<script>
$("#autocomplete").autocomplete({source: "zbozi_all.php"});
</script>

Nejlepsi by bylo pridat sem i odkaz na cely kod (nic s id=search tam totiz nevidim).
DeeDeeX
Profil *
Děkuju.

Kdyz zobrazím stránku zbozi_all.php?term=test
vypise se mi seznam v tomto formatu:
["test zbozi","TEST zbozi s dokumentem","test skladem"]

nebo v tomto
 [{"0":"test zbozi","nazev":"test zbozi"},{"0":"TEST zbozi s dokumentem","nazev":"TEST zbozi s dokumentem"},{"0":"test skladem","nazev":"test skladem"}] 

Druhy pripad se zobrazi, kdyz misto
while ($row = mysql_fetch_array($result))//loop through the retrieved values 
{ 
$row_set[] = $row['nazev'];//build an array 
} 

dam
while ($row = mysql_fetch_array($result))//loop through the retrieved values 
{ 
$row_set[] = $row;//build an array 
} 

Oba formaty jsou validni JSON (testovano), prvni mi prijde prehlednejsi a kdyz potrebuju pouze nazev zbozi, uplne mi ten prvni format staci

Zápis typu
$("#autocomplete").autocomplete({source: "zbozi_all.php"});
jsem zkousela, nefungoval. Tzn. při vepisování písmen do pole #search žádné šeptání. Do externiho souboru nejde, netrefi tam, nebo ho ignoruje, nevim.
Takovýto:
jQuery("#search").autocomplete(
     {
          //source:["c++", "java", "php", "coldfusion", "javascript", "asp", "ruby", "python", "c", "scala", "groovy", "haskell", "pearl"], //funguje
          source: "../zbozi_all.php" //nefunguje
          //source: [{"value":"Some Name","id":1},{"value":"Some Othername","id":2}]  //funguje
     });


V index.php to vypada takto (omylem jsem predtim zkopirovala zdrojak stranky z webu misto lokalni)
<form action='/hledej' method='get'>
<input type='text' name='term' size='15'  id='search' />
<input type='submit' value='hledej' class='buton' />
</form>


Odkaz na celý kód na netu není, dělám to na localu. Ale dík, udělat nějaký skrytý test přímo na webu by nebylo od věci.
DeeDeeX
Profil *
Tak vyřešeno :-)
Děkuju peta :-)

Nakonec byl problem v tom, že vystupni data musí být PŘESNĚ ve formátu

 [{"value":"Some Name","id":1},{"value":"Some Othername","id":2}] 


Takze zadne "nazev": neuspelo.

A ještě kdyby někdo měl stejný problém a při ladění psal pořád do vyhledávacího políčka stejné slovo a myslel si, že tak přijde na chybu, tak nene. Nějak se to kešuje a že to už funguje jsem přišla až když jsem místo obvyklé vyhladávané fráze napsala něco jiného.. svuj "test" jsem takto mohla psát ještě hooodně dlouho a myslet si, že pořád nefungujeme.

Pokud někomu pomůže, tak výsledný tvar vytváření výstupu z zbozi_all.php vypadá takto:
$json = '[';
$first = true;

while ($row = mysql_fetch_array($result, MYSQL_ASSOC))//loop through the retrieved values
{
if (!$first) { $json .=  ','; } else { $first = false; }
$json .= '{"value":"'.$row['nazev'].'", "id":"'.$row['id'].'"}';
}

$json .= ']'; 
echo $json;
peta
Profil
$json = array();
while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
$json[] = '{"value":"'.$row['nazev'].'", "id":"'.$row['id'].'"}';
//$json[] = "{'value':'{$row['nazev']}', 'id':'{$row['id']}'};"; to je asi uz moc prekombinovane
//$json[] = printf("{'value':'%s', 'id':'%s'};", $row['nazev'], $row['id']); taky
}
echo '[' . implode(',', $json) . ']';

Proste ses genialni, no. Ja bych to musel otestovat.
Jeste bych tam mozna pridal addslashes nebo jinou konverzi, kdyby ti do textu nekdo zamichal apostrof nebo lomitko ' " \ (apostrof ti retezec ukonci a lomitko zachrani nasledujici znak)
Kesovani je mozne zabranit pridanim casoveho razitka k odkazu time(), to vyplodi jakesi cislo, ktere se meni kazdou milisekundu nebo sekundu. Ale zrovna u autocomplete je kesovani dulezite. Ve FF by se to melo ale chovat korektne, to pouzivas IE, asi. Ctrl+F5
pcmanik
Profil
Neviem co to tu komplikujete:

while($riadok = mysqli_fetch_array($sql)) {
	$row_array['label'] = $riadok['aa'];
	$row_set[] = $row_array;
}
echo json_encode($row_set);

A to ti vrati: [{"label":"aaaaaaa"}] - Podla firebugu
rendy1
Profil
Zdravim,
vidim, ze vasm sa tento problem uz podaril vyriesit,,, Nemoze DeeDeeX uploadnut kompletny zdrojak ? Lebo mne to stale nechce fungovat....
moc dakujem.
Sylar
Profil
omlouvám se za znovuotevření topicu, ale nechci zakládat nový, týká se to úplně stejné věci.

zkoušeím rozhocit jquery ui autocomplete, tahám data z externího souboru
<script>
  $(document).ready(function() {    
    $("#search_z").autocomplete({
      source: function(request, response) {
        $.get("libs/naseptavac.php?q=" + request.term, function(data) {
          alert(data); // tady se mi vytiskne v pořádku to co mi soubor vrátí (viz. níže)
          return data; // ale v našeptávači se nic nezobrazí (resp. se nezobrazí ani samotný našeptávač)
        });
      },
      minLength: 3,
      select: function(event, ui, request) {
        redirect("http://zbozi.seznamshopu.cz/?search=" + request.term);
      }
    });
  });
</script>

Soubor naseptavac.php mi po napsání "matr" vrátí toto
["matrace Pretty STAR 100x200","matrace LILIANA 80x200","matrace LILIANA 80x195","matrace LILIANA 85x195","matrace LILIANA 100x200","matrace NINA 90x200","matrace NINA 80x200","matrace NINA 80x195","matrace NINA 85x195","matrace CALIPO MAXI 90x200"]

Nenapadá mě kde by mohla být chyba. Nemusí se třeba ten našeptávač po načtení nových dat nějak "refreshovat" či co?
Když to pole produktů dám natvrdo do "source", vše funguje jak má.
_es
Profil
Sylar:
return data; // ale v našeptávači se nic nezobrazí (resp. se nezobrazí ani samotný našeptávač)
Prečo by malo? Kam by ako mala tá funkcia tie dáta odoslať a aká funkcia by ich mala prijať?
Sylar
Profil
_es:
ve funkci $.get() odesílám data na url "libs/naseptavac.php?q=" + request.term a druhý parametr této funkce je funkce s návratovou hodnotou data, ve kterém obdržím data zpět od PHP scriptu. Nebo to tak není? o řádek výš nad "return data" mám alert, kde se mi ty data v pořádku vypíší.
_es
Profil
Sylar:
o řádek výš nad "return data" mám alert, kde se mi ty data v pořádku vypíší.
A ten príkaz return by ich mal ako odoslať kam?
Prečo si najprv nepozrieš dokumentáciu tej jQuery funkcie, predtým, než ju začneš používať?
Sylar
Profil
_es:
takže tím return se to vrátí pouze té funkci o úroveň výše? pak mi tedy napadá toto, do konzole se mi ten text vypíše správně, ale ten return asi opět nebude ono, že? protože našeptávač stále nic.
      source: function(request, response) {
        var data = $.get("libs/naseptavac.php?q=" + request.term, function(data) {
          return data;
        });
        alert(data.responseText);
        console.log(data.responseText);
        return data.responseText;
      },
_es
Profil
Sylar:
takže tím return se to vrátí pouze té funkci o úroveň výše?
Nie, nauč sa základy JavaScriptu. Tým returnom sa len ukončí tá funkcia, ktorá by skončila aj tak a dáta sú zahodené.
Sylar
Profil
_es:
tak mě ale už bohužel nic nenapadá. pokud víš, můžeš mi tedy ukázat jak ty data předat té funkci u "source", aby se zobrazily jako možnosti našeptávače?
_es
Profil
Sylar:
můžeš mi tedy ukázat jak ty data předat té funkci u "source"
Tej funkcii sa tie dáta nijako predávať nemajú, keď beží ten príkaz return, tak už dávno skončila a nijaký return tam nepatrí, tak ako si v v 6. riadku v [#8] vypísal tie dáta cez alert, tak ich v tej istej funkcii nejako spracuj do toho „našeptávača“.
Sylar
Profil
_es:
to mi tak nějak došlo, ale netuším JAK je "spracovat" do toho našeptávače ... nevím jestli je mám vložit do nějaké spešl proměnné nebo použít nějakou funkci ... dokumentaci této "options" jsem četl odshora dolu a zpět několikát, ale moc mi nepomohla ...
Chamurappi
Profil
Reaguji na Sylara:
Tak si tam přečti ještě Overview. S pomocí oficiální dokumentace by dokázal tvoji velkou záhadu vyřešit během půl minuty i úplný lehce rozkoukaný začátečník.
_es
Profil
Sylar:
netuším JAK je "spracovat" do toho našeptávače
Najskôr asi začať od začiatku v dokumentácii toho našeptávača.
Podporuje vôbec metóda .autocomplete hentaké načítanie súboru? Veľmi mi to zmysel nedáva. Asi tam patria už rovno tie „našeptávacie“ dáta.
Sylar
Profil
Chamurappi,
_es:
jsem slepý, příznávám ... děkuji za pomoc

fční výsledek, kdyby někdo v budoucnu ...
<script>
  $(document).ready(function() {
    $("#search_z").autocomplete({
      source: "libs/naseptavac.php",
      minLength: 3,
      select: function(event, ui) {
        redirect("http://zbozi.seznamshopu.cz/?search=" + ui.item.value);
      }
    });
  });
</script>

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

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