Preis per AJAX bzw on the fly ändern

Hallo,
ich brauche für ein Projekt die Möglichkeit durch ein eigenes Script, individuelle Preise zu übergeben, sprich so eine Art Konfigurator. Ist sowas in OXID möglich, wenn ja wie?

Das Script ist schon programmiert, der berechnete Preis wird momentan in einer SESSION gespeichert und müsste quasi an den bestellen Button bzw Warenkorb übergeben werden. Des weiteren muss noch ein String übergeben werden, der generiert wird.

Ich würde mich über eure Hilfe / Denkanstöße freuen :slight_smile:

Danke schonmal.

Viele Grüße,
Robert

So,
also ich habs jetzt so gemacht, dass beim Aufruf des Konfigurator ein neuer Artikel erstellt wird (mit dem sql query…) funktioniert soweit auch wunderbar, allerdings wenn ich dann auf die festgelegte seo url die ich in die oxseo tabelle eingetragen habe, weiterleiten will, bekomm ich nen 404er. Erst wenn ich im Backend die Artikelliste aufrufe, funktionierts. Habt Ihr ne Idee, an was das liegt? Muss ich die SEO Url noch irgendwie aktivieren?!

Hier meine Querys:

$query1 = "INSERT INTO oxarticles (OXID, OXSHOPID,OXACTIVE,OXTITLE,OXPRICE,OXSTOCK, OXSTOCKFLAG, OXINSERT, OXISSEARCH, OXVARMINPRICE, OXSUBCLASS, OXDELTIMEUNIT) VALUES ('" . $jid . "','oxbaseshop','1','Produkt','2.00','100','1','" . date('Y-m-d') . "','1','2.00','oxarticle','DAY')";
			$result1 = mysql_query($query1);
			
			if(!$result1) {
				echo 'Abfrage 1:' . mysql_error() . '<br />';
			}
			
			$lastId = mysql_insert_id();
			
			$query = "INSERT INTO oxseo (OXOBJECTID,OXIDENT, OXSHOPID,OXLANG,OXSTDURL,OXSEOURL,OXTYPE) VALUES ('" . $jid . "','" . $jid2 . "','oxbaseshop','0','index.php?cl=details&anid=" . $jid . "&cnid=77aa8bfd1a1102805c90e9afdfebc8cd','individuelle-Produkte/Produkt-" . $lastId . ".html','oxarticle')";
			$result = mysql_query($query);
			
			if(!$result) {
				echo 'Abfrage 2:' . mysql_error() . '<br />';
			}
			
			$query3 = "INSERT INTO oxobject2category (OXID,OXOBJECTID, OXCATNID, OXPOS, OXTIME) VALUES ('" . $jid3 . "','" . $jid . "','77aa8bfd1a1102805c90e9afdfebc8cd','0','" . time() . "')";
			$result3 = mysql_query($query3);
			if(!$result3) {
				echo 'Abfrage 3:' . mysql_error() . '<br />';
			}

Vor dem Abschicken mach ich nochmal ein Update des OXTITLES (Produkt 2), sprich die insert id.

Würde mich sehr über eure Hilfe freuen!! :slight_smile:

Gruß,
Robert

Also, ich hab jetzt herausgefunden, dass anscheinend in die oxobject2seodata auch was geschrieben wird. Hab jetzt nen query dafür gemacht und funktionierten tuts trotzdem nicht. Hab jetzt mal die db “vorher” und “nachher” in beyond compare verglichen und bis auf die reihenfolge/sortierung der Einträge in oxseo keine Unterschiede festgestellt…

Kann mir wirklich keiner helfen?

Gruss,
Robert

Hallo,
warum benutzt du nicht das Object Model von Oxid für den Vorgang?
Bsp.:


$art = oxNew('oxarticle');
$aAttr =array(dbfeld => wert, ... ); //befülle mit werten
$art->assign($aAttr);
$art->save(); 

So bleibst du auch updatesicher und Oxid erstellt für dich alle Queries etc.

