Ik ben een totale PHP-nitwit, en gebruik het alleen voor het versturen van een mailformulier. Nu is het de bedoeling dat er in dat formulier ook een redelijk geavanceerde date selector komt: met vermelding van weekdag, dag, maand en jaar, en die het juiste aantal dagen bij elke maand vermeld. Ik heb veel gezocht, maar kon zoiets niet vinden in een kant-en-klaar php-script. Ik heb wel een javascript gevonden die dit precies doet. Als ik echter dat javascript in mijn pagina binnen de form-tags plaats, werkt het formulier niet meer. (Als ik op Submit klik, gebeurt er niks.) Ik heb inmiddels begrepen dat dit vaker voorkomt (probleem server side client side), ik vraag me alleen af of er een manier is om dit op te lossen. Zo nee, dan moet ik het idee van de javascript date selector loslaten.
Het klinkt een beetje als een syntax error of iets vergelijkbaar. Zou je de broncode van het resultaat, het script dat je nu inclusief de datepicker hebt hier kunnen posten, of in een pastebin en er even naar verwijzen? Dan kunnen we er hier eens naar kijken waar de fout zit. Zonder de broncode is het niet meer dan puur giswerk.
Ik zal de drie afzonderlijke onderdelen hieronder plaatsen. Als je de reserveren-pagina en de date-pagina afzonderlijk van elkaar oproept, werken ze goed. Ik heb geprobeerd het javascript in de cel te plaatsen, in plaats van het huidige select-veld. Ik heb allerlei variaties geprobeerd met input hidden, zonder input, en de ene keer staat de selector er wel, maar gebeurt er niks als je op submit klikt, en de andere keer staat de hele selectr er niet. Ik hoop dat je hier iets mee kunt! Dit zijn de drie losse onderdelen:
ModEdit: Sorry Esther, maar post alleen de relevante code en geen honderden regels. Ik heb deze enorm lange code daarom verwijderd.

SanThe.
Oei, ik weet niet of dit wel goed geplaatst is.... Ik heb ook geen ervaring met het posten van berichten op een forum. Ik hoor het wel als ik het op een andere manier moet plaatsen. In ieder geval bedankt!
1. Plaats alleen relevante code
2. Plaats je code tussen: [ignore]
[/ignore] en [ignore] 
[/ignore] tags
Uh, ik weet niet precies wat relevant is. Ik zal hieronder het javascript plaatsen van de date selector. En sorry: dat is nou eenmaal een lange code, omdat het van alles doet. Het zorgt dat de maanden precies het juiste aantal dagen krijgen (incl. schrikkeljaren), het bepaalt welke dag van de week een bepaalde datum is... Het bestaat dus uit meerdere functies, waardoor ik er volgens mij ook niet slechts 1 kan oproepen in het formulier.

Verder heb ik een pagina met daarin een php-form waar deze code in verwerkt moet worden. Momenteel staat er een simpele textarea als datum, maar daar moet dus de date selector voor in de plaats komen. De link naar deze pagina is:
http://www.enotecadanoi.nl/reserveren.php

Mocht het php-script ook nodig zijn, dan hoor ik graag waar en hoe ik dit kan plaatsen.

Ik heb geen resultaten toegevoegd waarin ik het javascript heb ingebouwd, want dat heb ik al op tien (onsuccesvolle) manieren geprobeerd. (En deze heb ik niet allemaal bewaard.)

Javascript:

<script language="JavaScript1.1">
<!--
var min_year = 2007; 
var max_year = 2009; 

var weekday_showing = true;

var dayofweek_returned_as_number = false;

var month_returned_as_number = false;

if (min_year <= 400)
 alert(".");

