Liste der Anhänge anzeigen (Anzahl: 9)
Hilfe bei Frontend Ausgabe für eigene Module
Hallo in die Runde,
ich habe da mal wieder ein paar Fragen :D
Ich bin ja gerade dabei mein kleines Projekt für meine Abschlussarbeit zu bewerkstelligen und komme nicht weiter.
Zum Projekt:
Ich muss ein Backend Modul erstellen, indem ich Filialen anlegen kann und diesen Filialen Werktage zuordnen und Öffnungszeiten. Das funktioniert soweit.
So sieht das aus:
backendansicht.png
backend.png
Ich kann hier nun Filialen und zu den Filialen Werktage anlegen:
filialen anlegen.png
tage anlegen.png
Die Werktagen kann ich Öffnungszeiten zuweisen:
werktag anlegen.png
Der Code für tl_CC_filialen:
PHP-Code:
<?php declare(strict_types=1);
$table = 'tl_CC_filialen';
// contao/dca/tl_CC_filialen.php
use Contao\DC_Table;
$GLOBALS['TL_DCA'][$table] = [
//Config
'config' => [
'dataContainer' => DC_Table::class,
'ctable' => ['tl_CC_wochentag_uhrzeit'],
'enableVersioning' => true,
'switchToEdit' => true,
'sql' => [
'keys' => [
'id' => 'primary',
],
],
],
//Listen
'list' => [
'sorting' => [
'mode' => 1,
'fields' => ['name'],
'flag' => 1,
'panelLayout' => 'search,limit'
],
'label' => [
'fields' => ['name'],
'format' => '%s',
],
'operations' => [
'edit' => [
'href' => 'table=tl_CC_wochentag_uhrzeit',
'icon' => 'edit.svg',
],
'editheader' => [
'href' => 'act=edit',
'icon' => 'header.svg',
],
'delete' => [
'href' => 'act=delete',
'icon' => 'delete.svg',
],
'show' => [
'href' => 'act=show',
'icon' => 'show.svg'
],
],
],
//Felder
'fields' => [
'id' => [
'sql' => ['type' => 'integer', 'unsigned' => true, 'autoincrement' => true],
],
'tstamp' => [
'sql' => ['type' => 'integer', 'unsigned' => true, 'default' => 0]
],
'name' => [
'search' => true,
'inputType' => 'text',
'eval' => ['tl_class' => 'w50', 'maxlength' => 255, 'mandatory' => true],
'sql' => ['type' => 'string', 'length' => 255, 'default' => '']
],
'street' => [
'inputType' => 'text',
'eval' => ['tl_class' => 'w50', 'maxlength' => 255, 'mandatory' => true],
'sql' => ['type' => 'string', 'length' => 255, 'default' => '']
],
'postal' => [
'inputType' => 'text',
'eval' => ['tl_class' => 'clr w50', 'maxlength' => 255, 'mandatory' => true],
'sql' => ['type' => 'string', 'length' => 255, 'default' => '']
],
'city' => [
'inputType' => 'text',
'eval' => ['tl_class' => 'w50', 'maxlength' => 255, 'mandatory' => true],
'sql' => ['type' => 'string', 'length' => 255, 'default' => '']
],
'country' => [
'inputType' => 'select',
'options_callback' => static function(): array {
return \Contao\System::getContainer()->get('contao.intl.countries')->getCountries();
},
'eval' => ['tl_class' => 'w50', 'mandatory' => true, 'includeBlankOption' => true],
'sql' => ['type' => 'string', 'length' => 2, 'default' => '']
],
'phone' => [
'inputType' => 'text',
'eval' => ['tl_class' => 'w50', 'maxlength' => 255, 'mandatory' => true],
'sql' => ['type' => 'string', 'length' => 255, 'default' => '']
],
],
//Palettes
'palettes' => [
'default' => '{vendor_legend},name;{address_legend},street,postal,city,country,phone'
],
];
Und der Code für die Wochentage:
PHP-Code:
<?php declare(strict_types=1);
// contao/dca/tl_parts.php
use Contao\Database;
use Contao\DC_Table;
use Contao\Input;
$GLOBALS['TL_DCA']['tl_CC_wochentag_uhrzeit'] = [
'config' => [
'dataContainer' => DC_Table::class,
'enableVersioning' => true,
'ptable' => 'tl_CC_filialen',
'sql' => [
'keys' => [
'id' => 'primary'
],
],
'onload_callback' => [
function () {
$db = Database::getInstance();
$pid = Input::get('pid');
if (empty($pid)) {
return;
}
$result = $db->prepare('SELECT `name` FROM `tl_CC_filialen` WHERE `id` = ?')
->execute([$pid]);
$prefix = strtoupper(substr($result->name, 0, 2));
$GLOBALS['TL_DCA']['tl_CC_wochentag_uhrzeit']['fields']['number']['default'] = $prefix;
},
]
],
'list' => [
'sorting' => [
'mode' => 4,
'fields' => ['name'],
'headerFields' => ['name'],
'panelLayout' => 'search,limit',
'child_record_callback' => function (array $row) {
return '<div class="tl_content_left">'.$row['name'].' ['.$row['number'].']</div>';
},
],
'operations' => [
'edit' => [
'href' => 'act=edit',
'icon' => 'edit.svg',
],
'delete' => [
'href' => 'act=delete',
'icon' => 'delete.svg',
],
'show' => [
'href' => 'act=show',
'icon' => 'show.svg'
],
],
],
'fields' => [
'id' => [
'sql' => ['type' => 'integer', 'unsigned' => true, 'autoincrement' => true],
],
'pid' => [
'foreignKey' => 'tl_CC_filialen.name',
'sql' => ['type' => 'integer', 'unsigned' => true, 'default' => 0],
'relation' => ['type'=>'belongsTo', 'load'=>'lazy']
],
'tstamp' => [
'sql' => ['type' => 'integer', 'unsigned' => true, 'default' => 0]
],
'name' => [
'search' => true,
'flag' => 1,
'inputType' => 'text',
'eval' => ['tl_class' => 'w50', 'maxlength' => 255, 'mandatory' => true],
'sql' => ['type' => 'string', 'length' => 255, 'default' => '']
],
'number' => [
'search' => true,
'inputType' => 'text',
'eval' => ['tl_class' => 'w50', 'maxlength' => 255, 'mandatory' => true],
'sql' => ['type' => 'string', 'length' => 255, 'default' => '']
],
'description' => [
'inputType' => 'text',
'eval' => ['tl_class' => 'w50', 'maxlength' => 255, 'mandatory' => true],
'sql' => ['type' => 'string', 'length' => 255, 'default' => '']
],
//Palettes
],
'palettes' => [
'default' => '{parts_legend},name,number,description,singleSRC'
],
];
Die Tabellen sehen so aus:
tabelle filialen.png
tabelle wochentag.png
Anschließend benötige ich ein Frontent Modul, damit im Frontend der Nutzer über Auswahlfelder sich die jeweilige Filiale auswählen kann und dann EIGENTLICH in einem weiteren Auswahlfeld zwischen den Wochentagen (mit vorgegebener Uhrzeit) wählen kann.
Das Frontend Modul funktioniert soweit:
frontendmodul.png
Ich bekomme im Frontend nun auch mit folgenden Template eine Selectfeld und kann die Filialen wählen:
frontend filiale.png
Der Code fürs Frontend Modul:
PHP-Code:
<?php declare(strict_types = 1);
namespace wcs\ClickAndCollect\Module;
use Contao\BackendTemplate;
use Contao\Database;
use Contao\Module;
class Testmodule extends Module
{
protected $strTemplate = 'mod_testmodule';
public function generate()
{
if (TL_MODE == 'BE') {
$template = new BackendTemplate('be_wildcard');
$template->wildcard = '### '.utf8_strtoupper($GLOBALS['TL_LANG']['FMD']['testmodule'][0]).' ###';
$template->title = $this->headline;
$template->id = $this->id;
$template->link = $this->name;
$template->href = 'contao/main.php?do=themes&table=tl_module&act=edit&id='.$this->id;
return $template->parse();
}
return parent::generate();
}
protected function compile()
{
// Daten aus tl_CC_filialen abrufen
$filialenData = Database::getInstance()
->prepare("SELECT * FROM tl_CC_filialen")
->execute()
->fetchAllAssoc();
// Daten aus tl_CC_wochentag_uhrzeit abrufen
if (isset($_POST['filialeSelect'])) {
$filialeId = (int)$_POST['filialeSelect'];
$wochentagData = Database::getInstance()
->prepare("SELECT * FROM tl_CC_wochentag_uhrzeit WHERE pid = ?")
->execute($filialeId)
->fetchAllAssoc();
}
// Daten an das Template übergeben
$this->Template->foo = 'bar';
$this->Template->template = 'mod_testmodule';
$this->Template->filialenData = $filialenData;
$this->Template->wochentagData = $wochentagData;
}
}
Und das Template:
PHP-Code:
<div class="cc-frontend-module">
<form method="post">
<label for="filialSelect">Filiale auswählen:</label>
<select id="filialSelect" name="filialeSelect">
<?php foreach ($filialenData as $filiale): ?>
<option value="<?= $filiale['id'] ?>"><?= $filiale['name'] ?> - <?= $filiale['street'] ?>, <?= $filiale['city'] ?></option>
<?php endforeach; ?>
</select>
<button type="submit">Filiale auswählen</button>
</form>
<?php if ($selectedFilialeId): ?>
<form method="post">
<input type="hidden" name="selectedFilialeId" value="<?= $selectedFilialeId ?>">
<label for="wochentagSelect">Wochentag auswählen:</label>
<select id="wochentagSelect" name="wochentagSelect">
<?php foreach ($wochentagData as $wochentag): ?>
<?php if ($wochentag['pid'] == $selectedFilialeId): ?>
<option value="<?= $wochentag['id'] ?>"><?= $wochentag['name'] ?></option>
<?php endif; ?>
<?php endforeach; ?>
</select>
<button type="submit">Wochentag auswählen</button>
</form>
<?php if ($selectedWochentagId): ?>
<h1>Filiale</h1>
<p><?= $selectedFiliale['name'] ?></p>
<p><?= $selectedFiliale['street'] ?>, <?= $selectedFiliale['city'] ?></p>
<h1>Wochentag</h1>
<p><?= $selectedWochentag['name'] ?> - <?= $selectedWochentag['number'] ?>: <?= $selectedWochentag['description'] ?></p>
<?php endif; ?>
<?php endif; ?>
<h1>Wochentage und Öffnungszeiten</h1>
<ul>
<?php foreach ($wochentagData as $wochentag): ?>
<li><?= $wochentag['name'] ?> - <?= $wochentag['number'] ?>: <?= $wochentag['description'] ?></li>
<?php endforeach; ?>
</ul>
</div>
Allerdings komm ich nicht an die Daten von der Tabelle tl_CC_wochentag_uhrzeit ran. Beim betätigen des Submits bekomm ich einen Anfrage Token Fehler. Ich habe auch bereits das über JS irgendwie zu lösen. Komme da aber nicht weiter.
Liegt an der Verbindung der Tabellen? Liegts am Code, liegts am Template?
Ich möchte eigentlich erreich, dass wenn eine Filiale gewählt wird ein weiteres Selectfeld sich öffnet und dann ein angelegte Werktag gewählt werden kann an den dann wiederum die Uhrzeit gekoppelt ist.
Vielleicht mag sich jemand von euch das mal anschauen und mir unter die Arme greifen.
Liste der Anhänge anzeigen (Anzahl: 1)
Ich konnte die Fehler nun finden und die ersten Probleme lösen.
Es gab Probleme mit den Tabellen.
So siehts nun aus:
überarbeitet.png
Ich bekomm nun die Infos aus beiden Tabellen ausgegeben. Ich habe nun versucht die Geschichte mit jquery dynamisch zu gestalten, d.h. wenn ich eine Filiale mit der entsprechenden Nummer auswähle, sollte er mir alle Wochentage anzeigen, der die gleiche Filialnummer zugewiesen wurde.
Ich Backend lege ich Filiale 1 an und auch nur die Wochentage für die Filiale 1 sollen angezeigt werden. Und auch erst nachdem die Filiale gewählt wurde.
Habe mir als Vorbild das hier genommen:
https://www.codexworld.com/dynamic-d...uery-ajax-php/
Problem ist allerdings, das die Struktur dort eine andere ist und ich denke, dass ich bei meiner Erweiterungsstruktur gebunden bin.
An welcher Stelle muss ich hier das Script reinsetzen? In die Module.php (TestModule.php) ? Kann ich das Script einfach ins Template laden und jquery über <Head> im Contao Backend verlinken?
Als Fehler bekomm ich jetzt, dass er Probleme hat meine TestModule.php zu finden, weil sie ja nicht in der gleichen Ordnerstruktur liegt wie das Script. Ich habe aber darauf verlinkt.
Template:
PHP-Code:
<form method="post">
<label for="filialSelect">Filiale auswählen:</label>
<select id="filialSelect" name="filialeSelect">
<?php foreach ($this->filialenData as $filiale): ?>
<option value="<?= $filiale['id'] ?>"><?= $filiale['name'] ?> - <?= $filiale['street'] ?>, <?= $filiale['city'] ?></option>
<?php endforeach; ?>
</select>
<button type="submit" name="REQUEST_TOKEN" value="{{request_token}}">Filiale auswählen</button>
</form>
<br>
<form method="post">
<input type="hidden" name="REQUEST_TOKEN" value="{{request_token}}" />
<label for="wochentagSelect">Wochentag auswählen:</label>
<select id="wochentagSelect" name="wochentagSelect">
<?php foreach ($this->wochentagData as $wochentag): ?>
<option value="<?= $wochentag['id'] ?>"><?= $wochentag['name'] ?></option>
<?php endforeach; ?>
</select>
<button type="submit">Wochentag auswählen</button>
</form>
<script>
$(document).ready(function(){
$('#filialSelect').on('change', function(){
var selectedFilialeId = $(this).val();
if(selectedFilialeId){
$.ajax({
type: 'POST',
url: 'src/wcs/ClickAndCollect/Module/TestModule.php',
data: { filiale_id: selectedFilialeId },
success: function(response){
$('#wochentagSelect').html(response);
}
});
} else {
$('#wochentagSelect').html('<option value="">Select Wochentag first</option>');
}
});
$('#wochentagSelect').on('change', function(){
var selectedWochentagId = $(this).val();
if(selectedWochentagId){
// Do something with selectedWochentagId if needed
} else {
// Handle the case when no wochentag is selected
}
});
});
</script>
TestModule.php:
PHP-Code:
<?php declare(strict_types = 1);
namespace wcs\ClickAndCollect\Module;
use Contao\BackendTemplate;
use Contao\Database;
use Contao\Module;
class Testmodule extends Module
{
protected $strTemplate = 'mod_testmodule';
public function generate()
{
if (TL_MODE == 'BE') {
$template = new BackendTemplate('be_wildcard');
$template->wildcard = '### '.utf8_strtoupper($GLOBALS['TL_LANG']['FMD']['testmodule'][0]).' ###';
$template->title = $this->headline;
$template->id = $this->id;
$template->link = $this->name;
$template->href = 'contao/main.php?do=themes&table=tl_module&act=edit&id='.$this->id;
return $template->parse();
}
return parent::generate();
}
protected function compile()
{
// Daten aus tl_CC_filialen abrufen
$filialenData = Database::getInstance()
->prepare("SELECT * FROM tl_CC_filialen")
->execute()
->fetchAllAssoc();
$wochentagData = Database::getInstance()
->prepare("SELECT * FROM tl_CC_wochentag_uhrzeit")
->execute()
->fetchAllAssoc();
if (!empty($_POST["filiale_id"])) {
$selectedFilialeId = (int)$_POST["filiale_id"];
//Namen der ausgewählten Filiale
$selectedFiliale = Database::getInstance()
->prepare("SELECT name FROM tl_cc_filialen WHERE id = ?")
->execute($selectedFilialeId)
->fetchAssoc();
if ($selectedFiliale) {
$filialeName = $selectedFiliale['name'];
$wochentagData = Database::getInstance()
->prepare("SELECT * FROM tl_cc_wochentag_uhrzeit WHERE number = ?")
->execute($filialeName)
->fetchAllAssoc();
// Generate HTML for wochentag options
$htmlOptions = '<option value="">Select Wochentag</option>';
foreach ($wochentagData as $wochentag) {
$htmlOptions .= '<option value="' . $wochentag['id'] . '">' . $wochentag['name'] . '</option>';
}
echo $htmlOptions;
exit();
}
}
/*$selectedFilialeId = null;
if (isset($_POST['filialeSelect'])) {
$selectedFilialeId = (int)$_POST['filialeSelect'];
$selectedFiliale = Database::getInstance()
->prepare("SELECT * FROM tl_CC_filialen WHERE id = ?")
->execute($selectedFilialeId)
->fetchAssoc();
}
$selectedWochentagId = null;
if (isset($_POST['wochentagSelect'])) {
$selectedWochentagId = (int)$_POST['wochentagSelect'];
$selectedWochentag = Database::getInstance()
->prepare("SELECT * FROM tl_CC_wochentag_uhrzeit")
->execute()
->fetchAssoc();
}
*/
// Daten an das Template übergeben
$this->Template->foo = 'bar';
$this->Template->template = 'mod_testmodule';
$this->Template->filialenData = $filialenData;
$this->Template->selectedFilialeId = $selectedFilialeId;
/*
$this->Template->selectedFiliale = $selectedFiliale;
$this->Template->selectedWochentagId = $selectedWochentagId;
$this->Template->selectedWochentag = $selectedWochentag;
*/
$this->Template->wochentagData = $wochentagData;
}
}
Liste der Anhänge anzeigen (Anzahl: 1)
Update:
Es funktioniert :)
Template:
PHP-Code:
<form method="post">
<label for="filialeSelect">Filiale auswählen:</label>
<select id="filialSelect" name="filialeSelect">
<?php foreach ($this->filialenData as $filiale): ?>
<option value="<?= $filiale['id'] ?>" <?= ($_POST["filialeSelect"] == $filiale['id']) ? 'selected' : '' ?>>
<?= $filiale['name'] ?> - <?= $filiale['street'] ?>, <?= $filiale['city'] ?>
</option>
<?php endforeach; ?>
</select>
<button type="submit" name="REQUEST_TOKEN" value="{{request_token}}">Filiale auswählen</button>
</form>
<br>
<form method="post">
<label for="wochentagSelect">Wochentag auswählen:</label>
<select id="wochentagSelect" name="wochentagSelect">
<?php foreach ($this->wochentagData as $wochentag): ?>
<option value="<?= $wochentag['id'] ?>" <?= ($_POST["wochentagSelect"] == $wochentag['id']) ? 'selected' : '' ?>>
<?= $wochentag['name'] ?> - <?= $wochentag['description'] ?>
</option>
<?php endforeach; ?>
</select>
<button type="submit" name="REQUEST_TOKEN" value="{{request_token}}">Wochentag auswählen</button>
</form>
TestModule.php:
PHP-Code:
<?php declare(strict_types = 1);
namespace wcs\ClickAndCollect\Module;
use Contao\BackendTemplate;
use Contao\Database;
use Contao\Module;
class Testmodule extends Module
{
protected $strTemplate = 'mod_testmodule';
public function generate()
{
if (TL_MODE == 'BE') {
$template = new BackendTemplate('be_wildcard');
$template->wildcard = '### '.utf8_strtoupper($GLOBALS['TL_LANG']['FMD']['testmodule'][0]).' ###';
$template->title = $this->headline;
$template->id = $this->id;
$template->link = $this->name;
$template->href = 'contao/main.php?do=themes&table=tl_module&act=edit&id='.$this->id;
return $template->parse();
}
return parent::generate();
}
protected function compile()
{
// Daten aus tl_CC_filialen abrufen
$filialenData = Database::getInstance()
->prepare("SELECT * FROM tl_CC_filialen")
->execute()
->fetchAllAssoc();
$wochentagData = [];
if (!empty($_POST["filialeSelect"])) {
$selectedFilialeId = (int)$_POST["filialeSelect"];
// Holen Sie den Namen der ausgewählten Filiale
$selectedFiliale = Database::getInstance()
->prepare("SELECT name FROM tl_cc_filialen WHERE id = ?")
->execute($selectedFilialeId)
->fetchAssoc();
if ($selectedFiliale) {
$filialeName = $selectedFiliale['name'];
// Holen Sie die Wochentage mit dem gleichen Namen wie die ausgewählte Filiale
$wochentagData = Database::getInstance()
->prepare("SELECT * FROM tl_cc_wochentag_uhrzeit WHERE number = ?")
->execute($filialeName)
->fetchAllAssoc();
}
}
// Daten an das Template übergeben
$this->Template->foo = 'bar';
$this->Template->template = 'mod_testmodule';
$this->Template->filialenData = $filialenData;
$this->Template->wochentagData = $wochentagData;
}
}