Textbox met dropdown onchange.

Status
Niet open voor verdere reacties.

BZilla

Gebruiker
Lid geworden
16 apr 2014
Berichten
170
Goeiemiddag,

Ik ben bezig met een project waar een nieuw item gekozen moet worden of een bestaande gewijzigt moet worden.
Nu wil ik wanneer er een bestaande item veranderd moet worden, de bezoeker de naam van dit item invult.
De eis is dat wanneer de bezoeker de 'C' invuld in het textveld, er een dropdown uitkomt met alle items die beginnen met de 'C'.
Wanneer ze dan de 'A' intypen moet alles tevoorschijn komen met 'CA' en ga zo maar door.

Omdat ik geen enkel idee heb hoe dit zou moeten en of dit kan met PHP vraag ik dit hier.
Mocht dit niet kunnen met PHP misschien heeft iemand dan een andere oplossing?

Hoop dat ik genoeg uitleg heb gegeven en zo niet hoor ik het graag.

Alvast bedankt!

Bzilla
 
Aangezien dit meer met Javascript te maken heeft dan met PHP verplaats ik hem naar de juiste sectie.

Waar je naar moet zoeken is "AJAX", er zijn zelfs jQuery plugins die deze functionaliteit voor je bieden. (http://ivaynberg.github.io/select2/#ajax)
Je zult dan zelf een JSON bestand moeten kunnen genereren welke de juiste data teruggeeft voor de dropdown.

Hiervoor heb je PHP nodig maar dat zal niet meer zijn dan even in de database zoeken naar de zoekterm en de resultaten teruggeven in het juiste JSON-format
 
Ik moet zeggen dat ik geen enkel verstand heb van AJAX of uberhaupt JavaScript, wellicht kunt u mij hiermee opweg helpen zodat ik ook begrijp wat ik doe?
 
Wanneer je gebruik maakt van Select2 dan heb je verder weinig Javascript nodig, alleen wat configuratie zaken :)

Heb je het implementeren van Select2 al voor elkaar? Zo ja wat is je code.

Daarnaast heb je dus een PHP bestand nodig, deze moet in de database gaan zoeken aan de hand van een variabele. Dat kun je ook alvast maken.
 
Ik heb hem geimplementeerd en uiteraard al een bestandje waarmee ik de gegevens ophaal.
Ik ben er een beetje mee aan het rommelen maar het wil nog niet lukken.

Volgens mij moet het worden zoals Loading data, maar dan doormiddel van de database uiteraard.
 
Niet echt, je moet het zoals "Loading remote data" hebben :)

Je geeft een URL aan Select2 mee waar hij een JSON op kan vragen, aan die URL kan een parameter met het zoekword meegegeven worden. Die verwerk je dan binnen je bestand en in je query.
 
Oke, het enige deel wat ik snapte is dat ik iets als Loading remote data moet hebben.
Kun je de rest wat uitgebreider uitleggen?
 
Dit is het voorbeeld:
HTML:
<input type="hidden" class="bigdrop" id="e6" style="width:600px" value="16340"/>
[js]
$("#e6").select2({
placeholder: "Search for a movie",
minimumInputLength: 1,
ajax: { // instead of writing the function to execute the request we use Select2's convenient helper
url: "http://api.rottentomatoes.com/api/public/v1.0/movies.json",
dataType: 'jsonp',
data: function (term, page) {
return {
q: term, // search term
page_limit: 10,
apikey: "ju6z9mjyajq2djue3gbvv26t" // please do not use so this example keeps working
};
},
results: function (data, page) { // parse the results into the format expected by Select2.
// since we are using custom formatting functions we do not need to alter remote JSON data
return {results: data.movies};
}
},
initSelection: function(element, callback) {
// the input tag has a value attribute preloaded that points to a preselected movie's id
// this function resolves that id attribute to an object that select2 can render
// using its formatResult renderer - that way the movie name is shown preselected
var id=$(element).val();
if (id!=="") {
$.ajax("http://api.rottentomatoes.com/api/public/v1.0/movies/"+id+".json", {
data: {
apikey: "ju6z9mjyajq2djue3gbvv26t"
},
dataType: "jsonp"
}).done(function(data) { callback(data); });
}
},
formatResult: movieFormatResult, // omitted for brevity, see the source of this page
formatSelection: movieFormatSelection, // omitted for brevity, see the source of this page
dropdownCssClass: "bigdrop", // apply css that makes the dropdown taller
escapeMarkup: function (m) { return m; } // we do not want to escape markup since we are displaying html in results
});[/js]

