Franz Holzinger

Verse of the day

Bei Gott ist mein Heil, meine Ehre, der Fels meiner Stärke; meine Zuversicht ist auf Gott.
Psalm 62:7

© Bible Gateway's Verse of the Day


autor  
24-01-08 08:27:15 Automatisch Artikel hinzufügen...
Steffi Meissner
Hallo zusammen,

ich habe mir mittlerweile einen ganz ordentlich funktionierenden Shop erstellt, der soweit auch ganz gut funktioniert. Die Berechnungen stimmen soweit alle. Wunderbar!

Nun habe ich noch eine Frage. Ich würde gerne bei meinen ersten 3000 Produkten im Warenkorb automatisch einen weiteres Produkt mit Preis 0 € anzeigen. Es ist eine Zugabe für die ersten 3000 Bestellungen und im Warenkorb soll also folgendes stehen:

1. Produkt (normal) 10.00 €
2. Produkt-Zugabe 0.00 €

Ist soetwas möglich? Wie könnte ich das am geschicktesten angehen?

Liebe Grüße
Steffi
24-01-08 08:41:08 Zusatz Extension schreiben
Franz Holzinger
Hallo Steffi,
das wäre nur über eine Zusatz Extension möglich, die in den Warenkorb von tt_products eingreift und auch beim Abschluss einer Bestellung deren Anzahl mitzählt. Bzw. kann man über das Feld 'auf Lager' die Anzahl von 3000 auf 0 über tt_products reduzieren lassen.

Im Warenkorb muss über diese Extension zusatz_products immer ein Produkt ohne Preis dazugehängt werden, solange es noch wenigstens 1 davon auf Lager gibt.

Grüße
Franz
24-01-08 11:52:15 Zusatz Extension schreiben
Steffi Meissner
Hallo Franz,

vielen lieben Dank für deine schnelle Antwort. Das hört sich leider ziemlich kompliziert an... Gibt es hierzu vielleicht ein Beispiel? Ich habe etwas Erfahrung in php, wobei hier die Betonung wohl auf ETWAS liegt

Wahrscheinlich ist so eine spezielle erweiterung in der Zukunft auch nicht geplant, oder?

Liebe Grüße
Steffi
24-01-08 12:07:42 Hooks verwenden
Franz Holzinger
Hallo Steffi,

das ist relativ einfach. Es muss eine Extnesion geschrieben werden, die eine Hook-Funktion für tt_products enthält. Eine Anleitung zur Extension-Programmierung und Hooks solltest du vorher durcharbeiten. Die Programmierung in PHP ist einfach.

In tt_products 2.7.0 gibt es etwas Ähnliches: einen Geschenkservice. Wenn man das im Warenkorb neben einem Produkt ankreuzt, wird automatisch ein zusätzliches Produkt in den Warenkorb gelegt.
Das könnte man noch erweitern, dass auch ein anderes Produkt immer dazukommt.

Grüße

Franz
24-01-08 12:35:45 Hooks verwenden
Steffi Meissner
Ok, das hört sich do schon einmal so an, also ob es prinzipiell überhaupt eine Möglichkeit gibt, mein Vorhaben zu erledigen. Ich werde mich dann mit Hilfe von meinem Kochbuch mal dran setzen und schauen, wie ich mit Hilfe von Hooks soetwas am Besten hinbekomme

Ganz kurz vielleicht noch. Würdest du mir verraten, an welcher Stelle bzw. welcher Datei ich da angreifen muss?

Liebe Grüße
Steffi
24-01-08 12:37:20 Version 2.7.0...
Steffi Meissner
PS: Soweit ich gelesen habe, komme ich ja sobald nicht an diese ran, oder? Scheint ja noch im Entwicklungsstadium zu sein...
24-01-08 12:58:19 2.7.0 ist im Einsatz
Franz Holzinger
Die Version 2.7.0 ist bereits im Einsatz. Es sind keine Fehler bekannt. Unter http://ttproducts.de kann man es jetzt schon beziehen.

In der Datei tt_products/model/class.tx_ttproducts_basket.php gibt es in Zeile 154 den Hook changeBasket. Damit kannst du den Inhalt des rohen Warenkorbs abfragen und verändern.

Grüße

Franz
24-01-08 15:10:57 Hook erstellen
Steffi Meissner
Hallihallo,

nun nach dem ich mich einige Zeit mit diversen Tutorials beschäftigt habe, wollte ich dazu übergehen, mir einen entsprechenden Hook zu basteln bzw. die entsprechende Logik für den Hook.

