Eigene Funktion im Template ausführen

Hallo liebe Community,

ich bin neu hier und auch recht frisch im Umgang mit Oxid, also eigentlich ein Newbie. Daher hoffe ich, dass ich mit meiner Frage hier richtig bin, obwohl ich den Ausdruck “Entwickler” im Zusammenhang mit mir fehl am Platz finde.

Zum Status:
Ich verwende lokal die CE 4.5.0 .
Ich beschäftige mich grade seit kurzem mit der Smarty-Technologie.
Php geht, bin aber weit vom Status “Programmierer” entfernt.

Ich möchte:
in der Detail-Ansicht die MwStr. anzeigen. Da die aber nur im Warenkorb auf die Summe berechnet wird, möchte ich eine eigene Funktion in meiner extended class bauen, die aus der Differenz des Netto- und des Bruttopreises die MwStr. errechnet und das Resultat mit z.B. [{ $product->getMwStr() }] ausgeben.

Ich habe bisher:

  • ein neues tpl erstellt - Kopie von details.tpl in dem der Funktionsaufruf stattfinden soll, da ich die Änderungen nur bei bestimmten Artikeln bzw. Kategorien haben möchte.
  • ein eigenes Modul erstellt, indem ich eine Klasse erweitere. Hier kann ich auch bereits vorhandene Funktionen manipulieren ( Bsp.: setPrice() ).
  • mittles [{ debug }] herausgefunden, welche Funktionen ich im details.tpl ausführen kann ( z.B.:[{ $product->getFPrice() }] ) oder welche Werte ich ausgeben kann.
  • probiert, aus der oxtsproduct.php weitere functions auszuführen z.B.: [{ $product->getAmount() }], was aber nicht funktionierte, weil diese Funktion offensichtlich nicht für die $product verfügbar ist.

mein(e) Problem(e):

  • wie komme ich an die Variablen, die ich zur Berechnung in meiner Funktion brauche?
  • wie kann ich diese neue Funktion für die Variable $product verfügbar machen.
  • kann ich z.B. getAmount() auch für $product verfügbar machen und wenn ja, wie?

Google mir seit Tagen die Finger wund, suche hier im Forum, habe diverse Anleitungen durch. Teste und probiere…Habe immer wieder kleinere Erfolge zu verzeichnen, komme aber jetzt nicht mehr weiter, da mir offenbar das Verständnis fehlt. Vielleicht reicht ein Schubs…

Danke vorab.
Gruß, Jörg

Hallo Jörg,

was Du schreiben möchtest, ist im Oxid-Jargon ein “Modul”.

Oxid hat ein eigenes Plugin-System, welches es Dir erlaubt bestehende Oxid-Klassen on-the-fly durch eigene Erweiterungen zu ergänzen oder zu überschreiben.
Dort hast Du dann auch eine größere Bandbreite an Methoden und Variablen mit denen Du arbeiten kannst.

Schau Dir mal diese beiden Beiträge an:
http://www.oxid-esales.com/en/news/blog/howto-extend-oxid-eshop-modules-part-1
http://www.oxid-esales.com/en/news/blog/how-extend-oxid-eshop-part2

Gruß

Also für die einfache Subtraktion kannst Du Smarty nehmen:

[{math assign="ox_mwst" equation="(x-y)" x=$product->oxarticles__oxbruttoprice->value y=$product->oxarticles__oxnettoprice->value }] [{ $ox_mwst|number_format:"2"}]  

oxbrutto & netto mußt anpassen.

[QUOTE=rubbercut;60704]Also für die einfache Subtraktion…[/QUOTE]
Schade, dass man Beiträgen hier kein Thumps-Up geben kann, sonst hättest Du jetzt einen bekommen. :wink:

Hi Mitch, hi Cabalon,
besten Dank für eure schnellen Antworten.