Daarvan heb je eerst maar een paar dingen nodig, een HTML element met een id:
HTML:
<input type="hidden" id="search" value=""/>
De initialisatie van de plugin (er vanuit gaande dat je die al hebt ingeladen via <script>):
[js]
$("#search").select2({
placeholder: "Zoeken",
minimumInputLength: 1,
ajax: { // instead of writing the function to execute the request we use Select2's convenient helper
url: "",
dataType: 'json',
data: function (term, page) {
return {
q: term, // search term
page_limit: 10 // Kun je later gebruiken
};
},
results: function (data, page) { // parse the results into the format expected by Select2.
console.log(data);
}
}
});[/js]

Nu zijn er een aantal zaken die je moet wijzigen, met name het AJAX gedeelte.

De URL moet verwijzen naar het PHP script waarop je de zoekactie uit gaat voeren, vervolgens geef je met "data" aan wat er naar je script gestuurd wordt en bij "results" krijg je de reactie van het script terug.

Ik neem aan dat je bekend bent met PHP dus een database verbinding opzetten en een query uit laten voeren moet geen probleem zijn, de zoekterm die je vanuit deze plugin kunt gebruiken is binnen je script te benaderen via $_GET['q']
 
Ik heb nu dit.

ingeladen:
[js]
<link href="select2-3.5.1/select2.css" rel="stylesheet"/>
<script src="select2-3.5.1/select2.js"></script>
<script>
$(document).ready(function() { $("#e1").select2(); });
</script>[/js]

[js]<script>
$("#search").select2({
placeholder: "Zoeken",
minimumInputLength: 1,
ajax: { // instead of writing the function to execute the request we use Select2's convenient helper
url: "mypage.php",
dataType: 'json',
$row["SiteId"]: function (term, page) {
return {
q: term, // search term
page_limit: 10 // Kun je later gebruiken
};
},
results: function ($row["SiteId"], page) { // parse the results into the format expected by Select2.
console.log($row["SiteId"]);
}
}
});
</script>[/js]

HTML:
<input type="hidden" id="search" value=""/>

ongetwijfeld dat ik iets nog niet goed doe en het stukje van $_GET['q'] snap ik niet helemaal.

Iig bedankt tot zo ver ik hoop dat je me nog verder kan helpen.
 
Laatst bewerkt:
Je initialiseert nu Select2 dubbel :)

Ik zie ook dat je probeert PHP variabelen te gebruiken, zo werkt het niet ;)
Je moet je houden aan de structuur zoals de plugin deze geeft (en zoals die in de documentatie er van staat).

Select2 heeft jQuery nodig om te kunnen werken, dus die moet ook worden ingeladen.

Dit moet een Select2 box moeten tonen:
HTML:
<!doctype html>
<html lang="nl">
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
	<title></title>
	<meta name="description" content="">
	<meta name="viewport" content="width=device-width">
	<link href="select2-3.5.1/select2.css" rel="stylesheet"/>
</head>
<body>
    <input type="hidden" id="search" value="" />
	<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
	<script src="select2-3.5.1/select2.js"></script>
    <script>
    $(document).ready(function() {
        $("#search").select2({
            placeholder: "Zoeken",
            minimumInputLength: 1,
            ajax: { // instead of writing the function to execute the request we use Select2's convenient helper
                url: "mypage.php",
                dataType: 'json',
                data: function (term, page) {
                    return {
                        q: term, // search term
                        page_limit: 10 // Kun je later gebruiken
                    };
                },
                results: function (data, page) { // parse the results into the format expected by Select2.
                    console.log(data);
                }
            }
        });
    });
    </script>
</body>
</html>

Nu moet je nog een bestand "mypage.php" aanmaken waarin je verbinding met de database maakt en dan een JSON gaat genereren.

Om het simpel te houden en te controleren of het werkt is dit je eerste inhoud van mypage.php
PHP:
{"succes": true}

