Bedoeling is om met > de velden te selecteren in de linkerkolom die moeten worden weergegeven in de lijst. De volgorde wordt weergegeven in de rechtse kolom.
Met < wordt het geselecteerde veld verwijderd uit de rechterkolom.
Dit zal voornamelijk een JavaScript aangelegenheid zijn, je hebt "enkel" PHP nodig om de lijst(en) te voorzien van waarden en initiële selecties maar dit is waarschijnlijk voor je vraagstuk (in vergelijking met de rest) triviaal (is onderdeel van de initialisatie van je gegevens).
Heb je al gezocht op "multiselect" in combinatie met jQuery (een JavaScript framework)?
Met de zoekopdracht "jquery multi select list" vind je vele varianten. Tenzij je je eigen ding wilt rollen? Je bent niet de eerste persoon die naar deze functionaliteit zoekt dus grote kans dat iemand anders jouw wiel al heeft uitgevonden.
Is zelfde functionaliteit als jij wilt denk ik, alleen dan een stuk professioneler qua design.
Als je dan opslaat, dan kun je even kijken hoe dat in de POST komt met:
Ik heb uw code getest en dat ziet er al héél goed uit!
Thomas - 11/06/2014 19:53 (laatste wijziging 12/06/2014 10:53)
Moderator
Het zou ook mogelijk moeten zijn om op dezelfde pagina / in hetzelfde formulier meerdere "moveselects" aan te maken (dit heb ik eigenlijk niet eens getest ). Het enige waar je dan op moet letten is dat de namen van de id's beginnen met een vast voorvoegsel, en vervolgens maak je meerdere JavaScript-objecten van het type moveselect() aan.
En je zult dus ook een referentie naar de (unieke) naam van het formulier moeten opgeven om ervoor te zorgen dat op het moment van versturen alle opties in de "selected" selectbox ook daadwerkelijk geselecteerd worden, anders worden deze velden niet verstuurd. Deze referentie alleen is genoeg: de rest wordt door de moveselect-functionaliteit afgehandeld.
EDIT: twee moveselects werkt ook, vervang de body simpelweg door:
Op dezelfde manier kun je zoveel moveselects aanmaken als je wilt, de moveselect-functionaliteit kun je hergebruiken.
EDIT:
Aanpassing in de moveselect functie: het is nu mogelijk om opties in een custom volgorde te selecteren die onthouden wordt. Geef hiertoe bij de creatie de parameter 'customOrder': true mee.
De aangepaste code voor de moveselect (relevante delen regels 25-27, 74-88):
function moveselect() {
this.$form = false; // quick ref: jQuery object of the form, to really select options on submit
this.$selectable = false; // quick ref: jQuery object of selectable select-dropdown
this.$selected = false; // quick ref: jQuery object of selected select-dropdown
this.$buttonSelect = false;
this.$buttonUnselect = false;
this.options = {}; // key-value pairs
this.selected = []; // (unique) keys
this.init = function(options) {
// init jQuery objects linked to HTML elements
this.$form = $('#'+options.formid);
this.$selectable = $('#'+options.id+'_selectable');
this.$selected = $('#'+options.id+'_selected');
this.$buttonSelect = $('#'+options.id+'_select');
this.$buttonUnselect = $('#'+options.id+'_unselect');
this.customOrder = false;
// init selectable/selected options
this.options = options.options; // all the options, to remember order
if (options.selected) {
this.selected = options.selected;
}
if (options.customOrder) {
this.customOrder = options.customOrder;
}
// init listener events of buttons
var that = this;
// select
this.$buttonSelect.click(function(e) {
e.preventDefault();
// add the selected items to that.selected
that.$selectable.find(':selected').each(function() {
that.selected[that.selected.length] = $(this).val();
});
// redraw
that.update();
});
// unselect
this.$buttonUnselect.click(function(e) {
e.preventDefault();
// rebuild that.selected, clearing the selected items
that.selected = []; // reset
that.$selected.children().each(function() {
if (!$(this).is(':selected')) {
that.selected[that.selected.length] = $(this).val();
}
});
// redraw
that.update();
});
// when submitting the form, select all the selected items, otherwise nothing will be sent
this.$form.submit(function() {
that.$selected.find('option').each(function() {
$(this).attr('selected', 'selected');
});
});
// finally fill select boxes
this.update();
}
// fill selects with (de)selected options
this.update = function() {
// first clear all
this.$selectable.html('');
this.$selected.html('');
// traverse options
if (this.customOrder) {
// maintain order of the order in which items were selected
// build selectable list
for (var k in this.options) {
if (this.selected.indexOf(k) == -1) {
// item was not selected, print it in selectable list
this.$selectable.append('<option value="'+k+'">'+this.options[k]+'</option>');
}
}
// build selected list
for (var k in this.selected) {
var v = this.selected[k];
this.$selected.append('<option value="'+v+'">'+this.options[v]+'</option>');
}
} else {
for (var k in this.options) {
// use k in arr for key check, use arr.indexOf(k) > -1 for value check
if (this.selected.indexOf(k) > -1) {
this.$selected.append('<option value="'+k+'">'+this.options[k]+'</option>');
} else {
this.$selectable.append('<option value="'+k+'">'+this.options[k]+'</option>');
}
}
}
}
}
function moveselect(){
this.$form =false;// quick ref: jQuery object of the form, to really select options on submit
this.$selectable =false;// quick ref: jQuery object of selectable select-dropdown
this.$selected =false;// quick ref: jQuery object of selected select-dropdown
EDIT:
Aanpassing in de moveselect functie: het is nu mogelijk om opties in een custom volgorde te selecteren die onthouden wordt. Geef hiertoe bij de creatie de parameter 'customOrder': true mee.
Heb dit getest, en dat was inderdaad wat ik nog nodig had! Nu werkt het wel volledig naar mijn wensen!
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.