You are not logged in.

  • Login

1

Friday, August 6th 2010, 2:10pm

Dynamisches Formular - Chained Checkboxes

Moin moin,

Vorweg: Ich bin in Javascript absoluter Anfänger und ich habe nicht einmal ein Referenzhandbuch da.

Ihr alle kennt sicher miteinander verknüpfte Selectboxen... Die Auswahl eines Elements in Box 1 bestimmt, welche in Box 2 zur Auswahl stehen.

Das habe ich auch (mit Hilfe von google->snippets) ganz gut hinbekommen.

Meine Boxen lesen ihre Einträge aus ner MySQL-DB aus. (PHP)

Jetzt möchte ich aber, dass nach der Auswahl in Box 2 eine Reihe von Checkboxen erscheint, bzw. vorher vorhandene Checkboxen verschwinden.

Die jeweiligen Checkboxen sollen wiederum mit Name und ID in einer Datenbanktabelle stehen.

Vielleicht kann mir jemand helfen. Ich habe zwar

Hier der Code, den ich schon habe.

start.php:

HTML Code

1
2
<script type="text/javascript" src="ajax.js"></script>
<script type="text/javascript">

JavaScript Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/************************************************************************************************************
Ajax chained select
Copyright (C) 2006  DTHMLGoodies.com, Alf Magne Kalleland
 
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
 
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.
 
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
Dhtmlgoodies.com., hereby disclaims all copyright interest in this script
written by Alf Magne Kalleland.
 
Alf Magne Kalleland, 2006
Owner of DHTMLgoodies.com
 
 
************************************************************************************************************/
var ajax = new Array();
 
function getModelList(sel){
	var brand = sel.options[sel.selectedIndex].value;
	document.getElementById('model').options.length = 0;	// Empty select box
	if(brand.length>0){
		var index = ajax.length;
		ajax[index] = new sack();
 
		ajax[index].requestFile = 'getModels.php?brand='+brand;	// Specifying which file to get
		ajax[index].onCompletion = function(){ createModels(index) };	// Specify function that will be executed after file has been found
		ajax[index].runAJAX();		// Execute AJAX function
	}
}
function createModels(index){
	var obj = document.getElementById('model');
	eval(ajax[index].response);	// Executing the response from Ajax as Javascript code	
}

HTML Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</script>
<form action="form.php" method="post" name="form" id="form" dir="ltr" lang="de">
	<fieldset><legend>Reperaturauftrag</legend>
    	<p>
    	<label>Wählen Sie Ihre Marke:</label><br />
            <select name="brand" id="brand" size="1" onchange="getModelList(this)" style="width:256px;">
                <?php include('getBrands.php'); ?>
            </select>
      </p>
        <p>
        	<label>Wählen Sie Ihr Modell:</label><br />
   	  <select name="model" id="model" size="1" style="width:256px;">
     			<? include('getModels.php'); ?>
        	</select>
		</p>
        <p>
        	<label>Was können wir für Sie tun?</label><br />
                <!--- Hier sollen die Checks hin!  !--->
        </p>
        <p>
        	<input type="submit" value=" Absenden ">
        	<input type="reset" value=" Abbrechen">
        </p>
    </fieldset>
</form>


ajax.js:

JavaScript Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
/* Simple AJAX Code-Kit (SACK) v1.6.1 */
/* ©2005 Gregory Wild-Smith */
/* www.twilightuniverse.com */
/* Software licenced under a modified X11 licence,
   see documentation or authors website for more details */
 