Wanneer je nu op de pagina bent waarin je Select2 hebt geimplementeerd en je opent de Console (In Chrome CTRL+i, Internet Explorer F12) en je typt meer dan 1 teken in het invoerveld dan moet er wat in je console verschijnen.
 
Laatst bewerkt:
Klopt. wanneer ik de 'e' intyp krijg ik else en nog een heel rijtje.

Maar ik krijg ook 3 foutmeldingen namelijk :

Uncaught ReferenceError: jQuery is not defined select2.js:39
Uncaught ReferenceError: $ is not defined Home.php:13
Uncaught SyntaxError: Unexpected token [


Dit is de code :

HTML:
 <head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
		<meta name="description" content="">
		<meta name="viewport" content="width=device-width">
		<title></title>
		<link rel="STYLESHEET" href="CSS.css" type="text/css">
		 <link href="select2-3.5.1/select2.css" rel="stylesheet"/>
		<script src="select2-3.5.1/select2.js"></script>
		<script>
        $(document).ready(function() { $("#search").select2(); });
		</script>
		
    </head>

[js]<script>
$("#search").select2({
placeholder: "Zoeken",
minimumInputLength: 1,
ajax: { // instead of writing the function to execute the request we use Select2's convenient helper
url: "myPage.php",
dataType: 'json',
data: function (term, page) {
return {
q: term, // search term
page_limit: 10 // Kun je later gebruiken
};
},
results: function (data, page) { // parse the results into the format expected by Select2.
console.log(data);
}
}
});
</script>
<input type="hidden" id="search" value="" />
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"> </script>
<script src="select2-3.5.1/select2.js"></script>
<script>
$("#search").select2({
placeholder: "Zoeken",
minimumInputLength: 1,
ajax: { // instead of writing the function to execute the request we use Select2's convenient helper
url: "myPage.php",
dataType: 'json',
data: function (term, page) {
return {
q: term, // search term
page_limit: 10 // Kun je later gebruiken
};
},
results: function (data, page) { // parse the results into the format expected by Select2.
console.log(data);
}
}
});
</script>

[/js]
 
:( Waarom gebruik je mijn code niet? Die omvat alles wat je nodig hoort te hebben.

Daarnaast hoor je niet "else" terug te krijgen. Ongeacht wat je invoert hoor je dezelfde output in je console te krijgen.
 
Sorry ik dacht dat ik die 2 samen moest voegen... Nog maar eens een paar bakke koffie pakken denk...

Oke jou code gebruikt, in het php bestandje dit neergezet

PHP:
{"succes": true}

Ik krijg in de console alleen nog steeds else, encodeURI etc terug.

edit:

Heel gek, wanneer ik f5 druk in ie zie ik geen input search, maar wanneer ik de pagina herlaad wel.
Hierdoor dacht ik dus ook dat het werkelijk niks deed..

Ik heb nu ook in Chrome gekeken en daar staat de input ook gewoon. Ik kan er iets intypen en krijg 'loading failed'.
 
Laatst bewerkt:
Dat je "Loading failed" krijgt duidt er op dat de verwijzing naar het PHP-bestand niet juist is, controleer dus of de "url" waarde overeenkomt met het pad naar het PHP-bestand en dat de bestandsnaam klopt.
 
[js]url: "myPage.php",[/js]

Meer dan dat is niet nodig toch?
In dat geval klopt de pad namelijk. Het bastandsnaam ook.
 
Laatst bewerkt:
Wellicht is een daadwerkelijke URL verplicht, dus met http://

Het kan ook zijn dat je "Loading failed" krijgt omdat je een reactie terugkrijgt die niet aan het format voldoet dat Select2 stelt, controleer dus of je wat terugkrijgt in je console.
 
Met http:// of iets dergelijks werkt het niet dan krijg ik zelffs het input veld niet.
Wat ik terug krijg is puur de code..
 
Kun je een screenshot maken? Dan is het wat makkelijker te achterhalen denk ik :)
 
En de uiteindelijke pagina (Daar ging het mij voornamelijk om :D)

Volgens mij toont een browser nooit kleuren voor HTML en is dit een screenshot van je editor :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan