Oxstock der Varianten in der selection.tpl abfragen

Hallo,

ich habe ein problem wo ich aktuell nicht weiter komme. Und zwar möchte ich gerne den oxstock Wert der Varianten aus der oxarticles Tabelle in der selection.tpl in der foreach-anweisung auslesen.

oxarticles:

public function getVarStock()
{
$oDb = \OxidEsales\Eshop\Core\DatabaseProvider::getDb();
$sSql = "select oxstock from oxarticles where oxparentid = '" . $this->getId() . "'";
return $oDb->getOne($sSql);
}

sele ction.tpl

[{foreach from=$oSelections item=oSelection}]
<li class="[{if $oSelection->isDisabled()}]disabled js-disabled[{/if}][{$oDetailsProduct->getVarStock()}]">
<a href="[{$oSelection->getLink()}]" data-selection-id="[{$oSelection->getValue()}]" class="[{if $oSelection->isActive()}]active[{/if}]">[{$oSelection->getName()}]</a>
</li>
{/foreach}]

Das funktioniert leider nicht.

Wenn ich es mit [{$oDetailsProduct->oxarticles__oxstock->value}], gibt er mir den oxstock wert aus aber nur jeweils für die variante die auch ausgewählt ist und nicht für alle unabhängig davon welche variante ausgewählt ist.

Hier hier jemand eine idee oder ein tip wie ich das am besten lösen kann?

Oder mal ganz anders gefragt, wo wird denn die funktion getName in der selection.php zusammengebaut? Dann könnte ich evtl. diese funktion kopieren und anpassen, denn [{$oSelection->getName()}] funktioniert bestens in der foreach-anweisung in der selection.tpl.

Und eine andere frage noch. Wie kann ich z.b. eine eigene funktion in der articles.php erstellen und diese auch an ein anders template weiter geben. Also nicht nur an productmain.tpl sondern. z.b auch an die selection.tpl usw…

Ziel ist es die Varianten die ein oxstock wert < 1 haben in dem dropdown Feld auszugrauen bzw. nicht klickbar zu machen.

Die Varianten mit Nullbestand haben inaktiven Status. Mit der CSS-Klasse active oder einer zusätzlichen Klasse kannst du das Element darstellen, wie du willst. PHP-Programmierung ist dazu gar nicht nötig.

Das hatte auch gedacht/gehofft nach dem diese zeile in der selection.tpl gesehen habe.

[{if $oSelection->isDisabled()}]disabled js-disabled[{/if}]

Aber die abfrage scheint bei 0 bestand nicht zu greifen! Wann genau greift diese abfrage?

Hab mal eben eine variante auf 0 bestand gesetzt. Es ändert sich aber absolut nix an der variantenauswahl. Alle Varianten sind weiter klickbar und nur die aktive variante bekommt die klasse “active”. Die variante mit 0 bestand bekommt keine separate klasse.

Oxid 6.1.4

Bei multidimensionalen Varianten ist das evtl. problematisch. Hast du multidimensionale Varianten?

Die Selectlists wählen einfach nur aus. Wenn man bei md-Varianten eine Auswahl trifft und es gibt im 2. Auswahlfeld Werte die keine existierende Variante mit der ersten Auswahl haben, dann erscheinen die grau. Hat aber nicht direkt mit Stock zu tun.

Nein, es sind immer nur einfache “eindimensionale” variangen :wink:

Eine Möglichkeit wäre, die Eigenschaft disabled bei Varianten mit Menge 0 auf true zu setzen, z.b. durch Modifikation der Funktion _fillVariantSelections in Application\Model\VariantHandler.php.

Original:
$aSelections[$oVariant->getId()][$i] = ['name' => $sName, 'disabled' => null, 'active' => false, 'hash' => $sHash];

Modifiziert:
$aSelections[$oVariant->getId()][$i] = ['name' => $sName, 'disabled' => $oVariant->oxarticles__oxstock->getRawValue() == 0 ? true : false, 'active' => false, 'hash' => $sHash ];

Dann kann man im Template selectbox.tpl dem LI-Element im Falle von disabled=true CSS-Klassen zuweisen, die das Item als nicht verfügbar kennzeichnen und nicht anwählen lassen.

<li class="[{if $oSelection->isDisabled()}]selectbox-disabled disabled js-disabled[{/if}]">
	<a href="[{$oSelection->getLink()}]" data-selection-id="[{$oSelection->getValue()}]" class="[{if $oSelection->isActive()}]active[{/if}]">&nbsp;[{$oSelection->getName()}]&nbsp;</a>
</li>

Das Ergebnis sieht dann z.B. so aus wie im Bild. Die durchgestrichene Variante ist ausverkauft und kann auch nicht angewählt werden.

Das Ganze ist natürlich quick&dirty und kaum getestet, scheint aber auf den ersten Blick zu funktionieren (zweidimensionale Varianten). Es könnte sein, daß sich die Benutzung des Felds disabled mit anderen Funktionalitäten überschneidet (Filter?). In dem Fall müsste man ein eigenes Feld für den Zweck einbauen.

Nachtrag:
In getVariantsQuery() (class Article) muss man die Querybedingung anpassen, so daß die Varianten mit Nullmenge überhaupt erst geladen werden, d.h. die Bedingung
$sTable.oxstock > 0
muss auf
$sTable.oxstock >= 0
geändert werden (ca. Zeile 640 in Article.php).

Mit dem Modul https://github.com/leofonic/oxid_extended_selectionlists kann man getStockStatus() in der Selection verwenden.

Ich danke euch beiden. Ich schaue mir das montag mal in ruhe an :slight_smile:

Wollte nur mal bescheid geben das beide lösungen funktionieren. Vielen dank dafür :slight_smile:

1 Like