tomquenten Posted October 17, 2006 Report Share Posted October 17, 2006 Hallo, ich habe seit einiger Zeit XT am laufen und teste es nun schon seit einigen Monaten ganz erfolgreich, da wir es unter anderem an unsere Warenwirtschaft angebunden haben. Nun haben wir aber ein Problem mit der Länge der Artikelnummern. Diese ist in der Datenbank ja begrenzt auf (int(2147483647)), das haben wir schon geändert und stellt NICHT das Problem dar. Vielmehr macht uns bei diesen langen Artikelnummern das eigentlich System zu schaffen. Wir wissen möglicherweise auch schon woran es liegen könnte. Im Admin Bereich erhalten wir sowie wir einen Artikel mit einer langen Artikelnummer (z.B. 3510110054) bearbeiten wollen folgende Fehlermeldung. Warning: reset(): Passed variable is not an array or object in /srv/www/htdocs/web1/html/tlcc.shop/admin/includes/classes/object_info.php on line 22 Warning: Variable passed to each() is not an array or object in /srv/www/htdocs/web1/html/tlcc.shop/admin/includes/classes/object_info.php on line 23 Das liegt daran das die eigentlich Artikelnummer irgendwo mit (int) "gekürzt" wird. Nun haben wir uns schon auf die Suche gemacht, sind aber leider bisher nicht fündig geworden. Mit var_dump() wurde diese Vermutung auch bestätigt. Auch im Öffentlichen Bereich passiert dies. Klicke ich den Artikel mit der produktnummer 3510110054 an, gibt mir var_dump() die $products_id mit (int(2147483647)) aus. Die Suche im Forum ergab, das wir in der Tabelle "products_model" dies ändern können, diese Tabelle gibt es aber bei uns nicht. Wir benutzen xt:Commerce v3.0.4 SP1. Wäre sehr schön wenn uns jemand helfen kann, wo wir diesen Mißstand abändern können. Ich gehe mal davon aus, das seitens der Entwickler diese Beschränkung nicht gewollt ist. Beste Grüsse Link to comment Share on other sites More sharing options...
buero-design Posted October 17, 2006 Report Share Posted October 17, 2006 Hallo tomquenten, da liegst Du ganz richtig. Die products_id wird an vielen (!) Stellen von der (int) Konvertierung "gekürzt". Musst Du einfach mal nach suchen... Ben Link to comment Share on other sites More sharing options...
techway Posted October 17, 2006 Report Share Posted October 17, 2006 Hi, products_model ist ein Feld was für die ArtikelNummer vorgesehen ist und dieses findest du in der Tabelle PRODUCTS! Gruß Steffen Link to comment Share on other sites More sharing options...
tomquenten Posted October 18, 2006 Author Report Share Posted October 18, 2006 Hallo! Danke erst einmal an @buero-design! Genau das haben wir schon herausbekommen. Ich denke wir sind der Sache auch schon tiefer auf den Grund gekommen. Eventuell kannst auch da schon einen Vorschlag machen bzw. einen Tipp geben. In der products_info.php wird die classe products.php aufgerufen. In genau dieser classe haben wir schon einiges ausprobiert. Jedoch hört nun auch unser technisches Verständnis auf. In dem Object $this steckt die $products_id bereits gekürzt drin. Nun wollten wir das ganze einfach rückwärts verfolgen, ABER wir kommen nicht dahinter wo das Object $this überhaupt herkommt, geschweige denn wo es seine Informationen erhält. Es wäre sehr schön wenn uns hier irgendjemand noch einen weiteren Tipp geben kann. Beste Grüsse Link to comment Share on other sites More sharing options...
techway Posted October 18, 2006 Report Share Posted October 18, 2006 Hallo, mit $this greifst du in der product.php auf die eigene classe product! und die classe wird in der application_top.php etwa zeile 400 erstellt: require (DIR_WS_CLASSES.'product.php'); // new p URLS if (isset ($_GET['info'])) { $site = explode('_', $_GET['info']); $pID = $site[0]; $actual_products_id = (int) str_replace('p', '', $pID); $product = new product($actual_products_id); } // also check for old 3.0.3 URLS elseif (isset($_GET['products_id'])) { $actual_products_id = (int) $_GET['products_id']; $product = new product($actual_products_id); } if (!is_object($product)) { $product = new product(); } [/PHP] und da ist das (int) drin wie ich sehe aber warum verwendet ihr den nicht das product_model als Artikelnummer? so ist es doch im Admin-Bereich vorgesehen!!! Gruß Steffen Link to comment Share on other sites More sharing options...
tomquenten Posted October 18, 2006 Author Report Share Posted October 18, 2006 DANKE @techway!!!! Das scheint es auf den ersten Blick tatsächlich zu sein! Erster kleiner Test ist erfolgreich! elseif (isset($_GET['products_id'])) { $actual_products_id = (int) $_GET['products_id']; $product = new product($actual_products_id);[/PHP] hier haben wir erst einmal (int) $_GET['products_id']; durch (float) $_GET['products_id']; ersetzt, mit var_dump kommt jetzt tatsächlich die volle Artikelnummer! Dadurch ist die Integrität der übergebenen Daten gewährleistet bei gleichzeitiger LANGER Artikelnummer. Zu Deiner Frage. Wir haben bisher alles darauf abgestimmt immer auf die $products_id zuzugreifen, wie schon eingehend beschrieben haben wir uns einen Connector geschrieben, mit dem wir einfach per Mausklick die Daten in den Shop transferieren.....per ODBC Verbindung. Das jetzt alles wieder zu ändern währe ein heiden Aufwand. Ich denke mit (float) statt (int) kann man doch leben oder nicht? [b]Vielen, vielen Dank an Dich! Du bist SPITZE![/b] Beste Grüsse Link to comment Share on other sites More sharing options...
tomquenten Posted October 26, 2006 Author Report Share Posted October 26, 2006 Soooo, nachdem wir nun so ziemlich alles ausprobiert und getestet haben gibt es nun doch noch ein Problem. Da wir hier an dieser Stelle auch mal eine Liste posten wollen, wo die ganzen Veränderungen dokumentiert sind und diese auch vollständig sein sollte sind wir nun gehalten dieses eine Problem auch noch in den Griff zu bekommen. Konkret geht es um folgendes.... - Artikel mit "kleiner Artikelnummer" kann ohne Problem in den Warenkorb gelegt werdem - Artikel mit "großer Artikelnummer" (also größer 2147483647) kann in Verbindung mit einer Option auch in den Warenkorb gelegt werden - Artikel mit "großer Artikelnummer" (also größer 2147483647) kann OHNE Option NICHT in den Warenkorb gelegt werden Selbstverständlich haben wir hier auch schon experimentiert um die Ursache einzukreisen. Wir haben ein weiteren XT Shop aufgesetzt um zu testen ob es möglicherweise an unseren eigenen Modifikation liegt. Jedoch können wir genau dies ausschließen, auch in dem Original XT Shop (also frisch aufgesetzt) ist eine Zugabe eines Artikel mit einer "großen Artikelnummer" OHNE Option nicht möglich. Verschiedene var_dump Ausgaben haben uns hier leider auch nicht weitergebracht. Die Artikelnummer wird nirgends mehr (soweit wir das jetzt verfolgen konnten) "gekürzt". Daran kann es nach unserer Auffassung also nicht mehr liegen. Es muss was mit den Optionen zu tun haben. Wir haben uns dazu auch schon folgende Dateien angesehen.... - shopping_cart.php - cart_actions.php - order_details.php - default.php In all den Dateien können wir nichts finden, und auch die var_dump Ausgaben ließen keine Rückschlüsse zu WO die Ursache für das Problem liegt. Es wäre schön wenn man uns hier noch einen Hinweis geben kann, was genau passiert in dem PHP Code, wenn ich auf den Button "kaufen" clicke. Unserer Meinung wird in der cart_actions.php folgender Code aufgerufen case 'add_product' : if (isset ($_POST['products_id']) && is_numeric($_POST['products_id'])) { if ($_POST['products_qty'] > MAX_PRODUCTS_QTY) $_POST['products_qty'] = MAX_PRODUCTS_QTY; $_SESSION['cart']->add_cart((float) $_POST['products_id'], $_SESSION['cart']->get_quantity(xtc_get_uprid($_POST['products_id'], $_POST['id'])) + xtc_remove_non_numeric($_POST['products_qty']), $_POST['id']); //echo $_POST['products_id']."<br>"; //echo var_dump($_SESSION)."<br>"; } xtc_redirect(xtc_href_link($goto, 'products_id='.(float) $_POST['products_id'].'&'.xtc_get_all_get_params($parameters))); break;[/PHP] Leider können wir in dem Code aber auch nichts finden was die Ursache darstellen könnte. Es wäre schön wenn uns hier jemand einen Tipp geben kann, manchmal sieht man ja den Wald vor lauter Bäumen nicht mehr.... Vielen Dank Link to comment Share on other sites More sharing options...
tomquenten Posted October 26, 2006 Author Report Share Posted October 26, 2006 Wir sind noch ein Stück weiter gekommen. Dieser Code hier scheint die Ursache zu sein, bzw. der Verweis auf das Object contents. Artikel die in den Warenkorb gelegt werden verzweigen in die Ausgabe nein, artikel die nicht in den warenkorb gelegt werden können verzweigen in die Ausgabe ja. Unsere Frage an alle..... - wo finden wir das Object contents - welche funktion hat das objeckt function in_cart($products_id) { if (isset ($this->contents[$products_id])) { echo "ja"; return true; } else { echo "nein"; return false; } }[/PHP] Beste Grüsse Link to comment Share on other sites More sharing options...
techway Posted October 26, 2006 Report Share Posted October 26, 2006 hi, contents ist ein array mit den produkten die im warenkorb drin sind! mach doch am besten dies hier: echo "<pre>"; print_r($_SESSION); echo "</pre>"; d.h. es muss schon beim hinzufügen ein fehler vorkommen, hast du den case 'buy_now' : überprüft (in cart_actions.php) Gruß Link to comment Share on other sites More sharing options...
tutsn Posted October 26, 2006 Report Share Posted October 26, 2006 Die products_id ist NICHT die Artikelnummer, sondern die interne Artikel-ID. Die Artikelnummer nennt sich products_model. Für eure internen Artikelnummern solltet ihr nicht die products_id zweckentfremden! Link to comment Share on other sites More sharing options...
tomquenten Posted October 27, 2006 Author Report Share Posted October 27, 2006 so, also wir haben noch einiges in erfahrung bringen können. artikel mit einer product_id bis 2147483647 werden ohne probleme von xt angenommen. ab products_id 2147483648 gibt es sorgen. es MUSS also was mit der (int) Geschichte zu tun haben. darüber hinaus haben wir mit print_r($_SESSION);[/PHP] noch ein paar zusätzliche informationen ergattern können. "normale artikel werdenja in den warenkorb gelegt. das ist in der array ausgabe dann auch sehr schön zu sehen. artikel mit einer products_id größer 2147483647 werden zwar in das array gelegt aber IMMER mit einem - davor. [PHP] [contents] => Array ( [30429] => Array ( [qty] => 1 ) [-2147483648] => Array ( [qty] => 1 ) [-2147483648] => Array ( [qty] => 1 ) [2147483647] => Array ( [qty] => 1 ) )[/PHP] unserer meinung nach liegt der hase in diesem code begraben [PHP]$_SESSION['cart']->add_cart((float) $_POST['products_id'], $_SESSION['cart']->get_quantity(xtc_get_uprid($_POST['products_id'], $_POST['id'])) + xtc_remove_non_numeric($_POST['products_qty']), $_POST['id']);[/PHP] daher müssen wir noch einmal nachfragen.... - wo wird das object add_cart gebildet - wo das object get_quantity und welche funktion hat es überhaupt (es muss, so wie wir das bis jetzt nachvollziehen können was mit dem "zerteilen eines strings zu tun haben z.b. 15482{1}1542 für artikel 15482 mit der option 1 und dem wert 1542) uns wäre mit der information geholfen wo das object add_cart gebildet wird. das konnten wir bis jetzt nicht nachvollziehen. @tutsn Zu Deiner Frage. Wir haben bisher alles darauf abgestimmt immer auf die $products_id zuzugreifen, wie schon eingehend beschrieben haben wir uns einen Connector geschrieben, mit dem wir einfach per Mausklick die Daten in den Shop transferieren.....per ODBC Verbindung. Das jetzt alles wieder zu ändern währe ein heiden Aufwand. Danke an alle die uns helfen wollen.... Link to comment Share on other sites More sharing options...
techway Posted October 27, 2006 Report Share Posted October 27, 2006 die beiden funktionen (add_cart und get_quantity) müsstest du in dieser Classe finden: inlcudes/classes/shopping_cart.php Viel Erfolg ;-) Link to comment Share on other sites More sharing options...
tomquenten Posted October 27, 2006 Author Report Share Posted October 27, 2006 ICH HABS! Das Problem lilegt in der shopping_cart.php. Das Object contents verursacht das problem. artikel größer 2147483647 kann das Object bzw. Array nicht aufnehmen. Warum? Ich habe keine Ahnung, NOCH NICHT! Vieleicht gibt es ja jemanden der von Arrays noch mehr Ahnung bzw. Erfahrung hat wie ich. Ich würde mich freuen, denn das Problem WILL ich gelöst haben. function update_quantity($products_id, $quantity = '', $attributes = '') { if (empty ($quantity)) return true; // nothing needs to be updated if theres no quantity, so we return true.. $this->contents[$products_id] = array ('qty' => $quantity); // update database if (isset ($_SESSION['customer_id'])) xtc_db_query("update ".TABLE_CUSTOMERS_BASKET." set customers_basket_quantity = '".$quantity."' where customers_id = '".$_SESSION['customer_id']."' and products_id = '".$products_id."'"); if (is_array($attributes)) { reset($attributes); while (list ($option, $value) = each($attributes)) { $this->contents[$products_id]['attributes'][$option] = $value; // update database if (isset ($_SESSION['customer_id'])) xtc_db_query("update ".TABLE_CUSTOMERS_BASKET_ATTRIBUTES." set products_options_value_id = '".$value."' where customers_id = '".$_SESSION['customer_id']."' and products_id = '".$products_id."' and products_options_id = '".$option."'"); } } }[/PHP] Der untere Teil der Funktion läuft ohne Probleme, also wenn ein Attribut gewählt wurde geht es. Interessant sein dürfte exakt dieser Code ... [PHP]$this->contents[$products_id] = array ('qty' => $quantity);[/PHP] Eine Ausgabe VOR dem o.g. Code der Variablen $products_id sowie $quantity enthält die richtigen Werte, das Object bzw Array $this->contents danach aber nicht! Kann mir das irgendjemand erklären? Kann man Arrays auch auf Werte bzw. Wertebereiche beschränken??????? Gruss Link to comment Share on other sites More sharing options...
techway Posted October 27, 2006 Report Share Posted October 27, 2006 ich bin mir nun nicht sicher, aber ich glaub schon dass es am array liegt, array( [schlüssel =>] Wert , ... ) // Schlüssel kann ein Integer oder String sein // Wert kann irgendetwas sein der Schlüssel ist ja in deinem Fall $products_id und dieser darf eben entweder Integer oder String sein! Link to comment Share on other sites More sharing options...
tutsn Posted October 27, 2006 Report Share Posted October 27, 2006 Die Größe einer Integer ist systemabhängig, aber bei ca. 2 Milliarden sollte Schluss ein. Ihr müsst entweder die products_id als String behandeln oder eben doch auf products_model umstellen und die products_id dabei belassen, wozu sie eigentlich da ist. In beiden Fällen habt ihr auf jeden Fall noch Arbeit vor euch. Die products_id als String zu behandeln dürfte jedenfalls etliche weitere Folgeprobleme mit sich bringen. Bevor ihr jetzt den halben Shopkern anpasst und das Datenmodell auf den Kopf stellt, überarbeitet doch lieber eure Exportroutine, da wisst ihr doch wenigstens genau wie sie funktioniert... Link to comment Share on other sites More sharing options...
tomquenten Posted October 27, 2006 Author Report Share Posted October 27, 2006 DANKE EUCH BEIDEN! Da waren ein paar Gedankenanstöße dabei.... Folgende Überlegung.....nachdem ich jetzt in php-resource gelesen habe, muss ich feststellen das @tutsn Recht hat! ABER wenn ich einen Artikel mit Option in den Warenkorb lege dann funktioniert das ja ganz gut denn der string in diesem Falle ist, wenn man ihm mit var_dump aufruft, 3536784515{1}1542. Ergo müssen strings ja doch irgendwie aktzeptiert werden können. Ich habe jetzt einfach folgendes hinzugefügt/geändert..... //wandelt den integer in einen string um $products_id = strval($products_id); $this->contents[$products_id] = array ('qty' => $quantity); [/PHP] ....und, es läuft. Ist der erste Artikel zwar schon einer mit "großer Artikelnummer" dann nimmt er den zwar nicht aber danach funktioniert es. Selbst das Problem werde ich noch in den Griff bekommen....! [b]Schönes Wochenende!!![/b] Liebe Grüsse Link to comment Share on other sites More sharing options...
tutsn Posted October 28, 2006 Report Share Posted October 28, 2006 muss ich feststellen das @tutsn Recht hat! ABER wenn ich einen Artikel mit Option in den Warenkorb lege dann funktioniert das ja ganz gut denn der string in diesem Falle ist, wenn man ihm mit var_dump aufruft, 3536784515{1}1542. Ergo müssen strings ja doch irgendwie aktzeptiert werden können. Klar wird in der Session und in der Datenbank der Warenkorb mit allen Varianten als String abgelegt, aber der wird auch wieder zerlegt und aus der products_id wird wieder eine INT. ....und, es läuft. Ist der erste Artikel zwar schon einer mit "großer Artikelnummer" dann nimmt er den zwar nicht aber danach funktioniert es. Selbst das Problem werde ich noch in den Griff bekommen....! Glaub mir, da werden noch weitere Probleme kommen. Die Bestellabwicklung, der Adminbereich etc... Schnell hast du mehr Zeit mit Anpassungen an XTC investiert, als eine Anpassung eurer Schnittstelle benötigt hätte, vermute ich jetzt mal aus eigener Erfahrung. Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.