Desweiteren gibt es einen Konfigurator für Oxid:
http://www.oxid-esales.com/en/exchange/extensions/t-shirt-designer-flash-konfigurator-shirtnetwork-connector-produkt-konfigurator

Lass dich vom TShirt nicht abschrecken, der soll wohl auch alles mögliche konfigurieren können. Vielleicht hilft der ja weiter.

Grüße

Rafael

Hm danke. Der Konfigurator ist ja komplett fertig. die einzelnen schritte werden in einer Session gespeichert. da oxid irgendwie meine session werte nicht speichert, habe ich das ganze per iframe eingebunden…ich weiß, ist nicht die eleganteste lösung, aber mir fehlt mom schlichtweg die zeit mich ins oxid framework einzuarbeiten.

Habe die Lösung mittlerweile auch gefunden. ich dachte der hash von “oxid” in der tabelle “oxseo” ist n zufallswert dabei wird es ein md5 hash aus der url. jetzt funktionierts soweit…

oder hättest du ein modul beispiel für mich wie ich einen neuen artikel in die db einfügen kann (mehr als den schnipsel :wink: ).

Danke und Gruß,
Robert

Hallo Robert,
erstmal schön, dass du eine Lösung gefunden hast!

Oxid hat ein eigenes Session management, vielleicht liegt der Fehler daran, passiert halt wenn man um das Framework herumbaut :wink:

Hmm ich verstehe nicht warum das Schnipsel nicht ausreichend ist? Glaubst du nicht, dass Oxid so einfach ist? Ein Modul ist da nicht nötig:


		$art = oxNew('oxarticle');
		$aAttr = array("oxactive"=> 1 ,"oxtitle" => "meins", "oxprice" => 5.99); 
		$art->assign($aAttr);
		$art->save();

Dieser Schnipsel erstellt dir alles was du brauchst. Ein neues Produkt in der Datenbank, welches auch ganz normal in der Artikelliste im Backend auftaucht. Es hat den Titel “meins”, ist direkt aktiv und hat einen Preis von 5,99. Desweiteren auch noch die SEO url “/meins.html”. Alles wunderbar und nur 4 kleine Zeilen Code. Vielleicht lohnt sich daher, gerade wegen Zeitgründen, mal eine Einarbeitung in das Oxidframework. Ich wette du hättest mehr Zeit damit verbracht dich in das Datenbankschema einzuarbeiten als in das Oxidframework.

Übrigens: Bist du mit “/meins.html” nicht zu frieden kannst du das mit 2 weiteren Zeilen nach dem save Aufruf erweitern:


		$enc = oxSeoEncoderArticle::getInstance();
		$enc->addSeoEntry(	$art->oxarticles__oxid->value,
							$art->oxarticles__oxshopid->value,
							1, 
							$art->getBaseStdLink(1),
							"meine-kategorie/was-ich-will.html", 
							"oxarticle");

Und schwups ist das ganze auch noch unter “/meine-kategorie/was-ich-will.html” zu erreichen. Die 1 ist dabei die SprachID.

Und jetzt nochmal eine Erklärung bitte warum das Schnipsel nicht ausreichend war.

Grüße

Rafael

Hi Rafael,
danke für deine Antwort. Mein Problem ist eher wie ich da anfangen soll bzw. wo bau ich mein Skript dann ein? Per include in ne CMS-Seite? Aber dann muss ich doch die Klasse(n) auch noch includen oder? Oder wie würdest du das machen? Und wo finde ich infos zum OXID Sessionmanagement.

Noch paar Infos.

Der Mixer ist im Prinzip vom Template her nur eine Seite mit 5 Schritten. Jede "Komponente ist ein eigenes array im Session Array “Mixer”. Wenn man auf “Fertig” klickt, wird wie gesagt ein neuer Artikel mit den eigenen Werten angelegt und der User wird direkt auf diesen Artikel weitergeleitet und kann ihn in den Warenkorb legen.

Es funktioniert zwar jetzt alles, allerdings ist es halt wie schon gesagt per iframe nicht die intelligenteste / sauberste Lösung.