function sack(file) {
	this.xmlhttp = null;
 
	this.resetData = function() {
		this.method = "POST";
  		this.queryStringSeparator = "?";
		this.argumentSeparator = "&";
		this.URLString = "";
		this.encodeURIString = true;
  		this.execute = false;
  		this.element = null;
		this.elementObj = null;
		this.requestFile = file;
		this.vars = new Object();
		this.responseStatus = new Array(2);
  	};
 
	this.resetFunctions = function() {
  		this.onLoading = function() { };
  		this.onLoaded = function() { };
  		this.onInteractive = function() { };
  		this.onCompletion = function() { };
  		this.onError = function() { };
		this.onFail = function() { };
	};
 
	this.reset = function() {
		this.resetFunctions();
		this.resetData();
	};
 
	this.createAJAX = function() {
		try {
			this.xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e1) {
			try {
				this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e2) {
				this.xmlhttp = null;
			}
		}
 
		if (! this.xmlhttp) {
			if (typeof XMLHttpRequest != "undefined") {
				this.xmlhttp = new XMLHttpRequest();
			} else {
				this.failed = true;
			}
		}
	};
 
	this.setVar = function(name, value){
		this.vars[name] = Array(value, false);
	};
 
	this.encVar = function(name, value, returnvars) {
		if (true == returnvars) {
			return Array(encodeURIComponent(name), encodeURIComponent(value));
		} else {
			this.vars[encodeURIComponent(name)] = Array(encodeURIComponent(value), true);
		}
	}
 
	this.processURLString = function(string, encode) {
		encoded = encodeURIComponent(this.argumentSeparator);
		regexp = new RegExp(this.argumentSeparator + "|" + encoded);
		varArray = string.split(regexp);
		for (i = 0; i < varArray.length; i++){
			urlVars = varArray[i].split("=");
			if (true == encode){
				this.encVar(urlVars[0], urlVars[1]);
			} else {
				this.setVar(urlVars[0], urlVars[1]);
			}
		}
	}
 
	this.createURLString = function(urlstring) {
		if (this.encodeURIString && this.URLString.length) {
			this.processURLString(this.URLString, true);
		}
 
		if (urlstring) {
			if (this.URLString.length) {
				this.URLString += this.argumentSeparator + urlstring;
			} else {
				this.URLString = urlstring;
			}
		}
 
		// prevents caching of URLString
		this.setVar("rndval", new Date().getTime());
 
		urlstringtemp = new Array();
		for (key in this.vars) {
			if (false == this.vars[key][1] && true == this.encodeURIString) {
				encoded = this.encVar(key, this.vars[key][0], true);
				delete this.vars[key];
				this.vars[encoded[0]] = Array(encoded[1], true);
				key = encoded[0];
			}
 
			urlstringtemp[urlstringtemp.length] = key + "=" + this.vars[key][0];
		}
		if (urlstring){
			this.URLString += this.argumentSeparator + urlstringtemp.join(this.argumentSeparator);
		} else {
			this.URLString += urlstringtemp.join(this.argumentSeparator);
		}
	}
 
	this.runResponse = function() {
		eval(this.response);
	}
 
	this.runAJAX = function(urlstring) {
		if (this.failed) {
			this.onFail();
		} else {
			this.createURLString(urlstring);
			if (this.element) {
				this.elementObj = document.getElementById(this.element);
			}
			if (this.xmlhttp) {
				var self = this;
				if (this.method == "GET") {
					totalurlstring = this.requestFile + this.queryStringSeparator + this.URLString;
					this.xmlhttp.open(this.method, totalurlstring, true);
				} else {
					this.xmlhttp.open(this.method, this.requestFile, true);
					try {
						this.xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
					} catch (e) { }
				}
 
				this.xmlhttp.onreadystatechange = function() {
					switch (self.xmlhttp.readyState) {
						case 1:
							self.onLoading();
							break;
						case 2:
							self.onLoaded();
							break;
						case 3:
							self.onInteractive();
							break;
						case 4:
							self.response = self.xmlhttp.responseText;
							self.responseXML = self.xmlhttp.responseXML;
							self.responseStatus[0] = self.xmlhttp.status;
							self.responseStatus[1] = self.xmlhttp.statusText;
 
							if (self.execute) {
								self.runResponse();
							}
 
							if (self.elementObj) {
								elemNodeName = self.elementObj.nodeName;
								elemNodeName.toLowerCase();
								if (elemNodeName == "input"
								|| elemNodeName == "select"
								|| elemNodeName == "option"
								|| elemNodeName == "textarea") {
									self.elementObj.value = self.response;
								} else {
									self.elementObj.innerHTML = self.response;
								}
							}
							if (self.responseStatus[0] == "200") {
								self.onCompletion();
							} else {
								self.onError();
							}
 
							self.URLString = "";
							break;
					}
				};
 
				this.xmlhttp.send(this.URLString);
			}
		}
	};
 
	this.reset();
	this.createAJAX();
}



