Ergebnis 1 bis 14 von 14

Thema: Isotope 2 - Preisstaffelung - Wie anzeige im Frontend

  1. #1
    Contao-Nutzer
    Registriert seit
    08.10.2012.
    Beiträge
    33

    Standard Isotope 2 - Preisstaffelung - Wie anzeige im Frontend

    Hallo zusammen,

    ich habe ein Problem mit der Preisstaffelung von Produkten.

    Ausgangsszenario:
    Bei einem Produkt soll die Einheit 10 Euro kosten
    Wenn man aber 3 oder mehr soll jede Einheit nur noch 8 Euro kosten.


    Angelegt habe ich das bereits schon bei dem Produkt-Preis (Erweiterte Preisangaben) ist aktiviert. Berechnung und alles klappt auch.


    Jetzt habe ich ab das Problem mit der Anzeige:

    Wie gibt man das im Frontend automatisch auf der Artikel-Detailseite aus, sodass der Käufer direkt sehen kann, ab welcher Menge das Produkt-Billiger wird ?

    Ich bekomme es einfach nicht hin. In Isotope 1.4 hatte ich mir damals etwas zusammen Programmiert, was das ganze umwandelt und mir ausgibt.

    Allerdings ist das mit Isptope 2 nicht mehr möglich. Ich habe mich auch schon durch die verschiedenen Objecte und Interfaces durchgewurschtelt, allerdings bekomm ich entweder nur

    den Einheitspreis anzeiegt - also 10,00 Euro oder aber ich bekomme die Anzeige ab 8,00 Euro angezeigt.


    Gibt es vielleicht hier jemanden, der mir kurz erklären kann, wie man das am geschicktesten im iso_productreader - Template einträgt?

    Viele Grüße

    Ben

  2. #2
    Contao-Fan Avatar von syncgw
    Registriert seit
    17.07.2012.
    Beiträge
    313

    Standard

    Hi,
    hast du eine Lösung dafür gefunden? Ich hab es zur Zeit in der Beschreibung mit abgelegt - sicherer ist es aber die Daten direkt aus dem Produkt zu geneieren...
    __________________________________________
    Live long and prosper
    Florian

    Spenden GitHub

  3. #3
    Contao-Fan Avatar von syncgw
    Registriert seit
    17.07.2012.
    Beiträge
    313

    Standard

    Ha... jetzt hab ich es doch gefunden:

    Code:
    $this->product->getPrice()->current()->getTiers()
    Gut versteckt
    __________________________________________
    Live long and prosper
    Florian

    Spenden GitHub

  4. #4
    Contao-Urgestein Avatar von Toflar
    Registriert seit
    15.06.2009.
    Beiträge
    4.468
    Partner-ID
    8667
    User beschenken
    Wunschliste

    Standard

    Man freut sich über Beiträge zum offiziellen Handbuch. Auf der Webseite ist sogar dokumentiert wie man helfen kann
    http://isotopeecommerce.org/de/handbuch-schreiben.html
    Contao Core-Entwickler @terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Individuallösungen kannst du uns gerne kontaktieren.
    PS: Heute schon getrakked?

  5. #5
    Contao-Nutzer
    Registriert seit
    03.09.2013.
    Ort
    Enzkreis
    Beiträge
    161

    Standard

    Hallo syncgw,

    Zitat Zitat von syncgw Beitrag anzeigen
    Ha... jetzt hab ich es doch gefunden:

    Code:
    $this->product->getPrice()->current()->getTiers()
    Gut versteckt
    danke dass Du die Lösung hier postest!
    Leider bleibt die Platzierung des Codes ein Rätsel für mich Nicht-Programmierer, egal in welchem Template (iso_reader_default, mod_iso_productreader) und an welcher Stelle ich ihn eintrage, ich bekomme immer nur die Ausgabe "Array" oder einen "Fatal error: Call to a member function getPrice() on a non-object".

    An welcher Stelle in welchem Template hast Du den Code eingefügt?
    Muss ich einen anderen Code-Schnipsel damit ersetzen?

    Wäre Dir sehr dankbar für Aufklärung!


    Grüßle

    Claudia

  6. #6
    Contao-Urgestein Avatar von Toflar
    Registriert seit
    15.06.2009.
    Beiträge
    4.468
    Partner-ID
    8667
    User beschenken
    Wunschliste

    Standard

    Die Meldung "on a non-object" ist klar. Du kannst nicht eine Methode aufrufen auf einer Variable die nicht existiert. Zuerst musst du herausfinden, welche Variable das Produkt repräsentiert. Eigentlich ist das immer

    PHP-Code:
    $this->product 
    Ausser bei Product Collections (Warenkorb, Bestellung etc.) da wird jedes Produkt dupliziert und als Item gehandhabt. Dies, damit die Daten nicht verloren gehen, sollte das eigentliche Produkt gelöscht werden. Insofern muss da zuerst das Produktobjekt das zum Item gehört geholt werden. Da eben der Fall eintreten kann, dass dieses Produkt nicht mehr vorhanden ist, empfiehlt es sich, diesen Fall abzufangen:

    PHP-Code:
    if ($item->hasProduct()) {
       
    $item->getProduct()

    Der Aufruf von "current()" ist unnötig. Die Rückgabe ist ein Array, weshalb du korrekterweise ein "Array" ausgegeben bekommst, wenn du einfach nur "echo" machst. Du musst aber über jede Staffel iterieren:

    PHP-Code:
    if ($this->product->hasTiers()) { // macht Sinn das zu prüfen
       
    foreach ($this->product->getTiers() as $min => $price) {
          echo 
    'Ab der Anzahl von ' $min ' kostet mein Käse ' $price;
       }

    Übrigens lässt sich der Preis bequem gemäss den Shop-Settings formatieren:

    PHP-Code:
    echo \Isotope\Isotope::formatPriceWithCurrency($price); 
    Contao Core-Entwickler @terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Individuallösungen kannst du uns gerne kontaktieren.
    PS: Heute schon getrakked?

  7. #7
    Contao-Nutzer
    Registriert seit
    03.09.2013.
    Ort
    Enzkreis
    Beiträge
    161

    Standard

    Vielen Dank für den sehr ausführlichen Exkurs, Toflar!

  8. #8
    Contao-Urgestein Avatar von Toflar
    Registriert seit
    15.06.2009.
    Beiträge
    4.468
    Partner-ID
    8667
    User beschenken
    Wunschliste

    Standard

    Gerne Wenn du das jetzt noch für Nicht-Entwickler verständlich im Handbuch ausführen könntest (muss nicht auf GitHub sein, ich nehme auch sonst was entgegen), dann wäre das klasse
    Wir könnten auch einen neuen Navigationspunkt für Templateanpassungen einführen...
    Contao Core-Entwickler @terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Individuallösungen kannst du uns gerne kontaktieren.
    PS: Heute schon getrakked?

  9. #9
    Contao-Nutzer
    Registriert seit
    03.09.2013.
    Ort
    Enzkreis
    Beiträge
    161

    Standard

    Das würde ich gerne, Toflar,

    aber ich habe es nicht umgesetzt bekommen, mir fehlen einfach die nötigen PHP-Kenntnisse (trotz X durchgeackerter Bücher, Tutorials & Co. und einer Weiterbildung mit PHP-Grundlagen - diese Programmiersprache will leider einfach nicht in meinen Kopf).

    Ich hoffe, dass jemand mit mehr PHP-Begabung den Handbuch-Part übernimmt!

    Du wirst aber etwas anderes von mir fürs Handbuch bekommen (falls das bis dahin noch mit dem netten Baustellen-Schild versehen ist), wenn ich mit meinem Shop durch bin und alles läuft wie es soll.


    Grüßle

    Claudia

  10. #10
    Contao-Nutzer
    Registriert seit
    08.04.2010.
    Ort
    Berlin
    Beiträge
    67

    Standard

    Ich kenne da einen Witz:

    Ein Englischmuttersprachler ohne Deutschkenntnisse und ein Deutschmuttersprachler ohne Englischkenntnisse unterhalten sich. Der Deutsche redet und redet. Als dieser fertig ist, lächelt sein Gegenüber freundlich, um vorzuspielen, er hätte auch nur ein Wort verstanden, um den Deutschen nicht zu verärgern. Daraufhin sagt der Deutsche: "Und jetzt sag das mal auf Englisch!"

    So in etwa lassen sich Posts hier zusammenfassen . Es ist offenbar ein altes Problem, dass Programmierer nur schwer distanziert erklären können, erst recht wenn es um Programmierer-Zeug geht. Ich selbst programmiere seit Jahrzehnten und erlebe das auch nicht zum ersten Mal.

    Aus gegebenem Anlass sind wir hier aber auch über das Problem mit der Preis-Staffelung gestolpert ...

    [Nur-für-Programmierer-Sprech an]
    Zunächst muss man sagen, dass Isotope da selbst noch ein wenig durcheinander kommt: Was bei den "Produkttypen" mit "Produktebenen anzeigen" beschriftet ist, intern "show_tiers" heißt, wird im fest verdrahteten Code für die Erzeugung der Preisangabe nur zu einer Anzeige des jeweils niedrigsten Preises, was zum Tipp unter jener Beschriftung im "Produkttypen"-Formular passt. Stringent ist anders. In einem Warenkorb wäre die Reduktion auf eine Preisangabe mit Bezug auf die im Korb befindliche Anzahl der Artikel verständlich, doch das Reduktionsbestreben im Code von Isotope hat diese Schlappe offenbar konzeptionell noch nicht verdaut.
    [Nur-für-Programmierer-Sprech aus]

    Die Ausführungen von Toflar oben passen nur bedingt. Ich habe hier mal ein Beispiel, wie sich die Preisstaffelung bspw. in der Detailansicht eines Produktes aktuell integrieren lässt. Die Anpassung erfolgt im Template iso_reader_default.html5 und ersetzt folgenden Code darin:

    PHP-Code:
    <div class="price" itemprop="price"><?php echo $this->generatePrice(); ?></div><?php if($this->baseprice): ?>
    Diese Zeile kann man durch folgenden mehrzeiligen Auszug ersetzen:

    PHP-Code:
    <div class="price" itemprop="price"><?php 

        $tiers 
    $this->product->getPrice()->current()->getTiers();
        if ( 
    count$tiers ) > ) { 

    ?>
        <ul>
    <?php 

            
    foreach ( $tiers as $count => $price ) {
                
    $price = \Isotope\Isotope::formatPriceWithCurrency$price );
    ?>
            <li>ab <?php echo $count ?> Stück: <?php echo $price ?></li>
    <?php
            

    ?>
        </ul>
    <?php 
    } else {
        echo 
    $this->generatePrice();
    ?></div><?php if($this->baseprice): ?>
    Dabei werden die Preisstaffelungen als Aufzählungsliste dargestellt.

    Kurz zur Erläuterung: Das erste if prüft, ob mehrere Staffelungen zum aktuellen Preis des Produkts vorliegen. Ist dies der Fall, dann wird nicht mehr der in der vorletzten Zeile noch vorhandene bisherige Code genutzt, der nur einen Preis anzeigt. Stattdessen wird eine <ul>-Liste eröffnet und mit foreach für jede Staffelung ein <li> zu dieser Liste ergänzt.

    Dieser Code ließ sich aber nicht mit den Beispielen realisieren, die toflar in seinem Post erwähnt. So warfen Versuche mit $this->product->getTiers() schwere Fehler (fatal errors). Und dass in der Einzelansicht ein Produkt mit einer Sammlung von Preisen vorliegt, die auch dann eine "Sammlung" ist, wenn darin nur ein Preiskonstrukt vorhanden ist, erschließt sich auch nur einem geübten Programmierer, der um einheitliche Schnittstellen bemüht ist. Daher findet sich auch das current() wieder ...

  11. #11
    Contao-Fan Avatar von bjarke
    Registriert seit
    07.06.2011.
    Beiträge
    354
    Partner-ID
    5067

    Standard

    ... oder wie im Handbuch beschrieben.

    PHP-Code:
    <?php echo $this->generateAttribute('price_tiers'); ?>

  12. #12
    Contao-Nutzer
    Registriert seit
    08.04.2010.
    Ort
    Berlin
    Beiträge
    67

    Standard

    Dann korrigiere ich mal meinen vorherigen Ersatz für die bereits genannte Stelle wie folgt:

    PHP-Code:
    <div class="price" itemprop="price"><?php 
    if ( count$this->product->getPrice()->current()->getTiers() ) > ) {
        echo 
    $this->generateAttribute('price_tiers');
    } else {
        echo 
    $this->generatePrice();
    }
    ?></div>
    <?php if($this->baseprice): ?>

  13. #13
    Contao-Urgestein Avatar von Toflar
    Registriert seit
    15.06.2009.
    Beiträge
    4.468
    Partner-ID
    8667
    User beschenken
    Wunschliste

    Standard

    PHP-Code:
    <div class="price" itemprop="price">
    <?php  
    if ($this->product->getPrice()->hasTiers()) { 
        echo 
    $this->generateAttribute('price_tiers'); 
    } else { 
        echo 
    $this->generatePrice(); 

    ?></div>
    wäre ziemlich kürzer :-)
    Contao Core-Entwickler @terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Individuallösungen kannst du uns gerne kontaktieren.
    PS: Heute schon getrakked?

  14. #14
    Contao-Nutzer
    Registriert seit
    08.04.2010.
    Ort
    Berlin
    Beiträge
    67

    Standard

    In der Tat. Auch diese Variante funktionierte in meinem Fall ... wenngleich die letzte Zeile aus meinem Schnippsel nicht vergessen werden sollte, damit die Erklärung als Ganzes funktioniert und Nichtprogrammierer nicht wieder vor neue Probleme stellt

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •