WBCE CMS Forum

WBCE CMS – Way Better Content Editing.

Du bist nicht angemeldet.

#1 29.08.2018 11:36:23

florian
Administrator

Fehler in Bakery: Verkäufe ohne Lagerbestand immer möglich

Es scheint, dass seit dem Sicherheitsupdate (Bakery Version 1.84) PHP 7.x Verkäufe ohne ausreichenden Lagerbestand auch dann möglich sind, wenn dies gar nicht erwünscht ist. Früher war das Verhalten so, dass beim Platzieren eines Produkts im Warenkorb mit Lagerbestand = 0 eine Fehlermeldung angezeigt worden ist und das Produkt nicht in den Warenkorb gelegt werden konnte. Das funktioniert jetzt nicht mehr, das Verhalten ist immer so, als sei die Option "Verkäufe ohne ausreichenden Lagerbestand zulassen" immer aktiviert.

Es wäre schön, wenn sich das mal wer anschauen könnte.

Beitrag geändert von florian (30.08.2018 07:45:27)


Code allein macht nicht glücklich. Jetzt spenden!

Online

#2 29.08.2018 18:49:23

florian
Administrator

Re: Fehler in Bakery: Verkäufe ohne Lagerbestand immer möglich

Gefunden. view.php

if (is_numeric($stock) && !empty($stock)) {

ändern zu

if (is_numeric($stock)) {

Es gibt aber noch weitere Unstimmigkeiten.

Beitrag geändert von florian (01.07.2019 18:30:29)


Code allein macht nicht glücklich. Jetzt spenden!

Online

#3 11.02.2019 20:07:08

trici
Mitglied

Re: Fehler in Bakery: Verkäufe ohne Lagerbestand immer möglich

Ich habe nun zusätzlich das Problem, wenn der Lagerbestand leergelassen wird zeigt es immer "not available" an, also als wäre er Null. Kann man das auch noch beheben?
Vielen Dank schon mal fürs anschauen.

Offline

#4 11.02.2019 20:28:38

florian
Administrator

Re: Fehler in Bakery: Verkäufe ohne Lagerbestand immer möglich

Versuch mal, o.g. Zeile in der view.php ändern zu

if (is_numeric($stock) || empty($stock)) {

dann ist die Bedingung erfüllt, wenn der Lagerbestand "eine Zahl oder leer" ist, anstatt von nur "eine Zahl" oder, wie es vorher war, "eine Zahl und nicht leer".


Code allein macht nicht glücklich. Jetzt spenden!

Online

#5 16.02.2019 19:33:13

trici
Mitglied

Re: Fehler in Bakery: Verkäufe ohne Lagerbestand immer möglich

Vielen Dank fürs Nachschauen.
Der erste Vorschlag:

if (is_numeric($stock)) {

ist okay, der 2. Vorschlag produziert einen Fehler, wenn man etwas aus dem Warenkorb löscht.

Ich glaube meine Problem liegt eher bei der Textanzeige des Lagerbestands. Wenn der Lagerbestand leer ist, sollte kein Text erscheinen und wenn der Lagerbestand auf Null gesetzt ist, sollte stehen "nicht lieferbar". Nun wird jedoch überall auf den Platzhalter $MOD_BAKERY['TXT_N/A'] zugegriffen und es steht überall k.A., ausser ich gebe eine Zahl ein beim Lagerbestand, die nicht Null ist, dann steht wie gewünscht nichts.

Offline

#6 16.02.2019 21:19:35

florian
Administrator

Re: Fehler in Bakery: Verkäufe ohne Lagerbestand immer möglich

ist okay, der 2. Vorschlag produziert einen Fehler, wenn man etwas aus dem Warenkorb löscht.

Kann ich nicht reproduzieren. Was für ein Fehler erscheint denn?
Oder meinst Du den Hinweis "Der Warenkorb ist leer"?

Die gewünschte Ausgabe des Textes ist ja noch was anderes. Dafür muss in der view_item.php und view_overview.php der Code

// Only show if item stock is not blank
	if ((empty($item_stock) && $item_stock!=0) && $setting_stock_mode != 'none') {
		$stock = $MOD_BAKERY['TXT_N/A'];
	} else {
		// Display number of items
		if ($setting_stock_mode == 'number') {
			if ($item_stock < 1) {
				$stock = 0;
			} else {
				$stock = $item_stock;
			}
		// Display stock image
		} elseif ($setting_stock_mode == 'img' && is_numeric($setting_stock_limit) && !empty($setting_stock_limit)) {
			if ($item_stock < 1) {
				$stock = '<img src="'.WB_URL.'/modules/bakery/images/out_of_stock.gif" alt="'.$MOD_BAKERY['TXT_OUT_OF_STOCK'].'" class="mod_bakery_item_stock_img_f" />';
			} elseif ($item_stock > $setting_stock_limit) {
				$stock = '<img src="'.WB_URL.'/modules/bakery/images/in_stock.gif" alt="'.$MOD_BAKERY['TXT_IN_STOCK'].'" class="mod_bakery_item_stock_img_f" />';
			} else {
				$stock = '<img src="'.WB_URL.'/modules/bakery/images/short_of_stock.gif" alt="'.$MOD_BAKERY['TXT_SHORT_OF_STOCK'].'" class="mod_bakery_item_stock_img_f" />';
		}
		// Display stock text message			
		} elseif ($setting_stock_mode == 'text' && is_numeric($setting_stock_limit) && !empty($setting_stock_limit)) {
			if ($item_stock < 1) {
				$stock = '<span class="mod_bakery_item_out_of_stock_f">'.$MOD_BAKERY['TXT_OUT_OF_STOCK'].'</span>';
			} elseif ($item_stock > $setting_stock_limit) {
				$stock = '<span class="mod_bakery_item_in_stock_f">'.$MOD_BAKERY['TXT_IN_STOCK'].'</span>';
			} else {
				$stock = '<span class="mod_bakery_item_short_of_stock_f">'.$MOD_BAKERY['TXT_SHORT_OF_STOCK'].'</span>';
			}
		// Display nothing
		} else {
			$stock = '';
		}
	}

geändert werden zu (quick & dirty, ist jetzt nur für Textausgabe und nicht Zahl oder Bild angepasst)

if ($setting_stock_mode != 'none') {
			// Display number of items
			if ($setting_stock_mode == 'number') {
				if ($item_stock < 1) {
					$stock = 0;
				} else {
					$stock = $item_stock;
				}
			// Display stock image
			} elseif ($setting_stock_mode == 'img' && is_numeric($setting_stock_limit) && !empty($setting_stock_limit)) {
				if ($item_stock < 1) {
					$stock = '<img src="'.WB_URL.'/modules/bakery/images/out_of_stock.gif" alt="'.$MOD_BAKERY['TXT_OUT_OF_STOCK'].'" class="mod_bakery_main_stock_img_f" />';
				} elseif ($item_stock > $setting_stock_limit) {
					$stock = '<img src="'.WB_URL.'/modules/bakery/images/in_stock.gif" alt="'.$MOD_BAKERY['TXT_IN_STOCK'].'" class="mod_bakery_main_stock_img_f" />';
				} else {
					$stock = '<img src="'.WB_URL.'/modules/bakery/images/short_of_stock.gif" alt="'.$MOD_BAKERY['TXT_SHORT_OF_STOCK'].'" class="mod_bakery_main_stock_img_f" />';
			}
			// Display stock text message			
			} elseif ($setting_stock_mode == 'text') {
				if ($item_stock!='') {
					if ($item_stock < 1) {
						$stock = '<span class="mod_bakery_main_out_of_stock_f">'.$MOD_BAKERY['TXT_OUT_OF_STOCK'].'</span>';
					} elseif ($item_stock > $setting_stock_limit) {
						$stock = '<span class="mod_bakery_main_in_stock_f">'.$MOD_BAKERY['TXT_IN_STOCK'].'</span>';
					} else {
						$stock = '<span class="mod_bakery_main_short_of_stock_f">'.$MOD_BAKERY['TXT_SHORT_OF_STOCK'].'</span>';
					}
				} else {
					$stock='';
				}
			} else {
				$stock = '';
			}
		}

Code allein macht nicht glücklich. Jetzt spenden!

Online

#7 16.02.2019 22:04:00

trici
Mitglied

Re: Fehler in Bakery: Verkäufe ohne Lagerbestand immer möglich

Vielen Dank quick & dirty ist perfekt für mich!

Sorry, das war kein Fehler sondern eine Warnmeldung:
Warning: A non-numeric value encountered in .../modules/bakery/view.php on line 371
Aber wie ich nun merkte, wird der Lagerbestand immer auf Null gesetzt statt leer gelassen, wenn ich den Code auf
if (is_numeric($stock) || empty($stock)) { 
ändere.
Die Warnmeldung kam glaube ich erst, als ich nachträglich den Code änderte und ich schon etwas im Warenkorb hatte.

Offline

#8 01.07.2019 17:21:59

ice
Mitglied

Re: Fehler in Bakery: Verkäufe ohne Lagerbestand immer möglich

Irgendwie verstehe ich nicht, was ich jetzt ändern muss, damit bei Warenbestand = 0 der Artikel zwar noch angezeigt wird, aber keine Bestellung mehr möglich ist (rote Ampel) ...

Ich kann gegenwärtig immer noch Artikel kaufen, wenn Artikelanzahl auf 0 ist.

Ich fand das verhalten vorher auch nicht schlecht. Wenn Anzahl = leer und nicht 0, so wird im Shop "k.A." angezeigt und Bestellungen sind möglich (richtig so!).

Beitrag geändert von ice (01.07.2019 17:23:08)

Offline

#9 01.07.2019 18:29:44

florian
Administrator

Re: Fehler in Bakery: Verkäufe ohne Lagerbestand immer möglich

Bei "Allgemeine Einstellungen" auf einer Bakery-Seite kann eigentlich festgelegt werden, ob Artikel ohne Lagerbestand in den Warenkorb gelegt werden können sollen oder nicht. Das funktioniert aber nicht mehr, das Verhalten ist immer, als wenn das Häkchen gesetzt wäre, auch wenn dieses Verhalten genau _nicht_ gewünscht ist.

Keine Ahnung wieso, was ich oben gepostet habe, funktioniert auch nicht mehr.

Leider habe ich jetzt auch keine Idee, wie man das wieder zum Laufen kriegt.


Code allein macht nicht glücklich. Jetzt spenden!

Online

Liked by:

ice

#10 01.07.2019 18:38:24

ice
Mitglied

Re: Fehler in Bakery: Verkäufe ohne Lagerbestand immer möglich

Okay ... Danke für Rückinfo

Offline

#11 02.07.2019 08:48:28

florian
Administrator

Re: Fehler in Bakery: Verkäufe ohne Lagerbestand immer möglich

Doch noch gefunden:

in der view.php das hier

if (is_numeric($stock) && !empty($stock))

4x durch das hier

if (is_numeric($stock) && $stock!='') 

ersetzen.


Code allein macht nicht glücklich. Jetzt spenden!

Online

#12 02.07.2019 17:33:58

ice
Mitglied

Re: Fehler in Bakery: Verkäufe ohne Lagerbestand immer möglich

Ja, wow, das funktioniert bestens! Vielen Dank!

Offline

#13 02.07.2019 22:17:07

ice
Mitglied

Re: Fehler in Bakery: Verkäufe ohne Lagerbestand immer möglich

Der Fehler mit "empty($stock)" tritt noch häufiger im Quelltext auf.

Ich habe mich nämlich gewundert, dass wenn man die Lageranzahl auf 0 setzt, dass dann nicht die rote Ampel (wenn man sie haben möchte) im Lagerbestand steht, sondern "k.A.". Das "k.A." soll nämlich nur da stehen, wenn man den Lagerbestand leer lässt und keine Zahl dort eingetragen ist.

Für die richtige Anzeige des Lagerbestandes (z.B. mit der roten Ampel) in der Übersicht und auf der Detailseite muss man

In der view_item.php und view_overview.php die Zeile

if (empty($item_stock) && $setting_stock_mode != 'none') {

mit

if ($item_stock === '' && $setting_stock_mode != 'none') {

ersetzen.

Danach klappt die Anzeige dann endlich wieder!

Beitrag geändert von ice (02.07.2019 22:18:15)

Offline

Liked by:

florian

#14 14.07.2019 19:23:56

ice
Mitglied

Re: Fehler in Bakery: Verkäufe ohne Lagerbestand immer möglich

Ich habe noch eine kleine Unschönheit gefunden:

Wenn man versucht einen Artikel mit Bestand = 0 in den Warenkorb zu legen, so geht das zwar nicht, es fehlt aber ein Hinweistext. Dieser Text fehlt dann, wenn der Warenkorb vorher komplett leer war. Der Fehlerhinweistext wird angezeigt, wenn bereits andere Artikel im Warenkorb sind, dann erscheint der Fehler mit Hinweis auf den zu geringem Bestand in der Übersicht des Warenkorbs.

Der Fehler liegt in der "view_cart.php" in dem "EMPTY CART" Abschnitt, ziemlich am Anfang der Datei, ab Zeile 38:

[== PHP ==]
// If cart is empty, show an error message and a "continue shopping" button
$sql_result1 = $database->query("SELECT * FROM ".TABLE_PREFIX."mod_bakery_order WHERE order_id = '$order_id'");
$n_row = $sql_result1->numRows();
if ($n_row < 1) {
	// Show empty cart error message using template file
	$tpl->set_file('empty_cart', 'empty.htm');
	$tpl->set_var(array(
		'ERR_CART_EMPTY'			=>	$MOD_BAKERY['ERR_CART_EMPTY'],
		'TXT_CONTINUE_SHOPPING'		=>	$MOD_BAKERY['TXT_CONTINUE_SHOPPING']
	));
	$tpl->pparse('output', 'empty_cart');
	return;
}

Durch das "return;" am Ende wird alle weitere Vearbeitung der view_cart.php abgebrochen, inkl. Anzeige der Fehler, die darunter erst verarbeitet werden. Ich wollte das return; jetzt nicht löschen, es hat ja eventuell seinen Sinn.

Wenn man sich jetzt den Fehlerpart von unten nach oben holt (kopieren) und ihn so einbaut:

[== PHP ==]
// If cart is empty, show an error message and a "continue shopping" button
$sql_result1 = $database->query("SELECT * FROM ".TABLE_PREFIX."mod_bakery_order WHERE order_id = '$order_id'");
$n_row = $sql_result1->numRows();
if ($n_row < 1) {
	
	// Compose the cart error messages
	if (isset($cart_error) && is_array($cart_error)) {
	$message = '';
	foreach ($cart_error as $value) {
		$message .= "<p>".$value."</p>";
	}
	// Show cart error messages using template file
	$tpl->set_file('cart_error', 'error.htm');
	$tpl->set_var(array(
		'MESSAGE'					=>	$message,
		'TXT_CONTINUE_SHOPPING'		=>	$MOD_BAKERY['TXT_CONTINUE_SHOPPING']
	));
	$tpl->pparse('output', 'cart_error');
	}
	
	// Show empty cart error message using template file
	$tpl->set_file('empty_cart', 'empty.htm');
	$tpl->set_var(array(
		'ERR_CART_EMPTY'			=>	$MOD_BAKERY['ERR_CART_EMPTY'],
		'TXT_CONTINUE_SHOPPING'		=>	$MOD_BAKERY['TXT_CONTINUE_SHOPPING']
	));
	$tpl->pparse('output', 'empty_cart');
	return;
}

wird der Fehler angezeigt.

Damit werden zwar beide Meldungen gleichzeitig angezeigt (Fehlermeldung über zu wenig Bestand und Warenkorb ist leer, mit jeweils eigenem "Weiter einkaufen" Button), aber immerhin bekommt der Nutzer eine Fehlermeldung über den geringen Bestand angezeigt.

Der Code von Bakery ist echt nicht so gut, allein die mehrfache Verwendung von gleichem Code (z.B. die Anzeige des Lagerbestandes) ausgeschrieben in jeder Datei (z.b. view_overview.php und view_item.php), statt eine globale Funktion zu benutzen ist ziemlich wartungsunfreundlich. Dort habe ich nämlich auch noch das title-Attribut ergänzt, damit bei einem Mouseover über die Ampel auch der Text angezeigt wird.

Einfach den "//Display stock image " Code mit folgendem Code in beiden Dateien ersetzen:

[== PHP ==]
			// Display stock image
			} elseif ($setting_stock_mode == 'img' && is_numeric($setting_stock_limit) && !empty($setting_stock_limit)) {
				if ($item_stock < 1) {
					$stock = '<img src="'.WB_URL.'/modules/bakery/images/out_of_stock.gif" alt="'.$MOD_BAKERY['TXT_OUT_OF_STOCK'].'" title="'.$MOD_BAKERY['TXT_OUT_OF_STOCK'].'" class="mod_bakery_main_stock_img_f" />';
				} elseif ($item_stock > $setting_stock_limit) {
					$stock = '<img src="'.WB_URL.'/modules/bakery/images/in_stock.gif" alt="'.$MOD_BAKERY['TXT_IN_STOCK'].'" title="'.$MOD_BAKERY['TXT_IN_STOCK'].'" class="mod_bakery_main_stock_img_f" />';
				} else {
					$stock = '<img src="'.WB_URL.'/modules/bakery/images/short_of_stock.gif" alt="'.$MOD_BAKERY['TXT_SHORT_OF_STOCK'].'" title="'.$MOD_BAKERY['TXT_SHORT_OF_STOCK'].'" class="mod_bakery_main_stock_img_f" />';
			}

Ansonsten läuft der Shop jetzt zufriedenstellend bei uns. Nur die Ampel hatten manche nicht verstanden, weil der Fehlertext und der Mouseover bei der Ampel des Lagerbestands fehlte ...

Beitrag geändert von ice (14.07.2019 19:25:07)

Offline

Liked by:

florian

#15 14.07.2019 19:28:19

florian
Administrator

Re: Fehler in Bakery: Verkäufe ohne Lagerbestand immer möglich

Danke. Du hast vollkommen recht, der Code ist wirklich nicht sehr wartungsfreundlich.
Ich mach mal demnächst eine 1.85 aus unseren ganzen Korrekturen.


Code allein macht nicht glücklich. Jetzt spenden!

Online

Liked by:

ice

Fußzeile des Forums

up