function changeDays(numb,date_form) {
 mth = date_form.month.selectedIndex;
 sel = date_form.year.selectedIndex;
 yr = date_form.year.options[sel].text;
 if (numb != 1) {
  numDays = numDaysIn(mth,yr);
  date_form.day.options.length = numDays;
  for (i=27;i<numDays;i++) {
   date_form.day.options[i].text = i+1;
  }
 }
 day = date_form.day.selectedIndex+1;
 if (weekday_showing)
  date_form.dayofweek.selectedIndex = getWeekDay(mth,day,yr);
}
function numDaysIn(mth,yr) {
 if (mth==3 || mth==5 || mth==8 || mth==10) return 30;
 else if ((mth==1) && leapYear(yr)) return 29;
 else if (mth==1) return 28;
 else return 31;
}
function leapYear(yr) {
 if (((yr % 4 == 0) && yr % 100 != 0) || yr % 400 == 0)
  return true;
 else
  return false;
}
function arr() {
 this.length=arr.arguments.length;
 for (n=0;n<arr.arguments.length;n++) {
  this[n] = arr.arguments[n];
 }
}

weekdays = new arr("Zondag","Maandag","Dinsdag","Gesloten!",
 "Donderdag","Vrijdag","Zaterdag");
 
months = new arr("Januari","Februari","Maart","April","Mei",
 "Juni","Juli","Augustus","September","Oktober","November","December");
var cur = new Date();
 
function getWeekDay(mth,day,yr) {
 first_day = firstDayOfYear(yr);
 for (num=0;num<mth;num++) {
  first_day += numDaysIn(num,yr);
 }
 first_day += day-1;
 return first_day%7;
}
function firstDayOfYear(yr) {
 diff = yr - 401;
 return parseInt((1 + diff + (diff / 4) - (diff / 100) + (diff / 400)) % 7);
}
function getFullYear(d) { // d is af date object
 yr = d.getYear();
 if (yr < 1000)
  yr+=1900;
 return yr;
}

if (weekday_showing) {
 document.write("<select name=dayofweek size=1>");
 for (i=0;i<7;i++)
  document.write("<option"+(dayofweek_returned_as_number?" value="+i:"")
   +(cur.getDay()==i?" selected":"")+">"+weekdays[i]+"\n");
 document.write("</select>");
}


document.write("<select name=month "
 + "onChange='changeDays(0,this.form)' size=1>");
for (i=0;i<12;i++)
 document.write("<option"+(month_returned_as_number?" value="+i:"")
  +(cur.getMonth()==i?" selected":"")+">"+months[i]+"\n");


document.write("</select><select name=day size=1 "
 + "onChange='changeDays(1,this.form)'>\n");
for (i=1;i<=numDaysIn(cur.getMonth(),getFullYear(cur));i++)
 document.write("<option"+(cur.getDate()==i?" selected":"")+">"+i+"\n");


document.write("</select><select name=year "
 + "onChange='changeDays(0,this.form)' size=1>\n");
for (i=min_year;i<max_year;i++)
 document.write("<option"+(getFullYear(cur)==i?" selected":"")+">"+i+"\n");
document.write("</select></form>");
// -->
</script>
Waarschijn gaat het fout omdat de code aan het einde dit doet:

document.write("</select></form>");

Als je nu deze code binnen in je form plaatst, heb je twee keer een sluittag </form> en kan het zijn dat je formulier niet meer werkt.

