Liste der Anhänge anzeigen (Anzahl: 2)
Versandart-Bereich überschreiben und mit eigener Logik anpassen
Moin in die Runde,
ich habe mir nun ein Backend Modul geschrieben, um Filialen, Wochentage und Abholzeiten anzulegen. Fürs Frontend hatte ich ein Modul angelegt, womit ich die Daten aus der Datenbank lesen kann und an ein Template übergeben, sodass quasi der Nutzer eine Filiale auswählen kann, dann einen Wochentag und die passende Abholzeit. Das funktioniert soweit. Nun möchte ich "meine" Logik in den Versandart/Versand -> Checkout Prozess einbauen.
Ich habe übers Backend eine Versandart "Abholung" angelegt. Komme ich nun zum Checkout, trage die Adresse ein und dann Versand -> Abholung und dann sollten meine 3 Felder erscheinen, die dann auch mit Daten gefüllt sind. Das Template für die Darstellung "iso_checkout_shipping_method.html5" kann ich ja anpassen, so dass meine Formulare dort scheinen. Ich finde allerdings den Einstiegspunkt nicht, um meinen Code dort einzubauen, so dass er dort die Datenbankabfrage macht und dann die Daten an das Template weitergibt.
Bei der Suche nach einer Lösung kam ich zu dem Punkt eine neue Versandmethode zu schreiben, aber ist das zwingend erfordlich? Kann ich nicht in das bestehende System meinen "Code" ergänzen? Updatesicherheit lassen wir mal außen vor.
Welche PHP Datei ist quasi die Zieldatei, um meine Logik zu ergänzen?
Ich hab das an sich ganz simpel gehalten:
PHP-Code:
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"];
// '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');
}
// Daten an das Template übergeben
$this->Template->foo = 'bar';
$this->Template->template = 'mod_testmodule';
$this->Template->filialenData = $filialenData;
$this->Template->wochentagData = $wochentagData;
$this->Template->abholzeitenData = $abholzeitenData;
}
So sieht das für mein Template aus und das funktioniert soweit auch. (siehe Bilder)
Ich habe dort mein Modul einfach mal unters Kassenmodul geschoben, um es darzustellen.
Kurzes Update: Übern inserttag bekomme ich mein Modul da rein.
Allerdings gibts dann folgendes Problem: Ich habe kein JS verwendet, weil ich nicht weiß, wie ich es im Modul nutzen muss, deshalb hab ich es nur über PHP lösen wollen. Ich muss die Filiale bestätigen über den Button und erst, dann kann ich Tage und Zeiten auswählen. Dadurch das standardmäßig ein Button im Checkout Prozess vorhanden ist durch zurück und weiter, erfüllt mein "Filiale bestätigen" Button nun die Aufgabe von weiter, was dazu führt, dass ich den Rest gar nciht auswählen kann, weil ich direkt zum nächsten Step springe. Jemand eine Idee?
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:
Zitat von
andreas.schempp
Eine eigene Versandmethode ist der richtig weg, um "dem bestehenden System deinen Code zu erweitern". Logik im Template ist eigentlich falsch, und nur möglich weil wir in den alten Templates noch PHP nutzen. Mach also am besten eine eigene Versandmethode mit einem eigenen Template, dort kannst du dann "alles richtig machen". Falls zur eigenen Versandmethode fragen sind kannst du diese natürlich auch gerne hier stellen ;-)
Danke dir für die Rückmeldung :)
Ich habe es vorerst wie folgt gelöst.
Ich habe die Versandmethode nicht weiter überschrieben bzw geändert, sondern habe mein Frontend Modul einfach in den Warenkorb mit eingebunden. das sieht dann so aus:
(Bild cart.png)
Hier funktioniert ja mein eigenes Template und mein Modul soweit, wie es muss, d.h. ich rufe die Filialen aus der Datenbank ab. Wähle eine, dann wird mir durch meine Auswahl die Möglichkeiten der angelegten Tage und Abholzeiten angezeigt. Am Ende bestätige ich die Auswahl und speichere die Daten in einer Session.
Im Checkout lasse ich den Schritt "Versand" aus, weil es nur eine Option gibt und zwar Abholung. Wie ich das löse, weiß ich noch nicht :D
Im Schritt Zusammenfassung übergebe in die Daten der Session dem Template(ja nicht sauber gelöst, aber wusste mir anders vorerst nicht zu helfen).
Das sieht dann so aus:
(Bild zusammenfassung.png)
Für die Email / Bestellbestätigung hab ich mir aus meinem Template einen Token generieren lassen und kann das damit in die Email übergeben. Das funktioniert soweit auch.
Ich habe nun noch folgendes zu lösen. Wie bekomme ich meine zusätzlichen Informationen ins Backend für die Bestellübersicht?
Wie kann ich die Anordnung in der Zusammenfassung überarbeiten? Ich hätte dort gerne ebenfalls die Möglichkeit für einen Edit und würde den Bereich Abholung direkt über Informationen haben.
Ja ist noch einiges zu machen :D
Stichwort -> eigene Versandmethode. Ich muss gestehen, dass Isotope für mich Anfänger so umfangreich ist, dat es mir schwer fällt da überhaupt etwas zu finden. Wo muss ich dann angreifen?
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat von
andreas.schempp
die Isotope\Model\Shipping\Flat meinte ich.
Ich danke dir :)
Wir kommen die Ziel ein Stück näher. Ich habe nun meine "eigene" Versandmethode gebaut, die ich auch über das Backend einer neuen Versandart zuweisen kann. Die Logik für die Formulare und die Datenbankabfrage, habe ich ebenfalls in die Versandmethode einbauen können.
Ich habe die generate() Methode erweitert:
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();
}
$filialenData = Database::getInstance()
->prepare("SELECT * FROM tl_CC_filialen")
->execute()
->fetchAllAssoc();
$wochentagData = [];
$abholzeitenData = [];
if (Input::post('FORM_SUBMIT') == $this->objModule->getFormId()) {
$selectedFilialeId = Input::post('filialeSelect');
$selection = [
'filiale' => $selectedFilialeId,
'wochentag' => Input::post('wochentagSelect'),
'abholzeit' => Input::post('abholzeitSelect'),
];
$_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->options = $this->generateShippingMethodForm($filialenData, $wochentagData, $abholzeitenData);
$objTemplate->shippingMethods = $this->modules;
return $objTemplate->parse();
}
und eine weitere Methode geschrieben, um mir die Formulare "erschaffen" zu können. Ich habe das probehalber erst mal nur für die Filialen gemacht.
PHP-Code:
private function generateShippingMethodForm($filialenData, $wochentagData, $abholzeitenData)
{
$html = '';
$html .= '<label for="filialeSelect">Filiale auswählen:</label>';
$html .= '<select id="filialeSelect" name="filialeSelect">';
foreach ($filialenData as $filiale) {
$html .= '<option value="' . $filiale['id'] . '">' . $filiale['filialid'] . ' - ' . $filiale['city'] . ' - ' . $filiale['street'] . '</option>';
}
$html .= '</select>';
$html .= '<input type="submit" class="submit button" name="selectFiliale" value="Filiale auswählen">';
return $html;
}
Das Problem ist nun, da ich um die Filiale zu bestätigen, die Datenbankabfragen zu starten und die Session zu speichern einen Submit habe und wir im iso_mod_checkout Template für die Kasse ebenfalls Submits für zurück und weiter habe, erfüllen diese nun alle die selbe Funktion. Drück ich auf Filiale auswählen(siehe Bild) gehe ich zum nächsten Step. Das will ich ja nicht, weil ich eigentlich danach die Tage und Zeiten auswählen können.
Wir kann ich das lösen? Javascript und Ajax? Allerdings weiß ich nicht, wie man Ajax hier verwendet bzw habe damit noch nie etwas gemacht. Gibts es sonst noch eine andere Lösung mit PHP?