Ich habe eine neue Extension erstellt, in der ich eine folgende Dateien habe:

1. class.tx_auto_addprod.php:
<?php
######################################
# Process Hook of tt_products#
# add aditional products #
######################################

class tx_auto_addprod {

// Code kommt hier rein

}

?>

2. ext_localconf.php:
<?php
if (!defined ('TYPO3_MODE')) die ('Access denied.');

# add the Hook
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['tt_products/model/class.tx_ttproducts_basket.php']['finishIt'][] = 'EXT:auto_addprod/class.tx_auto_addprod.php:tx_auto_addprod';
?>

Nun bin ich mir momentan noch sehr unsicher, aber würde das reichen um in der Klasse tx_auto_addprod nun die entsprechende Funktion zu schreiben?

Liebe Grüße
Steffi
24-01-08 15:40:55 Hook changeBasket
Franz Holzinger
Hallo Steffi,
da ist noch ein Fehler drin.

// add the Hook
$TYPO3_CONF_VARS['EXTCONF']['tt_products']['changeBasket'][] = 'EXT:auto_addprod/class.tx_auto_addprod.php:tx_auto_addprod';

Und in der Klasse tx_auto_addprod muss es die Funktion changeBasket mit der richtigen Parameteranzahl und Reihenfolge geben. Das entnimmt man dem Code, von wo der Hook aus aufgerufen wird.

Zur Probe kannst du dort eine Debug-Anweisung einfügen und cc_debug installieren.

Grüße

Franz
25-01-08 12:43:20 Ein bisschen Hilfe?
Steffi Meissner
Hallo,

ich habe es mittlerweile relativ gut hinbekommen, eine Extension zu schreiben, die mir praktisch den Container für die function liefert. Dort habe ich auch bisher allerlei Debug-Tests ausführen können und Texte ausgeben oder dergleichen. Nun würde ich gerne dran gehen und versuchen den Warenkorb mit dem zusätzliche Produkt zu füllen. Ich bekomm das allerdings nicht wirklich hin... Da dies meine erste Ext wäre, habe ich noch ein bisschen Umgewöhnungsprobleme mit der Syntax. Könntest du mir vielleicht einen Tipp geben, wie ich nun am besten vorgehen muss?

Liebe Grüße
Steffi

PS: Ich hoffe ich erwarte da nicht zuviel. Will keinen großen Arbeitsaufwand bei Dir erzeugen, lieber Franz
25-01-08 13:15:06 Produkt in Warenkorb legen
Franz Holzinger
Hallo Steffi,

Es gibt mehrer Möglichkeiten. Am einfachsten wäre es, den rohen Warenkorb zu erhöhen. Artikel 13 wird nun zusätzlich in den Warenkorb gelegt. Beim Update Modus spielt das keine Rolle. Es wird max. 1 mal drinnen sein.

function changeBasket(&$pObj, &$basketExtRaw, $extVars, $paramProduct, $uid, $sameGiftData, $identGiftnumber) {

$basketExtRaw[13]['quantity'] = 1;
}

Es müsste über eine zusätzliche SQL Abfrage noch die Anzahl dieser Produkte auf Lager abgefragt werden.
Oder es könnte das $pObj->basketExt Array verwendet werden.

Gruß,
Franz
25-01-08 14:31:48 supi...
Steffi Meissner
Hallo Franz,

das läuft ja so schon ganz wunderbar! Ich habe mehrere SYS-Ordner mit Produkten. Dann wäre es von der Logik her gut, wenn ich das Produkt aus einem speziellen Ordner holen könnte, oder was meinst Du? Ansonsten müsste ich ja für jeden Produkt-Ordner einen Produkt anlegen. Dann komm ich doch auch ins Straucheln mit der Lagermenge?

Kann ich auch einen bestimmten Ordner definieren, aus dem das Produkt 13 "geholt" werden soll?

Ich werde heute abend mal noch die SQL-Abfrage einbauen...
Ich danke dir schon jetzt vielmals für deine Hilfe und prinzipiell für die Arbeit an tt_products. Werde mich wohl auch auf zur Donation-Seite machen... Geniale Arbeit!

Liebe Grüße
Steffi
25-01-08 14:57:42 Sysfolder
Franz Holzinger
Hallo Steffi

