Ik zit met een probleem en ben daarmee tot in de late uurtjes (03:10) bezig geweest.
Ik gebruik de bekende Datepicker om een datum te selecteren.
Deze werkt zoals het hoort.
Maar ik wil nu een extra functie bouwen die het volgende doet:
Wanneer er in de Datepicker de datum "zondag 3 mei 2015" wordt aangeklikt (zondag is normaal gesproken niet aanklikbaar) moet er een extra hidden formfield worden gegenereerd.
De bewuste zondag 3 mei 2015 maak ik beschikbaar via:
var openDates = [[05,03,2015]];
Voor alle overige dagen (maandag t/m zaterdag) wordt sowieso de aangeklikte datum doorgegeven aan:
$("input[name='eventdate']").val(dateText);
Nu wil ik dat er voor de gewenste zondag 3 mei 2015 een speciale input field hebben.
Dus wanneer deze datum wordt aangeklikt moet er een nieuwe <input type='hidden' name='specialsunday' /> worden aangemaakt met daarin de waarde value='1'.
Vervolgens wil ik via een AJAX post de waarde van het veld 'specialsunday' doorsturen naar een ander php script welke controleert of er een specialsunday (3 mei 2015) is aangeklikt. Zo ja dan wordt er een melding getoond op het scherm. Die melding kan bijvoorbeeld zijn "Let op voor zondag 3 mei 2015 betaald u een extra toeslag".
Kijk eens in je netwerktab, wat wordt precies gePOST?
Klopt die slash wel voor /berekentotaal.php? Levert dat geen 404 op ofzo?
EDIT: heeft het inputveld met id "eventdate" ook een attribuut "name"?
---
EDIT: ik weet niet hoe je code er verder uitziet, maar je kunt ook prima die mededeling in je berekeningsterugkoppeling zetten, zoiets dus:
<form id="processform">
<input type="text" id="eventdate" name="eventdate" />
</form>
<div id="showtotaal"></div>
<script type="text/javascript">
//<![CDATA[
$().ready(function() {
// callback function for filtering available days
function availableDates(d) {
var date = $.datepicker.formatDate('yy-mm-dd', d);
var enabled = true;
var exceptions = ['2015-05-03'];
// first, disable weekends
var noWeekends = $.datepicker.noWeekends(d);
enabled = noWeekends[0];
// then check if this is an exception
if ($.inArray(date, exceptions) > -1) {
enabled = true;
}
return [enabled];
}
//
$('#eventdate').datepicker({
'dateFormat': 'yy-mm-dd', // yy-mm-dd
'beforeShowDay': availableDates
});
$('#eventdate').change(function() {
$.post('berekentotaal.php', $('#processform').serialize(), function(html) {
$('#showtotaal').html(html);
});
});
});
//]]>
</script>
berekentotaal.php
<?php
header('Content-Type: text/html; charset=UTF-8');
$specialDates = array('2015-05-03');
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// obviously, you need to VALIDATE your data as well...
echo '<pre>'.print_r($_POST, true).'</pre>';
if (in_array($_POST['eventdate'], $specialDates)) {
?><div style="background-color: #ffcccc;"><p>Opgelet: extra toeslag!</p></div><?php
}
}
?>
Het inputveld heeft als name="eventdate". Aan dit inputveld hangt geen id maar een class die weer in de AJAX call staat. De ID uit onderstaand stukje gebruik ik om een voluit geschreven datum te presenteren in #alternatedate.
Dus in eventdate wordt "2015-05-03" gestopt en Zondag, 3 mei 2015 wordt aan #alternatedate gekoppeld.
Met die laatste voluit geschreven datum doe ik verder niets, alleen maar weergave. De waarde van "eventdate" moet via de AJAX call worden doorgestuurd naar berekentotaal.php
Die slash klopt inderdaad. Er wordt naast "input[type="hidden"].selecteddate" ook andere variabelen meegestuurd zoals:
select.soortadres
input[type="text"].emailadres
Dit werkt overigens goed. Alleen de waarde uit "eventdate" (input[type="hidden"].selecteddate) wordt niet gevuld doorgestuurd.
Ah, savedatum is voor de publieke weergave van de datum? Mogelijk heb je iets aan het bovenstaande antwoord, anders moet ik later even verder kijken - moet nu aan de kokerij :/.
2. de Datepicker kalender staat in formulier.php, <div id="datepicker" class="deDatepicker"></div>
3. het script savedatum.php (zichtbaar in het .js bestand) is er alleen om de aangeklikte datum in een database te stopen. Dit zou je voor mijn probleem kunnen wegdenken.
4. op de pagina formulier.php wordt de aangeklikte datum getoond in zowel input field "eventdate" (format 2015-05-03) en in de readonly input met ID alternatedate (format Zondag, 3 mei 2015).
5. verder staat er op formulier.php een stukje ajax die elke wijziging van het formulier #processform doorstuurt naar een verwerkingsscript genaamd berekentotaal.php
6. naar dit berekentotaal.php script worden verschillende variabelen gestuurd m.b.v. onderstaande stukje code:
7. alle formulier elementen staan tussen de form-tags waarbij select.selectcard en de checkbox op de formulier.php pagina zelf worden aangevinkt of geselecteerd. De #eventdate wordt echter gevuld vanuit javascript.js
8. de andere twee formulier elementen worden correct en goed doorgestuurd wanneer de waarde veranderd, maar dit gebeurd bij de #eventdate niet.
Ik weet dus eigenlijk wel zeker dat de veranderingen die het javascript.js bestand doorvoert naar het $eventdate element niet worden herkent als zijn CHANGE op de pagina formulier.php
Hier moet ik dus een oplossing voor zien te vinden.
Als je niets opmerkelijks in de code ziet wordt het tijd om te gaan debuggen.
Van welke browser maak je gebruik?
Heb je extensies geinstalleerd?
Maak je gebruik van de developer console (functietoets F12)?
Je moet informatie "tot je laten komen" (en je moet weten hoe) om hier uit te komen, want dit is anders een beetje blind schieten. De eerste stap is het gewoon maar dumpen van informatie naar je scherm / je console om het probleem op te sporen en te isoleren zodat je op zijn minst weet WAAR het fout gaat. Vervolgens kun je aan een oplossing gaan werken.
Ik snap alleen niet goed waarom je tussentijds een datum wegschrijft. Ook lijkt mij:
$("input[name='eventdate']").val(dateText);
nogal loos als dit veld al gekoppeld is aan je datepicker...
...Come to think of it, hoe luidt jouw declaratie van je datepicker object? Deze zie ik nergens staan :/. Het is voor mij verdomd moeilijk om een puzzel op te lossen waarvan ik niet alle stukjes heb. Waarom post je niet alle relevante delen?
Ik heb het (sterke) vermoeden dat de datepicker gekoppeld is aan een div (inline).
Wat belangrijk is om te weten is dat als je via JS/JQuery de waarde van een input aanpast, de change event niet wordt getriggerd.
Maar eigenlijk wil je dat ook niet, want dat zou betekenen dat er nagenoeg gelijktijdig twee ajax request plaats vinden.
Net zoals Thomas vraag ik me af waarom je het in twee stappen wilt, maar als dat nodig is zou ik de berekentotaal() functie aanroepen in de callback van $.post('saveDatum.php').
Het klopt dat de change event niet wordt getriggerd, en dat is juist iets wat ik wel wil.
Is er niet een oplossing waarbij een change event wordt getriggerd wanneer de waarde via js/jquery wordt aangepast?
De twee request zijn wel nodig. De post naar savedatum.php is een stukje code wat enkel een aangeklikte datum op slaat. in savedatum.php staat enkel en alleen een mysql query.
Het klopt dat de change event niet wordt getriggerd, en dat is juist iets wat ik wel wil.
Is er niet een oplossing waarbij een change event wordt getriggerd wanneer de waarde via js/jquery wordt aangepast?
Ik kan even niet volgen waarom je dat wilt, het enige wat je in de eventListener hebt staan is een call naar berekentotaal().
Dus waarom niet dit:
[code lang="js"]
onSelect: function(dateText, inst) {
$("input[name='eventdate']").val(dateText);
$("#alternatedate").fadeIn();
Het klopt dat de change event niet wordt getriggerd, en dat is juist iets wat ik wel wil.
Is er niet een oplossing waarbij een change event wordt getriggerd wanneer de waarde via js/jquery wordt aangepast?
Zelf de trigger overhalen leek mij ook de beste oplossing, maar dan moet ik deze samenvoegen met mijn andere stukje jquery omdat ik nog 2 andere variabelen meestuur voor de berekentotaal functie.
Dit werkt uiteraard nog niet, maar ik heb nu echt geen idee wat ik aan de nieuwe regel moet toevoegen zodat de variabele wordt meegestuurd in de berekentotaal() functie...
Dit function(){berekentotaal();} moet ik toch ook toevoegen in de nieuwe regel?
[size=xsmall]Toevoeging op 02/05/2015 19:58:28:[/size]
Ik maak een bedrag van 25 EUR over voor de geen die de verlossende oplossing heeft voor mijn laatste post...
Ik ben al 3 dagen zoet met dit stukje en kom er echt niet meer uit.