getBrands.php:

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
	include('db_config.php');
	if (mysqli_connect_errno() == 0){
		$sql = 'SELECT `ID`, `name` FROM `brands`';
		$result = $db->query( $sql );
		while ($row = $result->fetch_object()){
			echo '<option value="'.$row->ID.'">'.$row->name.'</option>';
		}
		$result->close();
	}
	else
	{
		echo 'Die Datenbank konnte nicht erreicht werden. Folgender Fehler trat auf: <strong>'.mysqli_connect_errno().' : '.mysqli_connect_error().'</strong>';
	}
	$db->close();
?>


getModels.php:

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
 
if(isset($_GET['brand'])){
 
  	include('db_config.php');
	if (mysqli_connect_errno() == 0){
		$sql = 'SELECT `ID`, `brandID`, `name` FROM `models` WHERE brandID="'.$_GET['brand'].'" ORDER BY `ID` DESC';
		$result = $db->query( $sql );
		while ($row = $result->fetch_object()){
			echo "obj.options[obj.options.length] = new Option('".$row->name."','".$row->ID."');\n";
		}
		$result->close();
	}
	else
	{
		echo 'Die Datenbank konnte nicht erreicht werden. Folgender Fehler trat auf: <strong>'.mysqli_connect_errno().' : '.mysqli_connect_error().'</strong>';
	}
	$db->close();
 
 
} else {
	include('db_config.php');
	if (mysqli_connect_errno() == 0){
		$sql = 'SELECT `ID`, `brandID`, `name` FROM `models` WHERE brandID="1" ORDER BY `ID` DESC';
		$result = $db->query( $sql );
		while ($row = $result->fetch_object()){
			echo '<option value="'.$row->ID.'">'.$row->name.'</option>';
		}
		$result->close();
	}
	else
	{
		echo 'Die Datenbank konnte nicht erreicht werden. Folgender Fehler trat auf: <strong>'.mysqli_connect_errno().' : '.mysqli_connect_error().'</strong>';
	}
	$db->close();
}
 
?>


Die dbconfig.php geb ich mal nich raus. Versteht sich denk ich... DB läuft ja auch.

2

Friday, August 6th 2010, 6:40pm

Hi,
das ist doch ungefähr das selbe was in unserem Wiki erklärt wird: Select-Auswahl mit AJAX Abhängigkeit, oder?
Und das verschwinden, etc wird auch gemanaged, siehe Demo: http://demo.easy-coding.de/ajax/select-a…x-abhaengigkeit

3

Friday, August 6th 2010, 10:12pm

Ja, ungefähr. Nur eben, dass ich das schon habe. Was mir fehlt wäre eine Beschreibung, wie ich auf diese Art (also via onChange-Event je nach Auswahl in der letzten Selectbox) Checkboxen baue... Ich hab google schon gefragt, aber ich finde immer nur, wie man die stylet (was ich selbst kann) oder wie man die setzt bzw. cleart.

4

Saturday, August 7th 2010, 12:08pm

Quoted

Jetzt möchte ich aber, dass nach der Auswahl in Box 2 eine Reihe von Checkboxen erscheint, bzw. vorher vorhandene Checkboxen verschwinden.

Quoted

Was mir fehlt wäre eine Beschreibung, wie ich auf diese Art (also via onChange-Event je nach Auswahl in der letzten Selectbox) Checkboxen baue...

Mir ist leider immer noch nicht ganz klar, was dir fehlt.

Du willst statt einer Auswahlliste Checkboxen haben? Checkboxen erlauben ja im Gegensatz zu radio und Select Formularen eine Mehrfachauswahl. Willst du das erreichen?

5

Saturday, August 7th 2010, 1:16pm

OK, dann beschreibe ich jetzt einfach mal mein Vorhaben im Detail.

1.) Man wählt seine Handymarke
2.) Man wählt sein Modell (wobei in der Selectbox nur die zur Marke gehörigen Modelle gezeigt werden...)
3.) Man wählt aus verschiedenen Reperaturdienstleistungen aus. (Die wiederum vom Handy abhängen...) Hier soll Mehrfachwahl möglich sein.
Zusätzlich kann man in ne Textbox Wünsche schreiben, die dann überprüft werden, aber das geht bei jeder Marke ist also statisch.

Was ich will, ist dass eben je nach Marke und Modell nur bestimmte Checkboxen vorhanden sind. Deshalb müsste ich die über Javascript (oder PHP, wenn das möglich wäre) je nach Auswahl extra bauen.