Es ist doch egal, in welchen Sysfolder das Gratisprodukt liegt. Im Warenkorb sollte der Ausgangspunkt, oder einfach das pid_list Setup, und die Rekursivität so gewählt sein, dass man auch alle Produkte im Shop kaufen kann bzw im Warenkorb auch noch sieht. Es reicht also, das Gratisprdoukt in einem einzigen Sysfolder zu haben. Es wäre durchaus sinnvoll, diesem Spezial-Produkt einen eigenen Sysfolder zu gönnen.

Grüße

Franz
25-01-08 16:24:49 Sysfolder
Steffi Meissner
Hallo Franz,

ok, ich habe das mit den Ordnern nun auch verstanden bzw. hatte da für die Konfiguration einfach einen Denkfehler drin. Wenn ich auf der Warenkorbseite den Sys-Folder für Spezial-Produkt angebe, klappt alles wunderbar. Ich habe nun noch eine generelle Frage. Du hattest vorhin geschrieben, dass die quantity von produkt 13 nicht vom update des Warenkorbs betroffen ist. Gibt es eine Möglichkeit, dasss ganze auch so anzulegen, dass Produkt 13 auf ein Update reagiert und mir ein weiteres Produkt 13 dazupackt oder ist das mit dem bestehenden Hook nicht möglich?

Liebe Grüße
Steffi
25-01-08 16:44:51 bisheriger Warenkorb
Franz Holzinger
Hallo Steffi,

Es müsste in der Hook Funktion der bisherige Warenkorb abgefragt werden.

$pObj->basketExt
Es muss überprüft werden, ob die uid des Spezial Produkts dort schon enthalten ist und die Anzahl. Diese muss dann um 1 erhöht werden und in
$basketExtRaw[13]['quantity'] = $gesamteAnzahl;
gespeichert werden.

Grüße

Franz
29-01-08 19:19:24 Noch ein bisschen Hilfe zum letzten Schritt???
Steffi Meissner
Hallo,

ich hatte heute abend ein wenig Zeit und habe mich nochmal an meine Hook-Funkton gesetzt. Ich bin momentan jetzt soweit, dass mein Produkt 13 im Warenkorb addiert wird, sobald ein anderes Produkt dort abgelegt wird. Vorher wird auch noch die entsprechende Verfügbarkeit geprüft, falls nicht mehr vorhanden, der Warenkorb ohne Zugabe gefüllt. Leider hänge ich nun beim Update-Vorgang. Da dies meine erste kleine "Extension" ist, tue ich mich da wohl noch etwas schwer. Wäre es möglich etwas Hilfe zu bekommen? Hier mal der wichtigste Teil meiner bisherigen Funktion:

----------------
$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('inStock','tt_products','uid = 13');


while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {

if ( $row["inStock"] > 0 ) {

$basketExtRaw[13]['quantity'] = 1;
} else {

//Funktion wird ohne Aktion beendet
break;
}


}
-----------
Freue mich über jede Hilfe...

Liebe Grüße
Steffi
29-01-08 19:46:28 Anzahl um 1 erhöhen
Franz Holzinger
$uid = 13;
$variant = $pObj->viewTable->variant->getVariantFromRow(
$basketExtRaw[$uid]);
$oldcount = $pObj->basketExt[$uid][$variant];
$pObj->basketExt[$uid][$variant] = $oldcount+1;

29-01-08 21:46:30 Danke...
Steffi Meissner
lieber Franz,

so in etwa stimmt das schon. Aber ich glaube ich habe hier ein Logik-Problem. Ich hätte gerne immer genau soviele Produkt13-Artikel im Warenkorb, wie normale Produkte im WK sind. Also kann ich nicht immer nur um 1 erhöhen, sondern muss ja immer auf die Anzahl der normalen Produkte kommen. Nun weiß ich aber leider nicht, was ich mache, wenn während eines Update-Vorganges plötzlich die Geschenke ausgehen...
Ich weiß nicht mehr weiter. Nennt man glaube ich Anfängerfrust, so etwas. Das ist wohl doch noch etwas zu hoch für meine nicht vorhandenen Künste...

Liebe Grüße
Steffi
29-01-08 22:22:46 Anzahl auf Lager
Franz Holzinger
Die Anzahl auf Lager hast du doch: $row["inStock"]
Du zählst einfach über eine for-Schleife alle Produkte im $pObj->basketExt, die eine andere uid haben.