Ik heb een voorbeeldpagina voor je gemaakt waarop je kunt zien dat het werkt:
JavaScript Date Selector
Bekijk die maar even. Hieronder de broncode:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>Jan Koehoorn | JavaScript Date Selector</title>
</head>
<body>
<form method="post" action="#">
	<fieldset>
	<script language="JavaScript1.1">
		<!--
		var min_year = 2007; 
		var max_year = 2009; 
		
		var weekday_showing = true;
		
		var dayofweek_returned_as_number = false;
		
		var month_returned_as_number = false;
		
		if (min_year <= 400)
		 alert(".");
		
		function changeDays(numb,date_form) {
		 mth = date_form.month.selectedIndex;
		 sel = date_form.year.selectedIndex;
		 yr = date_form.year.options[sel].text;
		 if (numb != 1) {
		  numDays = numDaysIn(mth,yr);
		  date_form.day.options.length = numDays;
		  for (i=27;i<numDays;i++) {
		   date_form.day.options[i].text = i+1;
		  }
		 }
		 day = date_form.day.selectedIndex+1;
		 if (weekday_showing)
		  date_form.dayofweek.selectedIndex = getWeekDay(mth,day,yr);
		}
		function numDaysIn(mth,yr) {
		 if (mth==3 || mth==5 || mth==8 || mth==10) return 30;
		 else if ((mth==1) && leapYear(yr)) return 29;
		 else if (mth==1) return 28;
		 else return 31;
		}
		function leapYear(yr) {
		 if (((yr % 4 == 0) && yr % 100 != 0) || yr % 400 == 0)
		  return true;
		 else
		  return false;
		}
		function arr() {
		 this.length=arr.arguments.length;
		 for (n=0;n<arr.arguments.length;n++) {
		  this[n] = arr.arguments[n];
		 }
		}
		
		weekdays = new arr("Zondag","Maandag","Dinsdag","Gesloten!",
		 "Donderdag","Vrijdag","Zaterdag");
		 
		months = new arr("Januari","Februari","Maart","April","Mei",
		 "Juni","Juli","Augustus","September","Oktober","November","December");
		var cur = new Date();
		 
		function getWeekDay(mth,day,yr) {
		 first_day = firstDayOfYear(yr);
		 for (num=0;num<mth;num++) {
		  first_day += numDaysIn(num,yr);
		 }
		 first_day += day-1;
		 return first_day%7;
		}
		function firstDayOfYear(yr) {
		 diff = yr - 401;
		 return parseInt((1 + diff + (diff / 4) - (diff / 100) + (diff / 400)) % 7);
		}
		function getFullYear(d) { // d is af date object
		 yr = d.getYear();
		 if (yr < 1000)
		  yr+=1900;
		 return yr;
		}
		
		if (weekday_showing) {
		 document.write("<select name=dayofweek size=1>");
		 for (i=0;i<7;i++)
		  document.write("<option"+(dayofweek_returned_as_number?" value="+i:"")
		   +(cur.getDay()==i?" selected":"")+">"+weekdays[i]+"\n");
		 document.write("</select>");
		}
		
		
		document.write("<select name=month "
		 + "onChange='changeDays(0,this.form)' size=1>");
		for (i=0;i<12;i++)
		 document.write("<option"+(month_returned_as_number?" value="+i:"")
		  +(cur.getMonth()==i?" selected":"")+">"+months[i]+"\n");
		
		
		document.write("</select><select name=day size=1 "
		 + "onChange='changeDays(1,this.form)'>\n");
		for (i=1;i<=numDaysIn(cur.getMonth(),getFullYear(cur));i++)
		 document.write("<option"+(cur.getDate()==i?" selected":"")+">"+i+"\n");
		
		
		document.write("</select><select name=year "
		 + "onChange='changeDays(0,this.form)' size=1>\n");
		for (i=min_year;i<max_year;i++)
		 document.write("<option"+(getFullYear(cur)==i?" selected":"")+">"+i+"\n");
		document.write("</select>");
		// -->
		</script>
	<p>
		<input type="submit" value="verzenden" />
	</p>
	</fieldset>
</form>
<?php
		if ($_SERVER['REQUEST_METHOD'] == 'POST') {
			echo '<pre>';
			print_r ($_POST);
			echo '</pre>';
		}
	?>
</body>
</html>
Hé-le-maal geweldig! Zo werkt het inderdaad. Nu nog even verder kijken of het javascript op wat kleine punten aangepast kan worden, maar aangezien dit een php-forum is, zal ik dat elders zoeken ;) Maar ook als het niet aangepast kan worden, is dit de beste optie voor de site, en die werkt nu! Hartstikke bedankt!

Reageren