6

Saturday, August 7th 2010, 2:45pm

Okay, das Ziel ist nun klar.

Was hast du schon? Das solltest du mit den bisherigen Kenntnissen bauen können.

Meilenstein 1
Von der Handymarke kommst du zum Model, vom Model kommst du zu einer Auswahlliste von Reperaturdiensleistungen.

Meilenstein 2
Nun musst du im letzten Schritt die Select Options durch Input Checkboxen ersetzen. Am besten du platzierst für den Anfang irgendwo ein div mit einer id="auswahl"

und deine PHP Datei macht dann folgendes

PHP Quellcode

1
document.getElementById('auswahl').innerHTML += '<input type="checkbox" name="rep[]" value="hans" /> Hans<br/>';


Meilenstein 3
abrunden des ganzen.. div korrekt positionieren, etc

7

Sunday, August 8th 2010, 1:47pm

Danke, es läuft nun.

Falls jmd mal mit dem selben Problem zu kämpfen hat, hier meine Lösung:
index.php

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<script type="text/javascript" src="ajax.js"></script>
<script type="text/javascript">
var ajax = new Array();
function getModelList(sel){
	var brand = sel.options[sel.selectedIndex].value;
	document.getElementById('model').options.length = 0;	// Empty select box
	if(brand.length>0){
		var index = ajax.length;
		ajax[index] = new sack();
 
		ajax[index].requestFile = 'getModels.php?brand='+brand;	// Specifying which file to get
		ajax[index].onCompletion = function(){ createModels(index) };	// Specify function that will be executed after file has been found
		ajax[index].runAJAX();		// Execute AJAX function
	}
}
function createModels(index){
	var obj = document.getElementById('model');
	eval(ajax[index].response);	// Executing the response from Ajax as Javascript code	
}
function getRepairList(sel){
	var model = sel.options[sel.selectedIndex].value;
	document.getElementById('repairs').innerHTML = '';
	if(model.length>0){
		var index = ajax.length;
		ajax[index] = new sack();
 
		ajax[index].requestFile = 'getRepairs.php?model='+model;	// Specifying which file to get
		ajax[index].onCompletion = function(){ createRepairs(index) };	// Specify function that will be executed after file has been found
		ajax[index].runAJAX();		// Execute AJAX function
	}
}
function createRepairs(index){
	var obj = document.getElementById('repairs');
	eval(ajax[index].response);	// Executing the response from Ajax as Javascript code	
}
</script>
<form action="process.php" method="post" name="form" id="form" dir="ltr" lang="de">
	<fieldset><legend>Reperaturauftrag</legend>
    	<p>
    	<label>Wählen Sie Ihre Marke:</label><br />
            <select name="brand" id="brand" size="1" onChange="getModelList(this)" style="width:256px;">
                <? include('getBrands.php'); ?>
            </select>
      </p>
        <p>
        	<label>Wählen Sie Ihr Modell:</label><br />
   	  <select name="model" id="model" size="1" onChange="getRepairList(this)" style="width:256px;">
     			<? include('getModels.php'); ?>
        	</select>
		</p>
        <p id="repairs">Das hier sollte onChange verschwinden!</p>
        <p>
        	<input type="submit" value=" Absenden ">
        </p>
    </fieldset>
</form>


getRepairs.php

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
if(isset($_GET['model'])){
  	include('db_config.php');
	if (mysqli_connect_errno() == 0){
		$sql = 'SELECT `ID`, `modelID`, `name` FROM `repairs` WHERE modelID="'.$_GET['model'].'" ORDER BY `ID` DESC';
		$result = $db->query( $sql );
		while ($row = $result->fetch_object()){
			echo "obj.innerHTML += '<input type=\"checkbox\" value=\"".$row->ID."\" /> ".$row->name."<br />';\n";
		}
		$result->close();
	}
	else
	{
		echo 'Die Datenbank konnte nicht erreicht werden. Folgender Fehler trat auf: <strong>'.mysqli_connect_errno().' : '.mysqli_connect_error().'</strong>';
	}
	$db->close();
}
?>


ajax.js, getModels.php, getBrands.php aus vorigem Post übernehmen.

Danke nochmal an d0nut.

Similar threads

Social bookmarks