@Mitch: die Beiträge kenne ich soweit schon. Ein Modul habe ich auch schon erstellt. Mein Problem sind die Funktionen in dem Ext-modul und deren Aufruf im tpl.
Verstehe ich dich richtig, dass ich immer bestehende Funktionen nehmen muss, die ich dann verändere/überschreibe?
Oder gibt es auch die Möglichkeit neue Funktionen zu erstellen ( und hier wäre dann die Frage der Syntax bzw. wie rufe ich die auf - probiert habe ich es schon, nur leider ohne Erfolg… )

@rubbercut: danke für das Snippet - sobald ich’ s ausprobiert habe, melde ich mich dazu.

Gruß, Jörg

[QUOTE=leyding;60722]
@Mitch: die Beiträge kenne ich soweit schon. Ein Modul habe ich auch schon erstellt. Mein Problem sind die Funktionen in dem Ext-modul und deren Aufruf im tpl.
Verstehe ich dich richtig, dass ich immer bestehende Funktionen nehmen muss, die ich dann verändere/überschreibe?
Oder gibt es auch die Möglichkeit neue Funktionen zu erstellen ( und hier wäre dann die Frage der Syntax bzw. wie rufe ich die auf - probiert habe ich es schon, nur leider ohne Erfolg… )
Gruß, Jörg[/QUOTE]

Du kannst sowohl vorhandene Methoden überschreiben, als auch eigene definieren. Du bist diesbezüglich völlig frei.
Die rufst Du im Template genau so auf, wie jede andere Methode.

Beispiel:
Du erweiterst oxArticle um folgende Methode:


public function getEmptyString()
{
  return '';
}

Dann rufst Du die im Template auch via $product->getEmptyString() auf bzw. dem Variablennamen, der dem oxArticle entspräche.

Für das was Du vorhast, reicht aber rubbercut’s Vorschlag völlig aus, da der Rest einiges an technischem Verständnis voraussetzt (Wissen um OOP, das Oxid Pluginsystem etc.).

Gruß

[QUOTE=leyding;60700]
mein(e) Problem(e):

  • wie komme ich an die Variablen, die ich zur Berechnung in meiner Funktion brauche?
  • wie kann ich diese neue Funktion für die Variable $product verfügbar machen.
  • kann ich z.B. getAmount() auch für $product verfügbar machen und wenn ja, wie?
    [/QUOTE]
  • wenn du eine Klasse erweiterst, hast du natürlich in deiner erweiterten Klasse alle Eigenschaften und Methoden der Klasse zur Verfügung.
  • $product ist in diesem Template ein oxarticle Objekt. Wenn du also oxarticle erweiterst und eine Funktion hinzufügst, hast du diese Funktion auch für $product.
  • oxtsproduct: “TRusted shops protection product manager.” hat also nix damit zu tun

Wenn du eigene Module erstellst, ist es am besten sich an bestehenden Funktionen zu orientieren. Für die Ausgabe der Mehrwertsteuer kannst du “getFPrice()” abwandeln.
Modul oxarticle => showvat_oxarticle:

<?php
class showvat_oxarticle extends showvat_oxarticle_parent{ 
    public function getFVat()
    {
        if ( $oPrice = $this->getPrice() ) {
            return $this->getPriceFromPrefix().oxLang::getInstance()->formatCurrency( $oPrice->getVatValue() );
        }
    }
}

Das kannst du dann im Template genau wie den Preis aufrufen:

[{ $product->getFVat() }]

Hallo Mitch & Frank,

ich danke euch vielmals für eure Antworten. Ihr habt mir sehr weitergeholfen!!!
Die Ausgabe der MwStr. klappt super!
Jetzt hoffe ich, dass ich mit meinem neuen Wissen einen kleinen Zuschnitt-Rechner umgesetzt kriege.

Gruß, Jörg

Dann schreib doch mal, wie Du`s gemacht hast. Ist für andere bestimmt hilfreich.

Schönes WE.

Dann schreib doch mal, wie Du`s gemacht hast. Ist für andere bestimmt hilfreich.

Das mache ich gern’ , wenn ich soweit bin.