Danke schon mal :slight_smile:

Lg,
Robert

http://tomas.liubinas.com/oxid-framework-init/en/
Die Zeile für adodb kann man mittlerweile weglassen.

[QUOTE=leofonic;62702]http://tomas.liubinas.com/oxid-framework-init/en/
Die Zeile für adodb kann man mittlerweile weglassen.[/QUOTE]

Super, danke! Das is ja einfach :slight_smile:
Jetzt bräuchte ich nur noch ne Info bzgl. SESSION-Management dann bin ich rundum glücklich :slight_smile:

Also da ich nicht weiss was dein Skript tut und wie es aussieht kann ich dir auch nicht sagen wo du es einbaust. Aber so wie du das beschreibst sieht es aus wie etwas wild Zusammengebasteltes…

Wir können ja mal dennoch weiter den oxid weg beschreiten.
im ordner /view/ liegen alle Klassen die angezeigt werden können.

Du erstellst dann “/view/mixer.php”. Hier rein kommt dann deine mixer Klasse welche oxubase erweitert ein aufruf geschieht dann mit:
www.seite.de?cl=mixer
um zum Beispiel deine mixer Seite aufzurufen.

Damit die auch was anzeigt braucht sie ein Template dieses würde dann z.B. “/out/{template}/page/mixer/mixer.tpl” werden.
um die Zwei bekannt zu machen braucht deine mixer Klasse eine "public function render()"
welche den String “page/mixer/mixer.tpl” zurückgibt.

Das wars auch schon wieder mit dem oxid way. 2 Dateien, eine Klasse und eine Funktion. Alles was benötigt wird um etwas auszugeben.

In diese Klasse würdest du dann einfach den Schnipsel von oben verwursten und alles wird gut.

Mit dem Aufruf


oxSession::setVar($name, $wert); 

setzt du die Variable
mit


oxSession::getVar($name); 

Der Rest ist einfaches PHP.

Grüße

Rafael

Danke euch beiden. das hat mir schon sehr viel weitergeholfen. Jetzt brauch ich nur noch die Zeit dazu, das alles umzubauen… :wink:

Soweit sogut, die ersten Schritte sind geschafft:)

Nur 2 Fragen hab ich noch: Wie kann ich den Seitentitel für die Breadcrumbs und den Title-Tag definieren?
ich hab in diversen templates [{assign var=“tpl” value=$oViewConf->getActTplName()}] gefunden. und die entsprechende Funktion in der views/oxviewconfig.php gefunden, oder lieg ich da falsch?

EDIT: Wo pack ich den eine Controller Datei hin? in views ist ja nur die Klasse drin und in out/tpl nur das Template…

Danke :slight_smile:

Lg,
Robert

Da lies sich anscheinend recht schnell Zeit finden :wink:
also jede View die Breadcrumbs anzeigen soll braucht eine “public function getBreadcrumb()”

Diese gibt ein 2 dimensionalen Array wieder. Mindestform:
$aBread[$i][‘title’]

Beispiele gibt zu Hauf: in jeder Viewklasse.

Den Title-Tag gibts mit der “public function getTitle()” in deiner Viewklasse.

Das mit den Controllern ist so ne Sache … Oxid kennt seine Controller zur Steuerung der Anwendung. Alle anderen Controller finden meist in den Viewklassenplatz.

Ich finde sogar, dass wenn man sich stringend an die Definition vom MVC hält liegen in /view (einer pro View) und /core die Controller, in /core dann noch die Models und in /out die Views(uu. mehrere pro ViewController).

Grüße

Rafael

[QUOTE=Rafael Dabrowski;62736]Da lies sich anscheinend recht schnell Zeit finden :wink:
[/QUOTE]

So zwischendrin mal :wink: das was dafür liegen blieb muss ich halt jetzt abends machen… (bin freelancer :wink: )

[QUOTE=Rafael Dabrowski;62736]
also jede View die Breadcrumbs anzeigen soll braucht eine “public function getBreadcrumb()”

