Ich versuche das nun gerade über AJAX zu lösen, aber scheitere an der Route.
Eigentlich Recht simpel aufgebaut und ich kann auf den Submit und das Problem mit dem anderen Template verzichten, wenn es denn laufen würde
Vllt hat dazu jemand eine Idee:
Versandmethode.php:
->generate() und loadTimeslots():
PHP-Code:
public function generate()
{
$this->initializeModules();
if (empty($this->modules)) {
$this->blnError = true;
/** @var Template|\stdClass $objTemplate */
$objTemplate = new Template('mod_message');
$objTemplate->class = 'shipping_method';
$objTemplate->hl = 'h2';
$objTemplate->headline = $GLOBALS['TL_LANG']['MSC']['shipping_method'];
$objTemplate->type = 'error';
$objTemplate->message = $GLOBALS['TL_LANG']['MSC']['noShippingModules'];
return $objTemplate->parse();
}
// Daten aus tl_CC_filialen abrufen
$filialenData = Database::getInstance()
->prepare("SELECT * FROM tl_CC_filialen")
->execute()
->fetchAllAssoc();
$wochentagData = [];
$abholzeitenData = [];
if (!empty($_POST["filialeSelect"])) {
$selectedFilialeId = (int)$_POST["filialeSelect"];
// 'filialid' der ausgewählten Filiale
$selectedFiliale = Database::getInstance()
->prepare("SELECT filialid FROM tl_CC_filialen WHERE id = ?")
->execute($selectedFilialeId)
->fetchAssoc();
if ($selectedFiliale) {
$filialid = $selectedFiliale['filialid'];
// Wochentage mit derselben 'filialid' wie die ausgewählte Filiale
$wochentagData = Database::getInstance()
->prepare("SELECT * FROM tl_CC_wochentag_uhrzeit WHERE filialid = ?")
->execute($filialid)
->fetchAllAssoc();
// Abholzeiten für die ausgewählte Filiale
$abholzeitenData = Database::getInstance()
->prepare("SELECT abholzeiten FROM tl_CC_abholzeiten WHERE filialid = ?")
->execute($selectedFilialeId)
->fetchEach('abholzeiten');
}
}
if (isset($_POST["saveSelection"])) {
$selection = [
'filiale' => $_POST["filialeSelect"],
'wochentag' => $_POST["wochentagSelect"],
'abholzeit' => $_POST["abholzeitSelect"],
];
// Auswahl in der Sitzung speichern
$_SESSION['user_selection'] = $selection;
}
/** @var Template|\stdClass $objTemplate */
$objTemplate = new Template('iso_checkout_shipping_method');
$objTemplate->headline = $GLOBALS['TL_LANG']['MSC']['shipping_method'];
$objTemplate->message = $GLOBALS['TL_LANG']['MSC']['shipping_method_message'];
$objTemplate->shippingMethods = $this->modules;
$objTemplate->filialenData = $filialenData;
$objTemplate->wochentagData = $wochentagData;
$objTemplate->abholzeitenData = $abholzeitenData;
return $objTemplate->parse();
}
public function loadTimeslots()
{
$response = array();
if (isset($_POST['filialeId'])) {
$selectedFilialeId = (int)$_POST['filialeId'];
$wochentageData = Database::getInstance()
->prepare("SELECT name FROM tl_CC_wochentag_uhrzeit WHERE filialid = ?")
->execute($selectedFilialeId)
->fetchEach('name');
$abholzeitenData = Database::getInstance()
->prepare("SELECT abholzeiten FROM tl_CC_abholzeiten WHERE filialid = ?")
->execute($selectedFilialeId)
->fetchEach('abholzeiten');
$response['wochentage'] = $wochentageData;
$response['abholzeiten'] = $abholzeitenData;
}
// Set the response content type to JSON
header('Content-Type: application/json');
// Prepare your JSON data
$responseData = array(
'wochentage' => $response['wochentage'],
'abholzeiten' => $response['abholzeiten'],
);
// Output the JSON response
echo json_encode($responseData);
exit;
}
Das Template sieht so aus:
PHP-Code:
<!-- iso_checkout_shipping_method.html5 -->
<form method="post">
<input type="hidden" name="REQUEST_TOKEN" value="{{request_token}}">
<!-- Filiale auswählen -->
<label for="filialeSelect">Filiale auswählen:</label>
<select id="filialeSelect" name="filialeSelect">
<?php foreach ($this->filialenData as $filiale): ?>
<option value="<?= $filiale['id'] ?>" <?= ($_POST["filialeSelect"] == $filiale['id']) ? 'selected' : '' ?>>
<?= $filiale['filialid'] ?> - <?= $filiale['city'] ?> - <?= $filiale['street'] ?>
</option>
<?php endforeach; ?>
</select>
<button type="submit" name="selectFiliale">Filiale auswählen</button>
<br>
<!-- Wochentag auswählen -->
<label>Wochentag auswählen:</label>
<?php foreach ($this->wochentagData as $wochentag): ?>
<label>
<input type="radio" name="wochentagSelect" value="<?= $wochentag['name'] ?>" <?= ($_POST["wochentagSelect"] == $wochentag['name']) ? 'checked' : '' ?>>
<?= $wochentag['name'] ?>
</label>
<?php endforeach; ?>
<br>
<!-- Abholzeit auswählen -->
<label>Abholzeit auswählen:</label>
<?php
$selectedFilialeId = $_POST["filialeSelect"];
if (!empty($selectedFilialeId)) {
$abholzeitenData = Database::getInstance()
->prepare("SELECT abholzeiten FROM tl_CC_abholzeiten WHERE filialid = ?")
->execute($selectedFilialeId)
->fetchEach('abholzeiten');
foreach ($abholzeitenData as $abholzeit) {
echo '<label>';
echo '<input type="radio" name="abholzeitSelect" value="' . $abholzeit . '" ' . ($_POST["abholzeitSelect"] == $abholzeit ? 'checked' : '') . '>';
echo $abholzeit;
echo '</label>';
}
}
?>
<br>
<button type="submit" name="saveSelection">Auswahl speichern</button>
</form>
<?php
if (isset($_SESSION['user_selection'])) {
$selection = $_SESSION['user_selection'];
$filialData = Database::getInstance()
->prepare("SELECT city, street FROM tl_CC_filialen WHERE id = ?")
->execute($selection['filiale'])
->fetchAssoc();
echo '<h1>Auswahl gespeichert:</h1>';
echo '<p>Filiale: ' . $filialData['city'] . ' - ' . $filialData['street'] . '</p>';
echo '<p>Wochentag: ' . $selection['wochentag'] . '</p>';
echo '<p>Abholzeit: ' . $selection['abholzeit'] . '</p>';
} else {
echo '<p>Keine Auswahl gespeichert.</p>';
}
?>
<script>
document.addEventListener("DOMContentLoaded", function () {
var filialeSelect = document.getElementById('filialeSelect');
filialeSelect.addEventListener('change', function () {
var selectedFilialeId = filialeSelect.value;
loadTimeslots(selectedFilialeId);
});
function loadTimeslots(selectedFilialeId) {
var xhr = new XMLHttpRequest();
xhr.open('GET', 'system/modules/library/CheckoutStep/Versandmethode.php?loadTimeslots&filialeId=' + selectedFilialeId, true);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
try {
var response = JSON.parse(xhr.responseText);
var wochentagSelect = document.getElementById('wochentagSelect');
var abholzeitSelect = document.getElementById('abholzeitSelect');
wochentagSelect.innerHTML = '';
for (var i = 0; i < response.wochentage.length; i++) {
var option = document.createElement('option');
option.value = response.wochentage[i];
option.text = response.wochentage[i];
wochentagSelect.appendChild(option);
}
abholzeitSelect.innerHTML = '';
for (var j = 0; j < response.abholzeiten.length; j++) {
var option = document.createElement('option');
option.value = response.abholzeiten[j];
option.text = response.abholzeiten[j];
abholzeitSelect.appendChild(option);
}
} catch (e) {
console.error('Fehler beim Parsen der JSON-Antwort:', e);
}
}
};
xhr.send();
}
});
</script>
Der Punkt stößt dem System sauer auf:
xhr.open('GET', 'system/modules/library/CheckoutStep/Versandmethode.php?loadTimeslots&filialeId=' + selectedFilialeId, true); und gibt einen 404 aus. Ich habe da einige Varianten probiert, aber kann nicht auf die richtige Datei verweisen.
Lesezeichen