Ankündigung

Einklappen
Keine Ankündigung bisher.

AutoSuggest mit Callback Funktion

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • r4lle1882
    hat ein Thema erstellt AutoSuggest mit Callback Funktion.

    AutoSuggest mit Callback Funktion

    Hallo Leute!

    Ich möchte eine Ajax AutoSuggest Funktion nutzen, dessen Scripts ich mir hier: Ajax auto-suggest / auto-complete | BrandSpankingNew

    runtergeladen habe.

    Soweit funktioniert auch alles, ausser dass ich ein Veränderung vornehmen möchte.
    Wenn jemand etwas sucht und es dann mit Hilfe der Vorschläge findet und anklickt, dann möchte ich nicht dass die Variable ins Suchfeld übernommen wird, sondern direkt mit dem Click zu einer bestimmten URL geschickt wird. Und für jeden Suchbegriff gibt es dann einen anderen direkten Link.

    Ist das möglich? Wenn ja wie?

    Hier der aktuelle PHP-Code:

    PHP-Code:
    <?php

    /*
    note:
    this is just a static test version using a hard-coded countries array.
    normally you would be populating the array out of a database

    the returned xml has the following structure
    <results>
        <rs>foo</rs>
        <rs>bar</rs>
    </results>
    */


        
    $aUsers = array(
            
    "Ädams, Egbert",
            
    "Altman, Alisha",
            
    "Archibald, Janna",
            
    "Auman, Cody",
            
    "Bagley, Sheree",
            
    "Ballou, Wilmot",
            
    "Bard, Cassian",
            
    "Bash, Latanya",
            
    "Beail, May",
            
    "Black, Lux",
            
    "Bloise, India",
            
    "Blyant, Nora",
            
    "Bollinger, Carter",
            
    "Burns, Jaycob",
            
    "Carden, Preston",
            
    "Carter, Merrilyn",
            
    "Christner, Addie",
            
    "Churchill, Mirabelle",
            
    "Conkle, Erin",
            
    "Countryman, Abner",
            
    "Courtney, Edgar",
            
    "Cowher, Antony",
            
    "Craig, Charlie",
            
    "Cram, Zacharias",
            
    "Cressman, Ted",
            
    "Crissman, Annie",
            
    "Davis, Palmer",
            
    "Downing, Casimir",
            
    "Earl, Missie",
            
    "Eckert, Janele",
            
    "Eisenman, Briar",
            
    "Fitzgerald, Love",
            
    "Fleming, Sidney",
            
    "Fuchs, Bridger",
            
    "Fulton, Rosalynne",
            
    "Fye, Webster",
            
    "Geyer, Rylan",
            
    "Greene, Charis",
            
    "Greif, Jem",
            
    "Guest, Sarahjeanne",
            
    "Harper, Phyllida",
            
    "Hildyard, Erskine",
            
    "Hoenshell, Eulalia",
            
    "Isaman, Lalo",
            
    "James, Diamond",
            
    "Jenkins, Merrill",
            
    "Jube, Bennett",
            
    "Kava, Marianne",
            
    "Kern, Linda",
            
    "Klockman, Jenifer",
            
    "Lacon, Quincy",
            
    "Laurenzi, Leland",
            
    "Leichter, Jeane",
            
    "Leslie, Kerrie",
            
    "Lester, Noah",
            
    "Llora, Roxana",
            
    "Lombardi, Polly",
            
    "Lowstetter, Louisa",
            
    "Mays, Emery",
            
    "Mccullough, Bernadine",
            
    "Mckinnon, Kristie",
            
    "Meyers, Hector",
            
    "Monahan, Penelope",
            
    "Mull, Kaelea",
            
    "Newbiggin, Osmond",
            
    "Nickolson, Alfreda",
            
    "Pawle, Jacki",
            
    "Paynter, Nerissa",
            
    "Pinney, Wilkie",
            
    "Pratt, Ricky",
            
    "Putnam, Stephanie",
            
    "Ream, Terrence",
            
    "Rumbaugh, Noelle",
            
    "Ryals, Titania",
            
    "Saylor, Lenora",
            
    "Schofield, Denice",
            
    "Schuck, John",
            
    "Scott, Clover",
            
    "Smith, Estella",
            
    "Smothers, Matthew",
            
    "Stainforth, Maurene",
            
    "Stephenson, Phillipa",
            
    "Stewart, Hyram",
            
    "Stough, Gussie",
            
    "Strickland, Temple",
            
    "Sullivan, Gertie",
            
    "Swink, Stefanie",
            
    "Tavoularis, Terance",
            
    "Taylor, Kizzy",
            
    "Thigpen, Alwyn",
            
    "Treeby, Jim",
            
    "Trevithick, Jayme",
            
    "Waldron, Ashley",
            
    "Wheeler, Bysshe",
            
    "Whishaw, Dodie",
            
    "Whitehead, Jericho",
            
    "Wilks, Debby",
            
    "Wire, Tallulah",
            
    "Woodworth, Alexandria",
            
    "Zaun, Jillie"
        
    );
        
        
        
    $aInfo = array(
            
    "Bedfordshire",
            
    "index.html",
            
    "Cambridgeshire",
            
    "Cheshire",
            
    "Cornwall",
            
    "Cumbria",
            
    "Derbyshire",
            
    "Devon"
            
    "Dorset"
            
    "Durham"
            
    "East Sussex",
            
    "Essex",
            
    "Gloucestershire",
            
    "Hampshire",
            
    "Hertfordshire"
            
    "Kent"
            
    "Lancashire",
            
    "Leicestershire",
            
    "Lincolnshire",
            
    "Norfolk",
            
    "Northamptonshire",
            
    "Northumberland"
            
    "North Yorkshire"
            
    "Nottinghamshire",
            
    "Oxfordshire",
            
    "Shropshire",
            
    "Somerset",
            
    "Staffordshire",
            
    "Suffolk"
            
    "Surrey",
            
    "Warwickshire",
            
    "West Sussex",
            
    "Wiltshire",
            
    "Worcestershire"
            
    "Durham"
            
    "East Sussex",
            
    "Essex",
            
    "Gloucestershire",
            
    "Hampshire",
            
    "Hertfordshire"
            
    "Kent"
            
    "Lancashire",
            
    "Leicestershire",
            
    "Lincolnshire",
            
    "Norfolk",
            
    "Northamptonshire",
            
    "Northumberland"
            
    "North Yorkshire"
            
    "Nottinghamshire",
            
    "Oxfordshire",
            
    "Shropshire",
            
    "Somerset",
            
    "Staffordshire",
            
    "Suffolk"
            
    "Surrey",
            
    "Warwickshire",
            
    "West Sussex",
            
    "Wiltshire",
            
    "Worcestershire"
            
    "Durham"
            
    "East Sussex",
            
    "Essex",
            
    "Gloucestershire",
            
    "Hampshire",
            
    "Hertfordshire"
            
    "Kent"
            
    "Lancashire",
            
    "Leicestershire",
            
    "Lincolnshire",
            
    "Norfolk",
            
    "Northamptonshire",
            
    "Northumberland"
            
    "North Yorkshire"
            
    "Nottinghamshire",
            
    "Oxfordshire",
            
    "Shropshire",
            
    "Somerset",
            
    "Staffordshire",
            
    "Suffolk"
            
    "Surrey",
            
    "Warwickshire",
            
    "West Sussex",
            
    "Wiltshire",
            
    "Worcestershire"
            
    "Durham"
            
    "East Sussex",
            
    "Essex",
            
    "Gloucestershire",
            
    "Hampshire",
            
    "Hertfordshire"
            
    "Kent"
            
    "Lancashire",
            
    "Leicestershire",
            
    "Lincolnshire",
            
    "Norfolk",
            
    "Northamptonshire",
            
    "Northumberland"
            
    "North Yorkshire"
            
    "Nottinghamshire"
        
    );
        
        
        
    $input strtolower$_GET['input'] );
        
    $len strlen($input);
        
    $limit = isset($_GET['limit']) ? (int) $_GET['limit'] : 0;
        
        
        
    $aResults = array();
        
    $count 0;
        
        if (
    $len)
        {
            for (
    $i=0;$i<count($aUsers);$i++)
            {
                
    // had to use utf_decode, here
                // not necessary if the results are coming from mysql
                //
                
    if (strtolower(substr(utf8_decode($aUsers[$i]),0,$len)) == $input)
                {
                    
    $count++;
                    
    $aResults[] = array( "id"=>($i+1) ,"value"=>htmlspecialchars($aUsers[$i]), "info"=>htmlspecialchars($aInfo[$i]) );
                }
                
                if (
    $limit && $count==$limit)
                    break;
            }
        }
        
        
        
        
        
        
    header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past
        
    header ("Last-Modified: " gmdate("D, d M Y H:i:s") . " GMT"); // always modified
        
    header ("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
        
    header ("Pragma: no-cache"); // HTTP/1.0
        
        
        
        
    if (isset($_REQUEST['json']))
        {
            
    header("Content-Type: application/json");
        
            echo 
    "{\"results\": [";
            
    $arr = array();
            for (
    $i=0;$i<count($aResults);$i++)
            {
                
    $arr[] = "{\"id\": \"".$aResults[$i]['id']."\", \"value\": \"".$aResults[$i]['value']."\", \"info\": \"\"}";
            }
            echo 
    implode(", "$arr);
            echo 
    "]}";
        }
        else
        {
            
    header("Content-Type: text/xml");

            echo 
    "<?xml version=\"1.0\" encoding=\"utf-8\" ?><results>";
            for (
    $i=0;$i<count($aResults);$i++)
            {
                echo 
    "<rs id=\"".$aResults[$i]['id']."\" info=\"".$aResults[$i]['info']."\">".$aResults[$i]['value']."</rs>";
            }
            echo 
    "</results>";
        }
    ?>

    Vielleicht macht sich ja jemand die Mühe und durchforstet mal die Geschichte. Würde mich sehr über eine Hilfestellung freuen!

    Bye und Gruß aus Berlin

  • Chriz
    antwortet
    Warum antwortest du mir dann? Ich bin eben Moderator hier (sogar freiwillig) und da achte ich eben auf Dinge, die andere sonst mal ueberlesen. Sonst sind hier in zwei Monaten alle guten PHPler verschwunden, weil das Niveau und die Postingqualitaet im Keller sind. Davon hat dann niemand etwas.


    Zum Thema:
    Also grundsaetzlich wuerde ich dir raten, bei JS-Skriptsuchen immer mal bei jQuery und seinen Plugins vorbeizuschauen. Das ist naemlich Code den man halbwegs versteht, den Code von dir finde ich sehr unleserlich (_b.DOM.cE?).

    Ich benutze diesen Autocompleter:
    jQuery Autocomplete

    Anwendung fuer deine Zwecke (ungetestet):
    Code:
    // js
    $(document).ready(function() {
      var options = {
        onItemSelect: function (li) {
          if (typeof li.extra != "undefined") {
            location.href = li.extra[0];
          }
        }
      }
      $("input.autocomplete").autocomplete("ajax-autocomplete.php", options);
    });
    
    // html
    <input type="text" class="autocomplete" />
    Deine ajax-autocomplete.php bekommt jetzt per GET einen q-Parameter mit dem Suchwort ($_GET["q"]). Du musst dann eigentlich nurnoch die Antwort zurueckschicken, Pipe (|) separiert:
    Code:
    VW|http://www.volkswagen.de
    BWM|http://www.bmw.de
    ..
    Das wars an manuellem Code. Aktuelles jQuery und die CSS- und JS-Dateien auf der verlinkten Seite sind natuerlich einzubinden!

    Einen Kommentar schreiben:


  • r4lle1882
    antwortet
    @Dark Guardian,

    du gibst mir wohl logisch die Lösung vor aber ich bin nicht in der Lage die Sache so umzuschreiben wie ich es brauche obwohl es vielleicht nur Kleinigkeiten sind.
    Ich hab gedacht, dass das Forum "Fortgeschritten" sich eher auf die Helfer bezieht.

    Danke für deine Bemühung und einen schönen Abend noch. Werde noch im Inet nach einer besseren Lösung suchen und hoffentlich einen fertigen Code, der für mich passt, finden.

    @Chriz,

    ich kann mir vorstellen, dass es dir egal ist wie es mir ergeht. Nur kann ich nicht verstehen, wie man sich die Mühe macht auf etwas zu antworten, was eh für ein selbst Unsinn ist.

    Ich werde nochmal nach dem Jquery Plugin suchen. Danke für den Tip!

    Einen Kommentar schreiben:


  • Chriz
    antwortet
    Zitat von r4lle1882 Beitrag anzeigen
    Guten Abend Chriz,

    ich hoffe ich habe dir nicht mit meinem 25kb Quellcode den Abend versaut und dein Leben ist sonst nicht so schlimm. Ich z.B. hatte heute eine Weisheitszahn-OP und muss gestehen, dass ich lieber jeden Tag 25kb Quellcodes lese.

    Hoffentlich kommst du drüber hinweg, dies jemals gelesen zu haben...
    Interessiert mich ehrlich gesagt wenig ob du heut am Zahn operiert wurdest, fast vom Fahrrad gefallen waerst oder in den Garten deines Nachbars gepinkelt hast. Es geht darum, dass es keinen Sinn macht soviel Code hier zu posten, weil da keiner reinschaut (was dein Bangen um meine Leben damit hoffentlich auch lindert). Wenn 25 KB fuer dich wenig klingen, dann nur weil du davon ausgehst, dass es von einem Rechner verarbeitet wird. Fuer einen Menschen bleibt es aber genausoviel wie vor 15 oder 100 Jahren.

    Es zeigt damit eigentlich nur deine "Da hier ist der Quellcode macht ihr mal"-Einstellung, was ich eigentlich kritisieren wollte. Vielleicht kams ja jetzt durch.

    Da statt Hilfe anzunehmen, es offenbar schick ist, sich lieber gegen die im selben Satz untergebrachten Vorwuerfe zu verteidigen, hier nocheinmal der Hinweis auf jQuery und eins der autocomplete-Plugins. Ich bin nicht mehr sicher welches Plugin genau es war, aber ich arbeite selbst damit und weiss deshalb, dass es dort ein onItemSelect-Event gibt. In dem kannst du auf die Infos des AJAX-Requests zurueckgreifen und den mit dem Treffer verbundenen Link einfach aufrufen. Einfach mal bissi suchen.

    Gute Besserung!

    Einen Kommentar schreiben:


  • Dark Guardian
    antwortet
    Zitat von r4lle1882 Beitrag anzeigen
    Guten Abend Chriz,

    ich hoffe ich habe dir nicht mit meinem 25kb Quellcode den Abend versaut und dein Leben ist sonst nicht so schlimm. Ich z.B. hatte heute eine Weisheitszahn-OP und muss gestehen, dass ich lieber jeden Tag 25kb Quellcodes lese.

    Hoffentlich kommst du drüber hinweg, dies jemals gelesen zu haben...
    Javascript Quellcode ist meist nicht gerade leicht zu verstehen und der Batzen von dir da erst recht nicht.

    Wie gesagt wurde wird ein Input Feld mit einem Wert befüllt. Dies geschieht in der Callback Funktion aus dem kleinem Codestück. Nun ist es doch völlig ausreichend das Stück abzuändern oder nicht?

    Du siehst in dem Codestück wie der Wert ausgelesen wird der ins Input Feld geschrieben wird. Ich hab dir gepostet wie eine Weiterleitung geht. Aus dem Auslesen des Wertes eine URL mit Get-Parameter zu formen um den Rest per PHP erledigen zu können sollte drin sein wenn man im Fortgeschrittenen Forum postet.

    Einen Kommentar schreiben:


  • r4lle1882
    antwortet
    Guten Abend Chriz,

    ich hoffe ich habe dir nicht mit meinem 25kb Quellcode den Abend versaut und dein Leben ist sonst nicht so schlimm. Ich z.B. hatte heute eine Weisheitszahn-OP und muss gestehen, dass ich lieber jeden Tag 25kb Quellcodes lese.

    Hoffentlich kommst du drüber hinweg, dies jemals gelesen zu haben...

    Einen Kommentar schreiben:


  • Chriz
    antwortet
    Was soll das hier 25 KB Quellcode zu posten?

    Wenn du keine Ahnung von JS hast eigne dir eben ein Grundwissen an und stell dann gezielt deine Frage. Es gibt doch genuegend jQuery-autocomplete-Plugins mit onItemSelect-Events.

    Einen Kommentar schreiben:


  • r4lle1882
    antwortet
    Vielen Dank für die Antworten.

    Es werden sicherlich nicht so viele Datensätze. Mehr als 1.000 kann ich mir im Moment nicht vorstellen. Es gibt mit Sicherheit bessere Lösungsansätze aber da ich mit meinem Kenntnisstand auf Andere angewiesen bin, war es das fast die einzige Möglichkeit.


    @Dark Guardian

    Wie bekomme ich die Weiterleitung mit JS für jeden einzelnen array im PHP-Script hin? Ich brauche für jeden "Vorschlag" einen eigenen href.

    In dem langen JS-Script gibt es einen Absatz der so aussieht:
    Code:
    // create and populate ul
    //
    var ul = _b.DOM.cE("ul", {id:"as_ul"});
    
    
    
    
    // loop throught arr of suggestions
    // creating an LI element for each suggestion
    //
    for (var i=0;i<arr.length;i++)
    {
    // format output with the input enclosed in a EM element
    // (as HTML, not DOM)
    //
    var val = arr[i].value;
    var st = val.toLowerCase().indexOf( this.sInp.toLowerCase() );
    var output = val.substring(0,st) + "<em>" + val.substring(st, st+this.sInp.length) + "</em>" + val.substring(st+this.sInp.length);
    
    
    var span = _b.DOM.cE("span", {}, output, true);
    if (arr[i].info != "")
    {
    var br = _b.DOM.cE("br", {});
    span.appendChild(br);
    var small = _b.DOM.cE("small", {}, arr[i].info);
    span.appendChild(small);
    }
    
    var a = _b.DOM.cE("a", { href:"index.html" });
    
    var tl = _b.DOM.cE("span", {className:"tl"}, " ");
    var tr = _b.DOM.cE("span", {className:"tr"}, " ");
    a.appendChild(tl);
    a.appendChild(tr);
    
    a.appendChild(span);
    
    a.name = i+1;
    a.onclick = function () { pointer.setHighlightedValue(); return false; };
    a.onmouseover = function () { pointer.setHighlight(this.name); };
    
    var li = _b.DOM.cE( "li", {}, a );
    
    ul.appendChild( li );
    }
    Wenn ich die DICK markierte Zeile mit dem href verändere, funktioniert die Weiterleitung ABER leider nur zu EINEN bestimmten Link.


    Hoffe das bringt mich etwas weiter. Vielen Dank nochmal für die Hilfestellung.

    Einen Kommentar schreiben:


  • Wolla
    antwortet
    #1:

    $aUsers = array(
    "Ädams, Egbert",
    "Altman, Alisha",
    "Archibald, Janna",
    "Auman, Cody",
    "Bagley, Sheree",
    "Ballou, Wilmot",
    "Bard, Cassian",
    "Bash, Latanya",
    usw

    Einen Kommentar schreiben:


  • Paul.Schramenko
    antwortet
    Zitat von Wolla Beitrag anzeigen
    Ich halte den ganzen Ansatz für falsch. Alle möglichen Datensätze werden in den Speicher geladen. Das mag ja für diese geringen datenmengen ganz hübsch aussehen, aber mach das mal für eine Adressliste mit 14 Mio Datensätzen.
    Wenn ich das richtig sehe wird da nur ein bestimmter teil geholt, wegen der Zeile:
    Code:
    script: "test.php?limit=10&timeout=5000&",
    Und mit maxresults werden auch nur 10Einträge geholt

    Einen Kommentar schreiben:


  • Wolla
    antwortet
    Ich halte den ganzen Ansatz für falsch. Alle möglichen Datensätze werden in den Speicher geladen. Das mag ja für diese geringen datenmengen ganz hübsch aussehen, aber mach das mal für eine Adressliste mit 14 Mio Datensätzen.

    Einen Kommentar schreiben:


  • Dark Guardian
    antwortet
    Viel ist da nicht zu machen eigentlich...

    Code:
    <script type="text/javascript">	
    	
    	var options = {
    		script: "test.php?limit=10&timeout=5000&",
    		varname:"input",
    		shownoresults:true,
    		maxresults:10,
    		callback: function (obj) { document.getElementById('testid').value = obj.id; }
    	};
    	var as_xml = new bsn.AutoSuggest('testinput', options);
    </script>
    Da sieht man ja schon sehr deutlich wo sich die Callback Funktion befindet und was diese als Parameter bekommt und was sie tut.

    Eine Weiterleitung erfolgt in JS sehr leicht:

    document.location.href = 'http://www..........';

    Einen Kommentar schreiben:


  • r4lle1882
    antwortet
    Danke Dir Paul trotzdem!

    Einen Kommentar schreiben:


  • Paul.Schramenko
    antwortet
    Zitat von r4lle1882 Beitrag anzeigen
    Fummel an der Sache schon seit Tagen. Leider fehlen mir wahrscheinlich einige Basiskenntnisse...
    Dann wirst du dir diese aneigenen müssen....

    Zitat von r4lle1882 Beitrag anzeigen
    Dachte wenn es für dich kein großes Problem darstellt, wäre es eine Kleinigkeit mir kurz weiter auf die Sprünge zu helfen.
    Das ist halt echt ein Batzen Code, ich wollte mir das durchlesen, nur dann hab ich dem js-Code gesehn und hatte auch keine Lust mehr...

    Einen Kommentar schreiben:


  • r4lle1882
    antwortet
    Fummel an der Sache schon seit Tagen. Leider fehlen mir wahrscheinlich einige Basiskenntnisse...

    Dachte wenn es für dich kein großes Problem darstellt, wäre es eine Kleinigkeit mir kurz weiter auf die Sprünge zu helfen.

    Danke trotzdem für deine Antworten. Werde es mal an anderer Stelle versuchen.

    Wünsche noch einen angenehmen Tag.

    Einen Kommentar schreiben:

Lädt...
X