Hallo Bernd,
ein typischer Bernd-Code: Wir programmieren alles Stück für Stück neu, statt es logisch in Funktionen zusammenzufassen und diese aufzurufen. Der resultierende Code wäre signifikant kürzer. Copy+Paste ist nicht immer des Programmierers Freund.
Kann es übrigens sein, dass Du nicht alle PHP Start- und End-Tags mitkopiert hast? So wie dein Code gesetzt ist wechselst Du übergangslos zwischen JS und PHP, das wird Errors hageln.
Vorschläge:
- Das, was im Eventhandler passiert und das, was PHP als Initialisierungscode ausgibt, ist das gleiche. Das sollte also in einer Funktion landen und nur die Funktion aufgerufen werden. Der Logikteil reduziert sich damit auf:
$(':radio[name=transportauftrag]').click(function(){
if($(this).val() == 'Ja'){
enableTransportauftrag();
} else{
disableTransportauftrag();
}
});
?>
if ($b_transportauftrag == 'Ja') {?>
enableTransportAuftrag();
<?php } ?>
if ($b_transportauftrag == 'Nein') {?>
disableTransportauftrag();
<?php } ?>
Frage wäre hier noch, warum Du Ja und Nein separat abfragst. Gibt's einen dritten Wert? Wenn nicht, genügt statt des zweiten if ein else.
Du musst übrigens diese Funktionsaufrufe nicht so in deine Seite hineingenerieren. In einem Stück JavaScript, das nach dem Laden der Seite abläuft, kannst Du den Zustand des Radiobuttons abfragen und danach enable oder disable aufrufen, ohne dass PHP da mithelfen muss. Wo das bei Dir wäre, musst Du natürlich selbst wissen.
Die Funktionen enableTransportauftrag und disableTransportauftrag sollten sich im Wesentlichen invers zueinander verhalten. Mit .show und .hide ist das mühselig, aber es gibt auch noch .toggle. toggle(true) ist gleich show(), und toggle(false) ist gleich hide(). D.h. du kannst einen großen Teil deiner show/hide Logik herausfaktorisieren. Die folgende Funktion kann beides, show und hide, je nach dem, ob du true oder false übergibst. Ich habe sie mal mit activate bezeichnet, weil da noch mehr hinein kann als show und hide.
function activateTransportauftrag(active) {
$('#transportauftrag_eingabe_box').toggle(active);
$('#b_transportauftrag_von_box').toggle(active);
$('#b_transportauftrag_bis_box').toggle(active);
$('div#box-transportauftrag_verschicken').toggle(!active);
$('div#retourenHinweis').toggle(active);
$('div#apvorOrt').toggle(!active);
$('div#keineInfo').toggle(!active);
$('div#angebot_location').toggle(active);
}
D.h. enableTransportauftrag und disableTransportauftrag sähen so aus:
function enableTransportauftrag() {
activateHideTransportauftrag(true);
$("#box_transportauftrag").removeClass("abstand_2");
$("#box_transportauftrag").addClass("abstand_1");
$("#ansprechpartner_vor_ort_ap").prop('required',false);
$("#ansprechpartner_vor_ort_ex").prop('required',false);
$("#b_transportauftrag_von").prop('required',true);
<?php if ($p_dauerausleihe == 0) { ?>
$("#b_transportauftrag_bis").prop('required',true);
<?php }
if ($p_dauerausleihe == 1) { ?>
$("#b_transportauftrag_bis").prop('disabled',true);
<?php } ?>
}
function disableTransportauftrag() {
activateHideTransportauftrag(false);
$("#b_transportauftrag_von").val('');
$("#b_transportauftrag_bis").val('');
$("#transportauftrag_eingabe").val('');
$("#ansprechpartner_vor_ort_ap").prop('required',true);
$("#ansprechpartner_vor_ort_ex").prop('required',true);
$("#b_transportauftrag_von").prop('required',false);
$("#b_transportauftrag_bis").prop('required',false);
}
Die mit // !!! markierten Zeilen unterscheiden sich ebenfalls nur durch einen booleschen Wert und könnten aus beiden Funktionen entfernt und in activateTransportauftrag hinein faktorisiert werden. Sie würden am Ende hinzugefügt und sähen dort so aus:
function activateTransportauftrag(active) {
$("#ansprechpartner_vor_ort_ap").prop('required',!active);
$("#ansprechpartner_vor_ort_ex").prop('required',!active);
$("#b_transportauftrag_von").prop('required',active);
}
Was in den enable- und disable Funktionen bleibt ist das Leeren von Feldern und das Umschießen von Klassen. Zu klären ist von Dir, was mit b_transportauftrag_bis ist - da wird in einem Zweig disabled auf true gesetzt, im anderen aber nicht auf false.
Ich möchte auch noch hinzufügen, dass ich von dieser show/hide Orgie nicht viel halte. ICH würde schauen, ob es einen gemeinsamen Container gibt auf dem man EINE Klasse setzt oder löscht, woraufhin sich der Rest über CSS Regeln automatisch zeigt oder versteckt.
Rolf
--
sumpsi - posui - clusi