Wir haben ein Plugin, welches den Preis ausblendet, wenn dieser nach einer festgelegten Zeit abgelaufen ist. Der Preis wird dann mit dem Text „Preis auf Anfrage“ ersetzt.
Wenn dieser Text erscheint, soll der Warenkorb Button auf der Detailseite ausgeblendet werden.
Es müsste sich hier doch um die Klassen
.buybox–button-container
und
.price–content
handeln, richtig?
Ich kenne mich auf dem Gebiet leider nicht so gut aus, meine Vorstellung ist ungefähr diese:
if .price–content:contains „Preis auf Anfrage“
dann
.buybox–button-container visability: hidden
Wie CSS oder Javascript Code (Theme/frontend/detail/content/buy_container.tpl) eingebunden wird weiß ich.
Über Tipps oder Codevorschläge wäre ich sehr dankbar.
Lars
if (document.querySelector(".price–content").textContent == "Preis auf Anfrage"){
document.querySelector(".buybox–button-container").style.display = "none";
}
Das verhindert jedoch nicht, dass man trotzdem bestellen könnte wenn man "wollte" und ein Scriptkiddie das ausnutzt.
Besser wäre hier auf Template - Ebene was umzusetzten.
Fatal error : Uncaught SmartyCompilerException: Syntax Error in template „/html/shopware/test/themes/Frontend/MeinTheme/frontend/detail/content/buy_container.tpl“ on line 2 „{if (document.querySelector(".price–content").textContent == "Preis auf Anfrage")}{“ - Unexpected „.“ in /html/shopware/test/engine/Library/Smarty/sysplugins/smarty_internal_templatecompilerbase.php:657 Stack trace: #0 /html/shopware/test/engine/Library/Smarty/sysplugins/smarty_internal_templateparser.php(3144): Smarty_Internal_TemplateCompilerBase->trigger_template_error() #1 /html/shopware/test/engine/Library/Smarty/sysplugins/smarty_internal_templateparser.php(3209): Smarty_Internal_Templateparser->yy_syntax_error(59, ‚.‘) #2 /html/shopware/test/engine/Library/Smarty/sysplugins/smarty_internal_smartytemplatecompiler.php(105): Smarty_Internal_Templateparser->doParse(59, ‚.‘) #3 /html/shopware/test/engine/Library/Smarty/sysplugins/smarty_internal_templatecompilerbase.php(192): Sm in /html/shopware/test/engine/Library/Smarty/sysplugins/smarty_internal_templatecompilerbase.php on line 657
Ich gehe mal von einem groben Fehler meinerseits aus.
Ich konnte den Code nun implementieren, er funktioniert nur nicht so wie gewünscht.
Sobald ein Preis abgelaufen ist, wird wie schon erwähnt „Preis auf Anfrage“ im Preisfeld angezeigt. Da der Warenkorb Button dann immer noch sichtbar ist, habe ich es mit folgendem Code versucht:
if (document.querySelector(".product--details .product--buybox .price--content").innerHTML = "Preis auf Anfrage" && document.querySelector(".buy-btn--cart-text").innerHTML == "Warenkorb"){
document.querySelector(".buybox--button-container").style.display = "none";
}
Problem: Im Preisfeld wird nun „true“ ausgegeben und bei einem Artikel mit gültigem Preis steht ebenfalls „true“ und der Warenkorb-Button wird auch hier ausgeblendet.
Zur Info: „Preis auf Anfrage“ && „Warenkorb“ muss sein, da wir auch Produkte haben, wo „Preis auf Anfrage“ und ein Anfrage-Button statt Warenkorb-Button angezeigt wird und dieser soll eben nicht verschwinden.
Ich hoffe das alles ist einigermaßen verständlich.
wenn ich aus dem „=“ ein „==“ mache, dann scheint der Code nicht mehr zu funktionieren, der .buybox–button-container wird also nicht mehr ausgeblendet. Weißt du woran das liegen könnte oder hättest spontan einen anderen Lösungsansatz?
Wie binde ich die Variable denn ein, damit diese auch den gewünschten Wert ausgibt? Wenn ich einfach https://www.DOMAIN.de/test/anfrage-formular?sInquiry=detail&sOrdernumber={$sArticle.ordernumber}
schreibe wird die Variable als Text ausgegeben.
Daten zu unserem Plugin für Warenkorb und Anfragebutton:
$uvRiPrDiRe_tmpdata_activate_output == '1' // Anfragebutton aktiv $uvRiPrDiRe_tmpdata_activate_output == '2' // Warenkorb aktiv 's_articles_attributes', 'outputschema_article_request_module' // Vielleicht auch wichtig?
Nun könnte man doch auf unser vorhandenes Plugin zugreifen und folgendes prüfen:
if $uvRiPrDiRe_tmpdata_activate_output == '2'
UND (document.querySelector(".product--details .product--buybox .price--content").innerHTML.includes("Preis auf Anfrage")
DANN $uvRiPrDiRe_tmpdata_activate_output == '1'
Die Einstellung $uvRiPrDiRe_tmpdata_activate_output wird allerdings in der WaWi gesetzt und übertragen.
So ganz blicke ich nicht durch. Aber wenn Du beim Plugin Smarty-Code definieren kannst, der dann mit reinkompiliert wird, dann sollte dein letzter Ansatz zielführend sein. Ansonsten (soweit Source-Code vorhanden) kannst Du ja notfalls auch das Plugin selbst anpassen, denn der Ansatz mit JS ist nicht wirklich sauber…
Selbst wenn der Code funktionieren würde, fehlt mir dort immer noch die && Abfrage, weil der Code ja nur greifen soll, wenn in .product--details .product--buybox .price--content „Preis auf Anfrage“ steht. Ich habe einfach keine Ahnung, wie dieser aufgebaut sein muss.
Ich finde im Gegensatz zu JS oder CSS auch einfach nichts hilfreiches beim Googlen.
Oder bin ich generell mit der buy.tpl komplett auf dem Holzweg?
Naja, das Problem scheint ja zu sein, dass das Plugin den DOM im Frontend dynamisch ändert - in diesem Falle musst du es wohl oder übel mit JS machen, welches auch im Frontend läuft (oder gleich das Plugin anpassen). Und du musst auch bedenken, dass da ggf. noch der Cache mit reinspielt.
Da wir aber das Plugin und seine Arbeitsweise nicht kennen, wird es schwierig dir da aus der Ferne zu helfen.
{if $uvRiPrDiRe_tmpdata_schema_prod_request_button == '1' || $sArticle.price|strstr:'Preis auf Anfrage'}
und {if $uvRiPrDiRe_tmpdata_schema_prod_request_button == '1' || $sArticle.price == "Preis auf Anfrage"}
Ich habe schon einiges ausprobiert. Die Variable $sArticle.price funktioniert mit Zahlen, nur leider mit dem Text nicht. Wie kann man bei dieser Variable auf den Text zugreifen?
der Code-Schnipsel von Deinem Plugin ändert doch den “Kaufen”-Button bereits so ab, dass dieser den Artikel nicht mehr in den Warenkorb legt, sondern das Anfrageformular triggert. Was genau willst Du denn erreichen?
Der Code wird nur genutzt, wenn das Ausgabeschema 1 (für reine Anfrageartikel) aktiv ist. Beim Ausgabeschema 2 ist der Warenkorb-Button aktiv. Wenn der Preis allerdings abläuft, steht im Preisfeld „Preis auf Anfrage“, der Warenkorb-Button bleibt aber. Um das zu verhindern würde ich gerne || $sArticle.price|strstr:'Preis auf Anfrage'
oder ähnlich anhängen. Mit Zahlen habe ich die Variable getestet und das funktioniert auch, nur eben mit dem Text nicht.
Ich habe auch schon versucht, auf das Ablaufdatum per Variable zuzugreifen, das hat auch nicht geklappt.
Die Variablen fürs Ablaufdatum sind:
$showPrice = $showPrice && $currentDate <= $priceValidUntil
oder nur
$currentDate <= $priceValidUntil
Ja, aber das liegt einfach daran, dass dieses Plugin nicht sauber implementiert ist. Schon mal den Hersteller/Autor mit diesem Problem konfrontiert?
All Deine Versuche oben werden so nicht zum Ziel führen, da Smarty-Code ja kompiliert wird, und diese Seite dann im Cache landet. Somit ist es nicht so ohne weiteres möglich, den Inhalt einer Seite zu dynamisieren. Das {nocache} von Smarty funktioniert mit Shopware nicht, um also einzelne Werte über ESI Tags immer „frisch“ anzufordern, braucht man ein Action-Widget und nutzt dann im Smarty-Code den {action…} Befehl. Siehe auch
Da es das Plugin allerdings irgendwie hinbekommt, den Preis durch „Preis auf Anfrage“ zu ersetzen, sollte es eigentlich im gleichen Zuge auch möglich sein, die Lieferzeit auszublenden und einen anderen Button auszugeben.
Der Ansatz mit JS läuft ja im Browser. Dort allerdings den gesamten DOM zu verbiegen (damit der Button einmal in den Warenkorb legt, und einmal das Anfrageformular triggert) ist ziemlich unsauber.
Wenn, dann würde ich im buy.tpl einfach schon BEIDE Buttons ins HTML schreiben lassen, und den einen (zunächst) unsichtbar machen. In deinem JS Code switcht Du dann nur die Sichtbarkeit der beiden Buttons.
Der Shop in der Testumgebung war im Bearbeitungsmodus, der HTTP Cache war also deaktiviert.
Ich konnte nun in der buy.tpl auch auf die Variable vom Preis-Ablaufdatum zugreifen, was vermutlich die beste Lösung ist. Die Ein- und Ausblendung des jeweiligen Buttons in JS klappt ebenfalls.
Ich werde das Ganze nochmal intensiv testen und ein paar Szenarien durchspielen, betrachte das Problem aber erstmal als gelöst.