Loading...
Navigation überspringen

Verwendung eines eigenen PriceCalculation-Service

Oft kann es vorkommen, dasw Du ganz spezielle Regeln für Deine Preisberechnung benötigst. Daher ist es mit der Buchungserweiterung möglich, einen eigenen Preisberechnungs-Service zu verwenden. Wie dies funktioniert, kannst Du im Folgenden lesen.

In diesem Beispiel wollen wir ein Zimmer vermieten, dass zwischen Sonntag- und Freitagnacht 134€ kostet und zwischen Freitag- und Sonntagnacht 154€. Wenn eine Buchung bspw. von Mittwoch bis Sonntag geht, soll immer der kleinere Preis genommen werden. Diese Berechnung findest Du im Price Calculation: Weekend Overnights.

Vorbereitung und Registrierung des Service

Der eigene Service muss die abstrakte Klasse AbstractPriceCalculationService implementieren. Diesen Service kannst Du in einer eigenen Erweiterung ablegen und würde grundsätzlich wie folgt aussehen:

namespace CodingMs\Bookings\Service;
use CodingMs\Bookings\Domain\Model\BookingObject;
class PriceCalculationExampleService extends AbstractPriceCalculationService
{

    /**
     * @param BookingObject $bookingObject
     * @param array $data
     * @return array
     */
    public function calculate($bookingObject, $data): array
    {
        $calculation = $this->prepareData($bookingObject, $data);

        // ...

        return $calculation;
    }

}

Der vorbereitete Service muss dann im System registriert werden. Dies machen wir mit einem TCA-Override. Dazu legen wir eine Datei mit dem Namen tx_bookings_domain_model_bookingobject.php in das Verzeichnis Configuration/TCA/Overrides/ unserer Erweiterung. Du musst die Datei natürlich in Deine Erweiterung/Theme legen. Wichtig ist nur, dass diese geladen wird und den folgenden Inhalt erhält:

<?php
if (!defined('TYPO3_MODE')) {
    die ('Access denied.');
}

$GLOBALS['TCA']['tx_bookings_domain_model_bookingobject']['columns']['record_type']['config']['items'][] =
    ['Price Calculation: Weekend Overnights', '\CodingMs\Bookings\Service\PriceCalculationWeekendOvernightsService'];

// Display Fields
$extKey = 'bookings';
$table = 'tx_bookings_domain_model_bookingobject';
$lll = 'LLL:EXT:' . $extKey . '/Resources/Private/Language/locallang_db.xlf:' . $table;
$GLOBALS['TCA']['tx_bookings_domain_model_bookingobject']['types']['\CodingMs\Bookings\Service\PriceCalculationWeekendOvernightsService'] = [
    'showitem' => 'title,
        subtitle,
        --palette--;' . $lll . '.palette_min_max_persons;min_max_persons_children_selection,
        --palette--;' . $lll . '.palette_min_max_days;min_max_days,
        description,

    --div--;' . $lll . '.tab_relations,
        tags,
        categories,
        images,

    --div--;' . $lll . '.tab_bookings,
        booking_persons_required,
        bookings,

    --div--;' . $lll . '.tab_prices,
        record_type,
        record_type_information,
        currency,
        price_per_overnight,
        price_per_overnight_per_additional_person,
        additional_prices,
        payment_notices,

    --div--;' . $lll . '.tab_map,
        --palette--;' . $lll . '.palette_map_latitude_longitude;map_latitude_longitude,
        map_zoom,

    --div--;' . $lll . '.tab_language,
        sys_language_uid,
        l10n_parent,
        l10n_diffsource,

    --div--;' . $lll . '.tab_access,
        hidden,
        starttime,
        endtime',
];

Hier fügst Du Deinem Calculation-Service der Auswahl hinzu. Der Namespace und die Klasse muss natürlich mit Deinem Namen angepasst werden. Nach dem Leeren des System-Cache sollte die neue Auswahl zur Verfügung stehen.

Im Bereich showitem kannst Du festlegen, welche Felder für Deinem Service angezeigt werden.

Wähle diese in einem Buchungsobjekt aus, so dass Du Sie diese testen kannst.

Ausgabe der Berechnungstabelle

Der AJAX-Service lässt seine Daten über Ihren Preisberechnungs-Service berechnen und übergibt das Ergebnis dann an das hinterlegte Fluid-Template, welches dann das HTML rendert das zurückgegeben wird. Hier bei wird das Fluid Partial EXT:bookings/Resources/Private/Partials/Bookings/PriceCalculation.html verwendet. Dieses kannst Du wie gewohnt mit Hilfe von TypoScript überschreiben.

Somit bist Du selbst bei der Ausgabe Deiner Kalkulation maximal flexibel.

Fehler-Behandlung

-> Einfach eine Exception werfen!

Kontaktanfrage

Sie können uns jederzeit kontaktieren

Stop! Playing in the meantime?
Stop! Playing in the meantime?
Stop! Playing in the meantime?

Stop! Playing in the meantime?

Break the highscore

Press Start
Contact request
Screenreader label
Security question
DLR_________TUP______
7_7____B______T___BQ9
6_I___E7H___U3E______
1_A____Y____B_____RGY
CKO_________QZL______