Es gibt allerdings noch keinen Mechanismus, um zu verhindern, dass mehrere Personen gleichzeitig das letzte Produkt kaufen. Bzw. es müsste in einen anderen Hook kurz vor dem Abschluss der Bestellung eingefügt werden. Dort muss sicherheitshalber nochmals kontrolliert werden, ob es auch immer noch auf Lager ist.
Aber am einfachsten machst du mit dem Verschenken Schluss, wenn nur noch 10 Exemplare vorhanden sind.
29-01-08 22:53:35 hmm...
Steffi Meissner
Hallo Franz,

ok, das sehe ich ein. Ich höre auf, wenn nur noch 10 vorhanden sind. Das ist schon ok so.

Auch auf die Gefahr hin, dass Du nun die Hände über dem Kopf zusammenschlägst, aber ich verstehe immer noch nicht ganz wie ich es schaffe, genau die Anzahl an Geschenken im WK zu haben, wie normale Produkte drin sind... Vielleicht etwas daneben die Frage, aber kannst du mir nochmal mit etwas Beispiel-Code aushelfen?
Sei mir nicht böse, ja. Ich muss da wohl noch einiges lernen... Falls nicht, ist das natürlich auch nicht schlimm... Du hast mir ja schon mehr als genug geholfen.

Liebe Grüße
Steffi
30-01-08 09:17:04 zusammenzählen
Franz Holzinger
Hallo Steffi,

das Zusammenzählen ist einfach. Wie man auch über debug ($pObj->basketExt, '$pObj->basketExt', __LINE__, __FILE__); und die Extension cc_debug erkennen kann, werden in dem Array basketExt die Produkte im Warenkorb mit Varianten und Anzahl gespeichert.

$count = 0;
foreach($pObj->basketExt as $uid => $vArray) {
if ($uid != 'gift && $uid != 13') {
foreach ($vArray as $v) {
$count += $v;
}
}
}

$count enhält nun die Anzahl der Produkte im Warenkorb außer mit uid=13. Auch Produkt-Varianten werden mitgezählt.

Grüße

Franz
5-02-08 14:54:16 Zusammenfassung
Steffi Meissner
Hallo Franz,

ich habe mich nun nochmals mit meiner Extension zum automatischen hinzufügen des Produkt 13 auseinander gesetzt. Ich habe nun leider einige Probleme.

1. Wenn ich normale Produkte in den Warenkorb lege, passiert zunächst nichts. Verlasse ich die Warenkorbseite und komme wieder zurück, liegen genausoviele Produkte 13 im Warenkorb, wie normale Produkte.
2. Wenn ich die Stückzahl vom normalen Produkt im WK update passiert zunächst nichts. Verlasse ich den WK und komme wieder zurück, werden zu den bereits bestehenden Produkten 13 die aktuelle Anzahl der normalen Produkte addiert.

Nun ja, ich weiß warum das alles passiert. Leider aber nicht, wie ich es bewerkstelligen kann, dass immer genauso viele Produkte 13 im WK sind, wie normale Produkte. Und zwar ohne die Seite warenkorb verlassen zu müssen... Ich bekomm es wirklich nicht hin. Wäre es möglich, dass Du nochmal über den Code schauen könntest?

$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('inStock','tt_products','uid = 13');


while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {

if ( $row["inStock"] > 0 ) {

$count = 0;
foreach($pObj->basketExt as $uid => $vArray) {
if ($uid != 'gift && $uid != 2') {
foreach ($vArray as $v) {
$count += $v;
}
}
echo $count;
//Warenkorb wird mit Produkt (uid = 13) gefüllt
$basketExtRaw[2]['quantity'] = $count;
}

} else {

//Funktion wird ohne Aktion beendet
break;
}


}




}

}

Liebe Grüße
Steffi
5-02-08 14:58:39 tippfehler
Steffi Meissner
ps: die Tippfehler mit der 2 anstatt 13 habe ich gesehen.
das hilft aber auch nichts ...

liebe Grüße
Steffi
5-02-08 17:06:40 Reihenfolge Plugins
Franz Holzinger
Wenn die Produktanzahl am Ende stimmt, dann ist diese Einfüge-Funktion auch richtig.
Kann es sein, dass du auf einer Seite mehrere Shop Plugins hast? Die Reihenfolge muss so sein, dass ein Mini-Warenkorb erst nach dem Einfügen der neuen Produkte angezeigt wird.

Ansonsten müsste man über debug-Anweisungen untersuchen, warum die Zusatz-Produkte im Warenkorb sind, aber trotzdem nicht sofort angezeigt werden.
11-02-08 21:36:17 Ergänzung
Steffi Meissner
Hallo Franz,