Diese gibt ein 2 dimensionalen Array wieder. Mindestform:
$aBread[$i][‘title’]

Beispiele gibt zu Hauf: in jeder Viewklasse.

Den Title-Tag gibts mit der “public function getTitle()” in deiner Viewklasse.
[/QUOTE]
Super danke, sollte mal genauer schauen :wink:

[QUOTE=Rafael Dabrowski;62736]
Das mit den Controllern ist so ne Sache … Oxid kennt seine Controller zur Steuerung der Anwendung. Alle anderen Controller finden meist in den Viewklassenplatz.

Ich finde sogar, dass wenn man sich stringend an die Definition vom MVC hält liegen in /view (einer pro View) und /core die Controller, in /core dann noch die Models und in /out die Views(uu. mehrere pro ViewController).
[/QUOTE]

Hm…iwie komm ich trotzdem nicht weiter…ich arbeite bei meinem mixer viel mit ajax und hol mir dann halt sachen über if abfragen und get parameter per ajax

daher brauch ich einfach nen controller in dem dann zB steht

if (isset($_GET["action"]) && $_GET["action"] == "add") {
		$mixer->addComponent($_GET["comp-id"],$_GET["type"]);
}

Weißt was ich mein?

Gruß,
Robert

Super :slight_smile: beteiligst du mich mit einem kleinen Obulus? Das grenzt hier ja schon an eine Oxidschulung.

Der Oxid weg für $_GET() ist “oxConfig::getParameter($name);” und kann in der Viewklasse benutzt werden.

Ich würde sagen mittlerweile müsstest du aber wissen wie du einen Ajax aufruf starten kannst. Ein Ansatz seteht zumindest in diesem Thread, bedarf nur noch ein bisschen Transferleistung. Will dir da nicht zu viel von deiner Arbeit weg nehmen.

Grüße

Rafael

hm naja momentan hab ich halt ne extra datei mixer_edit.php und des soll ich IN die klasse mit reinpacken? oder in die datei innerhalb der klasse?! also so richtig kapieren tu ich das noch nicht…wir können gerne über skype oder email weiterschreiben, deine hilfe soll nicht unbezahlt sein :wink: ich schreib dir ne pn

[QUOTE=rkleinert;62759]hm naja momentan hab ich halt ne extra datei mixer_edit.php und des soll ich IN die klasse mit reinpacken?[/QUOTE]
Das kannst du machen wie du willst. Wenn du im Shop was darstellen willst, brauchst du ja sowieso das Shop-MVC also view (controller) und template. Als Ajax-Antwort kannst du eine eigene Datei nehmen und bei Bedarf das Oxid-Framework wie beschrieben starten, oder du gehst über die index.php und benutzt das komplette Framework. Du bist auch nicht eingeschränkt auf die vorhandenen view-Klassen, mit dem Parameter “cl” kannst du auch eigene aufrufen.

[QUOTE=Rafael Dabrowski;62693]


		
		$aAttr = array("oxprice" => 5.99); 

Rafael[/QUOTE]

…da wäre noch interessant, ob man den [B]preis auch temporär für den Warenkorb[/B] inkl. Checkout nutzen kann? Also dass das “gemixte” Produkt [I](auf Grundlage eines echten Oxid-Grund-Artikels) [/I]aus dem Konfigurator nur für diese eine Konfiguration [I](die so in der Form gar nicht in der DB steht, sondern nür “on-the-fly” aus nicht-oxid-tabellen zusammengestellt wird) [/I] und nur für diesen einen Warenkorb diesen einen [I](ebenfalls extern per eigenem SQL-Script berechneten)[/I] Preis haben kann?
Das wäre insbesondere wegen der ganzen Attribute etc, die dem “echten Oxid-Grund-Artikel” zugewiesen sind viel besser. Ausserdem kann man bei sehr vielen möglichen Konfigurationen unmöglich jedesmal ein neues Produkt erstellen. Von der Datenpflege dieser “automatisch erstellten konfigurierten Artikel” mal ganz abgesehen :wink: