datum optellen na selectie periode
lau - 26/12/2008 13:24
HTML interesse
Ik heb een formulier gemaakt waarin je startdatum (dag/maand/jaar) moet selecteren dmv dropdowns
Vervolgens moet je aantal periodes in maanden selecteren.
Daaronder moet dan de output van einddatum staan die dus startdatum + periodes heeft opgeteld.
Maar ik heb geen flauw idee hoe ik dat het beste in javascript kan doen. Ik wil liever niet met PHP doen, omdat het dan moet refreshen.
21 antwoorden
Gesponsorde links
mathiasB - 26/12/2008 14:29
HTML interesse
Kan je even een html pagina hiervan tonen of een screenshot? want ik zie de bedoelig niet echt.
Gerard - 27/12/2008 02:17
Ouwe rakker
refresh hoeft natuurlijk niet als je gebruik maakt van ajax. Op die manier kan je de kracht van PHP combineren.
mathiasB - 27/12/2008 18:32
HTML interesse
Werkt
<select name="startdag" id="startdag" onChange="javascriptfunctie()">
<select name = "startdag" id = "startdag" onChange = "javascriptfunctie()" >
niet?
lau - 27/12/2008 21:35
HTML interesse
whaha.. jah... ik heb wel een functie.. maar hij telt aantal maanden niet goed bij op.
lau - 28/12/2008 22:31
HTML interesse
@mathias.. nee.. daar begin ik niet aan. Voor elk ander maand geldt weer een ander combinatie.
henver - 29/12/2008 20:29 (laatste wijziging 29/12/2008 20:30)
HTML gevorderde
Pagina met formulier:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Datum</title>
</head>
<body>
<script language="javascript" type="text/javascript">
<!--
// Get the HTTP Object
function getHTTPObject(){
if (window.ActiveXObject) return new ActiveXObject("Microsoft.XMLHTTP");
else if (window.XMLHttpRequest) return new XMLHttpRequest();
else {
alert("Uw browser oncdersteunt geen Ajax.");
return null;
}
}
// Change the value of the outputText field
function setOutput(){
if(httpObject.readyState == 4){
document.getElementById('einddatum').innerHTML = httpObject.responseText;
}
}
// Implement business logic
function doWork(){
httpObject = getHTTPObject();
if (httpObject != null) {
httpObject.open("GET", "datum.php?dag="+document.getElementById('dag').value+"&maand="+document.getElementById('maand').value+"&jaar="+document.getElementById('jaar').value+"&periode="+document.getElementById('periode').value, true);
httpObject.send(null);
httpObject.onreadystatechange = setOutput;
}
}
var httpObject = null;
//-->
</script>
<form name="datum">
<table><tr><td>Dag: </td>
<td><select name="dag" id="dag" onchange="doWork();">
<option value=""></option>
<option value="1">1</option>
<option value="2">2</option>
</select>
</td></tr>
<tr><td>Maand: </td>
<td><select name="maand" id="maand" onchange="doWork();">
<option value=""></option>
<option value="1">Januari</option>
<option value="2">Februari</option>
</select>
</td></tr>
<tr><td>Jaar: </td>
<td><select name="jaar" id="jaar" onchange="doWork();">
<option value=""></option>
<option value="2000">2000</option>
<option value="2001">2001</option>
</select>
</td></tr>
<tr><td>Periode:
<td><select name="periode" id="periode" onchange="doWork();">
<option value=""></option>
<option value="2592000">1 maand</option>
<option value="5184000">2 maanden</option>
</select>
</td></tr>
<tr><td>Einddatum: </td>
<td><span id="einddatum"></span></td></tr></table>
</form>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns= "http://www.w3.org/1999/xhtml" > <meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" / >
<script language = "javascript" type = "text/javascript" > <!--
// Get the HTTP Object
function getHTTPObject(){
if (window.ActiveXObject) return new ActiveXObject("Microsoft.XMLHTTP");
else if (window.XMLHttpRequest) return new XMLHttpRequest();
else {
alert("Uw browser oncdersteunt geen Ajax.");
return null;
}
}
// Change the value of the outputText field
function setOutput(){
if(httpObject.readyState == 4){
document.getElementById('einddatum').innerHTML = httpObject.responseText;
}
}
// Implement business logic
function doWork(){
httpObject = getHTTPObject();
if (httpObject != null) {
httpObject.open("GET", "datum.php?dag="+document.getElementById('dag').value+"&maand="+document.getElementById('maand').value+"&jaar="+document.getElementById('jaar').value+"&periode="+document.getElementById('periode').value, true);
httpObject.send(null);
httpObject.onreadystatechange = setOutput;
}
}
var httpObject = null;
//-->
<td ><select name = "dag" id = "dag" onchange = "doWork();" > <td ><select name = "maand" id = "maand" onchange = "doWork();" > <td ><select name = "jaar" id = "jaar" onchange = "doWork();" > <td ><select name = "periode" id = "periode" onchange = "doWork();" >
datum.php:
<?
$dag = (int)$_GET['dag'];
$maand = (int)$_GET['maand'];
$jaar = (int)$_GET['jaar'];
$periode = (int)$_GET['periode'];
if($dag != '' && $maand != '' && $jaar != '' && $periode != ''){
$datum = mktime(0,0,0,$maand,$dag,$jaar);
$einddatum = $datum + $periode;
$einddatum = date("d/m/Y", $einddatum);
echo $einddatum;
}
?>
<?
$dag = ( int) $_GET [ 'dag' ] ;
$maand = ( int) $_GET [ 'maand' ] ;
$jaar = ( int) $_GET [ 'jaar' ] ;
$periode = ( int) $_GET [ 'periode' ] ;
if ( $dag != '' && $maand != '' && $jaar != '' && $periode != '' ) {
$datum = mktime ( 0 , 0 , 0 , $maand , $dag , $jaar ) ;
$einddatum = $datum + $periode ;
$einddatum = date ( "d/m/Y" , $einddatum ) ;
}
?>
Omerking: Periodes zijn in secondes
lau - 29/12/2008 23:24
HTML interesse
Vreemd genoeg geef hij bij 31 december 2008 met 2 maanden dit aan: 03/03/2009.
Terwijl ik als ik dit met MySQL output er keurig 28 februari 2009 uit komt.
henver - 29/12/2008 23:40
HTML gevorderde
Ja, hangt ervan af hoeveel dagen er voor een maand worden gekozen. Weet niet of er in PHP iets bestaat om dit exact te berekenen. Maar je snapt nu wel in ieder geval het principe denk ik (hoe je met Javascript (Ajax) kunt communiceren met een andere pagina).
lau - 29/12/2008 23:43
HTML interesse
Ja, veel minder javascript dan ik dacht, ik vreesde dat ik weer die pakketten moest includen zoals scriptaculous.
Maar in PHP kan ik niets vinden over exact maand uitrekening.
Ik heb nu dit:
$dag = (int)$_GET['dag'];
$maand = (int)$_GET['maand'];
$jaar = (int)$_GET['jaar'];
$periode = (int)$_GET['periode'];
if($dag != '' && $maand != '' && $jaar != '' && $periode != ''){
$datum = mktime(0,0,0,$maand+$periode,$dag,$jaar);
$einddatum = date("d/m/Y", $datum);
echo $einddatum;
}
$dag = ( int) $_GET [ 'dag' ] ;
$maand = ( int) $_GET [ 'maand' ] ;
$jaar = ( int) $_GET [ 'jaar' ] ;
$periode = ( int) $_GET [ 'periode' ] ;
if ( $dag != '' && $maand != '' && $jaar != '' && $periode != '' ) {
$datum = mktime ( 0 , 0 , 0 , $maand + $periode , $dag , $jaar ) ;
$einddatum = date ( "d/m/Y" , $datum ) ;
}
Waarbij ik exact +1 als het 1 maand is en +2 als het 2 maanden is etc.
henver - 29/12/2008 23:47
HTML gevorderde
Ja maar daar moet je mee oppassen: sommige dagen hebben 30 dagen, sommige 31 en februari 28 of 29. Dus dit klopt niet altijd. Ook de maanden zullen niet altijd kloppen: het is bijvoorbeeld augustus (8) en je telt er 6 maanden bij. Zo zul je dus op 14 uitkomen, wat dus ook niet kan.
Ik zal eens verder zoeken naar een oplossing, maar dat is iets voor morgen.
vinTage - 29/12/2008 23:56
Nieuw lid
als je gewoon PHP.net: mktime gebruikt, dan kan je zoiets doen:
mktime(0,0,0,maand+X ,dag,jaar)
Het jaar etc word dan vanzelf mee aangepast en er wordt rekening gehouden met de dagen in de maand.
lau - 30/12/2008 00:27
HTML interesse
@vinTage... als je naar mijn php code kijkt zie je dat ik dat al heb toegepast. $periode is dus in aantal maanden, dus daar zit het probleem niet.
Het probleem is nu juist dat jaar en dagen niet automatisch aanpassen aan de maanden
vinTage - 30/12/2008 03:00 (laatste wijziging 30/12/2008 03:01)
Nieuw lid
echo date("d-m-Y", mktime(0, 0, 0, date("m")+3 ) );
geeft netjes 3 maanden verderop hoor...
jaartal word ook gwn opgeteld
henver - 30/12/2008 10:32
HTML gevorderde
@VinTage: Ja, maar hij wilt, dat wanneer er bij bijvoorbeeld 31 januari 1 maand wordt opgeteld, het resultaat 28/29 februari is. (Denk ik toch)
Pellens - 30/12/2008 10:37
PHP interesse
Dat gaat met mktime... probeern maar eens tegoei.
Ik heb het ook al zo gedaan hoor!
lau - 30/12/2008 10:43
HTML interesse
Jah... dat probleem wat henver omschrijft is dus het probleem. mktime is wel toepasbaar, maar ik krijg geen exact 1 maand wat wel het geval is met MySQL en ADDDATE functie.
Gesponsorde links
Dit onderwerp is gesloten .