Derzeitiger Zwischenstand:
Die Ausgabe der MwStr. habe ich mit dem Vorschlag von leofonic ( #Top '#7 ) umgesetzt - also eigenes Modul, eigene Funktion, dann diese Funktion im tpl aufgerufen - klappt.
Der Vorschlag von rubbercut ( #Top #3 ) funktioniert so bei mir nicht - ich bekomme folgende Fehlermeldung im Frontend:


Warning: Smarty error: math: parameter x is empty in O:\xampp\htdocs\oxid\core\smarty\Smarty.class.php on line 1093
0.00 

Debug zeigt mir an, dass die variablen =null sind, daher wohl auch kein Ergebnis


{$product}->oxarticles__oxbruttoprice = null
{$product}->oxarticles__oxnettoprice = null

Mit der Umsetzung eines kleinen Rechners bin ich noch nicht so weit - es soll hier möglich sein, den Bruttopreis mittels eines Eingabefeldes, in dem man eine Längenmaß eingeben kann, entsprechend zu manipulieren.
Offensichtlich ( lt. meinen Recherchen… ) muss ich hierfür mit PersParam arbeiten ( da muss ich aber noch mal sehen, wie das genau geht… ), um die Werte dieses Feldes an eine eigene Funktion in einem eigenen Modul weiterzugeben und dort den geänderten Preis zu berechnen.
Oder in einem eigenen Modul die “public function setPrice()” zu manipulieren.
Ich halte hier das Erstellen einer neuen Funktion und deren Aufruf in einem eigenen tpl - z.B.:details_kopie.tpl ( das dann via Backend: Artikel verwalten -> Artikel -> Erweitert -> Alt. Template dem Artikel zuweisen ) für besser, um setPrice(), die auch noch im Original verwendet werden muss, nicht zu überschreiben.

So sieht 's derzeit bei mir aus. Ich hoffe, ich habe mich einigermaßen verständlich ausgedrückt. Wenn ich weiter bin, gibt 's mehr Info’s.

Gruß, Jörg

Tja - nächste Verständisfrage…
Versuche grade mit persParam einen Wert zur Manipulation von getFPrice() an die entsprechende Funktion zur Berechnung ( siehe #Top #10 )zu übergeben.
Alles was ich an Info’s finden kann, ist eine Übergabe von persParam an den Warenkorb.
Ist es überhaupt möglich per persParam Werte gezielt an ein Script zu übergeben?
Und - sollte ich für diese Fragen einen neuen thread aufmachen, weil sie über meine ursprüngliche Frage hinausgehen?

Gruß, Jörg

Hi, ich hatte doch geschrieben, dass Du brutto und netto noch anpassen musst.

oxbruttoprice oxnettoprice

gibt`s so natürlich nicht.

Hi rubbercut,
du kennst auch kein Wochenende… :wink:

Ja, hast du. Ich habe gesucht/suche nur nach wie vor, wie ich 's anpassen kann. Debug gibt mir nix. Finde kein Feld in der Datenbank. Und wenn ich in den classes suche, finde ich auch nichts, was brauchbare Werte liefert, bzw. keine Fehlermeldung ergibt.
Hatte eigentlich gedacht, dass eure Tipps mich weitergebracht hätten ( was mein Verständnis angeht ), aber ich glaube, das ganze System ist für mich einfach von der Logik her nicht verständlich.
Für mich ist es unglaublich schwer nachzuvollziehen, woher ich die einzelnen Werte beziehen kann.
Ohne ausreichende Smarty-Kenntnisse ist da glaube ich wenig zu machen - aber dafür fehlt mir im Moment die Zeit.
Meine Idee von einem einfachen Rechner werde ich wohl erst mal begraben und mich mit der Modul-Variante von eKommIT befassen, obwohl das für meine Zwecke overpaced ist.
Erstmal Danke für eure Mühe.

Gruß, Jörg

Vereinfacht sieht das so aus:

Detailansicht (Text und Klasse für CSS bitte selbst einfügen):

productmain.tpl
Suche:

<strong>[{$fPrice}] [{$currency->sign}] *</strong>

Ersetze mit:

<strong>[{$fPrice}] [{$currency->sign}] *</strong>
								  [{math assign="ox_mwst" equation="(x-y)" x=$product->oxarticles__oxprice->value y=$product->oxarticles__oxprice->value/119*100 }] [{ $ox_mwst|number_format:"2"}]

Das gleiche für die Listenansicht (Text und Klasse für CSS bitte selbst einfügen):

listitem_infogrid.tpl
Suche:

[{if $product->getFPrice()}]
                        <span class="price">[{ $product->getFPrice() }] [{ $currency->sign}] [{if !($product->hasMdVariants() || ($oViewConf->showSelectListsInList() && $product->getSelections(1)) || $product->getVariantList())}]*[{/if}]</span>
                    [{/if}]

Ersetze mit:

[{if $product->getFPrice()}]
                        <span class="price">[{ $product->getFPrice() }] [{ $currency->sign}] [{if !($product->hasMdVariants() || ($oViewConf->showSelectListsInList() && $product->getSelections(1)) || $product->getVariantList())}]*[{/if}]</span>
						
						  [{math assign="ox_mwst" equation="(x-y)" x=$oDetailsProduct->oxarticles__oxprice->value y=$oDetailsProduct->oxarticles__oxprice->value/119*100 }] [{ $ox_mwst|number_format:"2"}]
                    [{/if}]

Hi rubbercut,

hab 's geschnallt!
Auf die Idee, dass der Bruttpreis ja für alle Berechnungen ausreicht, bin ich gar nicht gekommen…
Wie genial…
Hier mal der Code für productmain.tpl:


<div style="border:1px solid red; width:200px;height:50px; clear:both; text-align:right; padding:10px;">
<strong>[{$fPrice}] [{$currency->sign}] *</strong> : Bruttopreis
<br />
  [{math assign="ox_mwst" equation="(x-y)" x=$oDetailsProduct->oxarticles__oxprice->value y=$oDetailsProduct->oxarticles__oxprice->value/119*100 }] [{ $ox_mwst|number_format:"2"}] [{$currency->sign}] : MwSt. 19%
<br />[{math assign="ox_brutto" equation="(x-y)" x=$oDetailsProduct->oxarticles__oxprice->value y=$ox_mwst }] [{ $ox_brutto|number_format:"2"}] [{$currency->sign}] : Nettopreis
</div>

jetzt muss ich noch mal herausfinden, wie ich per persParam einen wert an eine Funktion übergeben, dort auslesen und weiterverarbeiten kann.

Ich danke dir nochmals.

Gruß, Jörg

Ach so - natürlich brutto - Netto andersrum…

Hello again,

ich hatte ja bereits erwähnt, dass ich mit den neu erworbenen Kenntnissen einen kleinen Rechner für Zuschnitte bauen möchte.
Habe dann auch den angezeigten Preis ( details.tpl ) manipulieren können, indem ich eine Längenangabe machen kann, die Variable wird dann an eine eigene class


<?php
class zuschnitte extends zuschnitte_parent {
 public function setPrice($newPrice, $dVat = null) {
      $test = $_POST["laenge"]; 
        if ($test > 0) {
          $this->_dBrutto = $newPrice*$test;
        }
        else {
          $this->_dBrutto = $newPrice;
        } 
            
    $this->_recalculate(); 
    }                       
}
?>

übertragen und dort weiterverarbeitet.


<div id="versuch_03" style="border:2px solid red; padding:20px; margin-top:20px; clear:both;">

<form action="../../../modules/eigeneModule/zuschnitte.php" method="post">

<div class="label">Länge:</div>
<div class="feld"><input type="text" name="laenge" value="" /></div>
<div class="einheit">in mm</div>
<div class="clearer"></div>

<div class="button"><input type="Submit" value="berechnen"></div>
</form>
</div>

Problem: um die Variable auf die Reise zu schicken, setze ich einen Submit-Button ein, der das Ganze sofort auch in den Warenkorb befördert, was natürlich nicht gewünscht ist.

Habe nun versucht, die Variable mittels Javascript an die extended class ( hier auch post in get geändert… ) zu übergeben.


<div id="versuch_04" style="border:2px solid red; padding:20px; margin-top:20px; clear:both;">
<script type="text/javascript">
function zeig() {
var laenge = document.getElementById("preis").value;
self.location.href = "../../modules/eigeneModule/zuschnitte.php?laenge="+laenge;
}
</script>
<div class="label">Länge:</div>
<div class="feld"><input type="text" name="laenge" id="preis" value="" /></div>
<div class="einheit">in mm</div>
<div class="clearer"></div>

<input type="button" value="anzeigen" onclick="zeig()" />

<!-- in dem p tag wird es angezeigt -->
<p id="show"></p>
</div>

Problem hier:
Wenn ich die gleichen Pfad-Angaben, wie bei der Variante mit php nehmen, wird die extended class nicht gefunden.
Ändere ich den Pfad, wird sie scheinbar gefunden, gibt aber die Fehler-Meldung:

Fatal error: Class ‘zuschnitte_parent’ not found in O:\xampp\htdocs\oxid\modules\eigeneModule\zuschnitte.php on line 2

Wie kann soetwas sein?
Die eigentliche Übergabe der Variable von Javascript an php funktioniert, wenn ich die Scripte ohne OXID laufen lasse.

Gruß, Jörg

Mach Dich mal mit den internen Funktionen vertraut. Bsp.:

<input type="hidden" name="cl" value="zuschnitte">

Die Übertragung kannst Du auch mit AJAX (ohne Reload) einrichten.

Hi rubbercut,

danke für deinen Tipp. Werde ich machen.

Gruß, Jörg

Moin - da bin ich wieder.

War kurz im Urlaub, daher geht erst jetzt die Quälerei wieder weiter.

Habe mich mit Ajax beschäftig und auch funktionierende Scripte hingekriegt.
Aber: sobald ich versuche die in Oxid zu integrieren, funktioniert 's nicht mehr.
Hier ein Script, das “normal” läuft


<div id="versuch_03" style="border:2px solid red; padding:20px; margin-top:20px; clear:both;">

<script type="text/javascript">
  function rechne(){
   if (window.XMLHttpRequest){
    myAjax = new XMLHttpRequest();
   }else{
    //Dieser Code wird als Fallback für den IE5 und IE6 benötigt, da diese die obrige Schreibweise nicht unterstützen.
    myAjax = new ActiveXObject("Microsoft.XMLHTTP");
   }
 
   myAjax.onreadystatechange=function(){
    if (myAjax.readyState==4 && myAjax.status==200){
     document.getElementById("output").innerHTML = myAjax.responseText;
    }
   };
 
   myAjax.open("GET", "seite2.php?laenge="+laenge.value, true);
   
   myAjax.send();
  }
</script>

<div class="label">Länge:</div>
<div class="feld"><input type="text" id="laenge" value="" /></div>
<div class="einheit">in mm</div>
<div class="clearer"></div>

<input type="button" value="berechnen" onclick="rechne()" />  
<!-- in diesem div wird das Ergebnis angezeigt -->
<div class="feld" id="output">hier ausgabe!</div>

</div>

in Oxid gibt 's die Fehlermeldung ( Firebug ):


laenge is not defined
myAjax.open("GET", "seite2.php?laenge="+laenge, true); 

Wieß jemand wieso das so ist?

@rubbercut: wo finde ich denn Infos über “interne Funktionen”? Was immer ich google, führt zu keinem Erfolg. Habe auch auf der Oxid-Seite die Suche bemüht ( u.a. auch für den Zusammenhang Ajax+Oxid - da finde ich immer nur Verweise zu kaufbaren Extensions).

Ich würde sehr gern weiterlernen, weiß nur nicht mehr, wo ich ansetzen soll.

Bin für sachdienliche Hinweise sehr dankbar :wink:

Gruß, Jörg