soweit hat jetzt alles geklappt. Ich habe nun noch eine letzte Frage. Fällt dir vielleicht eine Möglichkeit ein, wie ich das Feld Anzahl der Produkt13 sperren kann? also die Anzahl soll nicht veränderbar sein...

Geht das?

Liebe Grüße
Steffi
11-02-08 21:51:21 Seiten TS Config
Franz Holzinger
Hallo Steffi,

alles geht mit TYPO3 .
Du kannst über ein eigene Seiten TS Config auf dem Sysfolder bzw. der Seite, wo du das Produkt 13 abspeicherst, das TCA von tt_products überschreiben. Das steht im TSConfig Manual beschrieben.

TCEFORM.[tablename].[field] - configures the field in TCEFORM for all types.
Hier das Beispiel für die Seiten:
TCEFORM.pages.title {
# You cannot edit the Page title field now:
disabled = 1
}

Das kannst du ebenso auf tt_products.inStock anwenden.

Grüße

Franz


11-02-08 22:15:47 Ende...
Steffi Meissner
So Franz, das ist genial!!!

Vielen, vielen lieben dank für deine Hilfe...Ich freu mich so...

Liebe Grüße
Steffi
12-02-08 20:50:48 Ich komm nicht drum herum...
Steffi Meissner
hier nochmal ein Einwand einzuwerfen. Ich habe das Problem angesprochen, dass ich mein Zusatzprodukt nur angezeigt bekomme, wenn ich den WK verlasse und wieder aufrufe. Ich habe nun herausgefunden, warum sich das Ganze so verhält. Der WK hat die PID 70 . Wenn ich die Option "Click into basket" auf true setze (was ich eigentlich auch möchte) tritt der Fehler auf. Die Url lautet dann:

domain.de/index.php?id=70&tx_ttproducts_pi1[backPID]=71&cHash=b7bc529b91

Durch nochmaliges aufrufen des WK wird aus der URL:
domain.de/index.php?id=70

und schon funktioniert es... Wie könnte ich diesem Phänomän begegnen?

Liebe Grüße
Steffi
13-02-08 11:09:40 Nachtrag
Steffi Meissner
Vielleicht kannst du mir ja auch einfach sagen, wo ich die generierung der URL finden kann... Ist die backPID nicht irgendwie zu umgehen? ich würde gerne direkt auf die domain.de/index.php?id=70 verlinken...

Liebe Grüße
Steffi
13-02-08 16:15:48 clickIntoBasket
Franz Holzinger
In tt_products 2.5.4 wird bei clickIntoBasket auf die Seite der backPID gewechselt, sobald man etwas in den Warenkorb legt.
view/class.tx_ttproducts_single_view.php:

$backPID = $this->pibase->piVars['backPID'];
$backPID = ($backPID ? $backPID : t3lib_div::_GP('backPID'));
if ($this->conf['clickIntoBasket'] && $backPID) {
$pid = $backPID;
} else {
$pid = $TSFE->id;
}

Erst mit tt_products 2.6.0 wird das besser werden.


$backPID = $this->pibase->piVars['backPID'];
$backPID = ($backPID ? $backPID : t3lib_div::_GP('backPID'));
$basketPID = $this->conf['PIDbasket'];

if ($this->conf['clickIntoBasket'] && $basketPID) {
$pid = $basketPID;
} else if ($this->conf['clickIntoList'] || !$backPID) {
$pid = $this->page->getPID($this->conf['PIDlistDisplay'], $this->conf['PIDlistDisplay.'], $row);
} else {
$pid = $backPID;
}
13-02-08 16:49:14 verständnis
Steffi Meissner
Nun, ich verstehe noch nicht ganz den Sinn dieser backPID. Könnte ich denn nun hier auch irgendwie festlegen, dass direkt auf die Seite mit dem Warenkorb verlinkt wird?

Liebe Grüße
Steffi
13-02-08 17:00:30 tt_products 2.6.0
Franz Holzinger
Wie schon erwähnt, ist das erst mit tt_products 2.6.0 möglich, nach dem Kauf eines Produkts direkt in den Warenkorb zu wechseln. Die backPID ist dafür da, dass der Shop weiß, wo man vorher gewesen ist. Damit wird normalerweise der URL-Marker ###FORM_URL### ersetzt, d.h. die Seite, wohin gewechselt wird, ist wieder jene, wo der Kunde zuletzt gewesen ist, bevor er auf die jetztige Seite gekommen ist.
< Zurück zum Forum