ihoppe Posted December 1, 2008 Report Share Posted December 1, 2008 Hallo, als "Nicht-XT-Shop-Experte" möchte ich ein php-Skript in den XT-Shop einfügen, bei dem eine spezielle Suche nach bestimmten Produkten aufgerufen wird. Das Skript liefert mir als Ergebnis der Suche die products_id aus dem table products. Kann mir jemand sagen, an welches Skript ich die Variable übergeben muss, damit meine Suchergebnisse im Shop, untereinander angezeigt werden? Die Suchergebnisse stammen aus verschiedenen Kategorien. Muss ich die Datei shop_content.php abändern? Vielen Dank für die Hilfe!! Ines Hoppe Link to comment Share on other sites More sharing options...
hubbabubba Posted December 1, 2008 Report Share Posted December 1, 2008 Das kannst du folgendermaßen realisieren. Als Vorlage schau in advanced_search.php und advanced_search_results.php Kannst du kopieren, anpassen und einbasteln in den Shop. advanced_search erzeugt ein Suchformular dessen Formulardaten an advanced_search_results übergeben werden. advanced_search_results konstruiert aus den Formulardaten eine komplizierte SQL-Abfrage. Diesen Teil ersetzt du gegen deine Suchfunktion und generierst eine SQL-Abfrage welche exakt nur jene Artikel liefert die deine Suchfunktion ermittelt hat. konkret advanced search_results Zeile 37 if (isset ($_GET['keywords']) && empty ($_GET['keywords'])) { bis Zeile 232 //glue together schmeisst du komplett raus und ersetzt gegen deine Suchfunktion. In Variable $listing_sql (global) setzt du die spezielle SQL-Abfrage die nur genau definierte Artikel liefert. Zwar so. $select_str = "SELECT distinct p.products_id, p.products_price, p.products_model, p.products_quantity, p.products_shippingtime, p.products_fsk18, p.products_image, p.products_weight, p.products_tax_class_id, pd.products_name, pd.products_short_description, pd.products_description "; $from_str = "FROM ".TABLE_PRODUCTS." AS p LEFT JOIN ".TABLE_PRODUCTS_DESCRIPTION." AS pd ON (p.products_id = pd.products_id) ";[/php]Für $where_str nun ein where deiner Ergebnisliste (products_id's). Du hast z.B. ein Array mit products_id's: $result_products_id_arr $in = "'".implode("','", $result_products_id_arr)."'"; $where_str = " WHERE p.products_status = '1' "." AND pd.language_id = '".(int) $_SESSION['languages_id']; $where.= "and p.products_id in ".$in; Dann $listing_sql bilden $listing_sql = $select_str.$from_str.$where_str; Ab hier geht der Rest von allein und deine Artikelliste erscheint. Hab das nicht auf Syntax überprüft. Aber im Prinzip gehts so. mfg Link to comment Share on other sites More sharing options...
ihoppe Posted December 1, 2008 Author Report Share Posted December 1, 2008 Tausend Dank für die umfassende Antwort!!!! Dann werde ich mich jetzt an die Arbeit machen. MfG aus Berlin Ines Hoppe Link to comment Share on other sites More sharing options...
ihoppe Posted December 4, 2008 Author Report Share Posted December 4, 2008 Hallo, Ich habe jetzt das advanced_search_result.php an meine Suchabfrage angepasst. Ich habe nun doch nicht die product_id an das Skript übergeben, sondern die gesamt sql-Abfrage eingebettet. Die SQL-Abfrage habe ich im PHPMyAdmin überprüft, sie ist soweit i.O. Wenn ich mein Skript einfach auf dem Server laufen lasse, d.h. ohne dass es in den Shop eingebunden ist, läuft es auch o.k. (d.h. echo $select_str; wird korrekt angezeigt) Nur mit der Darstellung im Shop klappt es nicht: Als Ausgabe bekomme ich den letzten Teil des php-Skriptes als Text und zwar ab der Stelle, wo das erste Relationszeichen > in der Select-Abfrage erscheint (= products_modelle_gewinde.A AND products ...). Kann das Problem mit den Relationszeichen in der Select-Abfrage zu tun haben? Vielen Dank für jede Hilfe im Voraus!! I. Hoppe Hier der Quelltext der content-Datei: Die Variable $Modell stammt aus dem Formular. <?php /* ----------------------------------------------------------------------------------------- $Id: advanced_search_result.php 1141 2005-08-10 11:31:36Z novalis $ XT-Commerce - community made shopping http://www.xt-commerce.com Copyright (c) 2005 XT-Commerce ----------------------------------------------------------------------------------------- based on: (c) 2000-2001 The Exchange Project (earlier name of osCommerce) (c) 2002-2003 osCommerce(advanced_search_result.php,v 1.68 2003/05/14); www.oscommerce.com (c) 2003 nextcommerce (advanced_search_result.php,v 1.17 2003/08/21); www.nextcommerce.org Released under the GNU General Public License ---------------------------------------------------------------------------------------*/ include_once ('includes/application_top.php'); // create smarty elements $smarty = new Smarty; // include boxes require (DIR_FS_CATALOG.'templates/'.CURRENT_TEMPLATE.'/source/boxes.php'); // include needed functions require_once (DIR_FS_INC.'xtc_parse_search_string.inc.php'); require_once (DIR_FS_INC.'xtc_get_subcategories.inc.php'); require_once (DIR_FS_INC.'xtc_get_currencies_values.inc.php'); /* * check search entry */ $error = 0; // reset error flag to false $errorno = 0; $keyerror = 0; $Marke=$_POST["selKategorie"]; $Modell=$_POST["selItems"]; $select_str = "SELECT distinct Unterabfrage.*, p.products_price, p.products_model, p.products_quantity, p.products_shippingtime, p.products_fsk18, p.products_image, p.products_weight, p.products_tax_class_id, pd.products_name, pd.products_short_description, pd.products_description FROM ( SELECT products_gewinde.products_id FROM products_gewinde, products_modelle_gewinde WHERE products_modelle_gewinde.Modell = \"$Modell\" AND products_gewinde.AA >= products_modelle_gewinde.A AND products_gewinde.BB >= products_modelle_gewinde.B AND products_gewinde.CC >= products_modelle_gewinde.C AND products_gewinde.DD <= products_modelle_gewinde.D ) as Unterabfrage INNER JOIN products AS p ON Unterabfrage.products_id=p.products_id LEFT JOIN products_description AS pd ON (p.products_id = pd.products_id)"; $listing_sql = $select_str; echo $listing_sql; //glue together $listing_sql = $select_str; require (DIR_WS_MODULES.FILENAME_PRODUCT_LISTING); $smarty->assign('language', $_SESSION['language']); $smarty->caching = 0; if (!defined(RM)) $smarty->load_filter('output', 'note'); $smarty->display(CURRENT_TEMPLATE.'/index.html'); include ('includes/application_bottom.php'); ?>[/PHP] Link to comment Share on other sites More sharing options...
hubbabubba Posted December 4, 2008 Report Share Posted December 4, 2008 Schwer nachzuvollziehen. Könnte mit Stringbegrenzern zu tun haben. Eins fiel mir auf. Benutze in der SQL-Abfrage mal einfache Anführungszeichen. Ersetze \"$Modell\" Gegen '$Modell' mfg Link to comment Share on other sites More sharing options...
ihoppe Posted December 5, 2008 Author Report Share Posted December 5, 2008 Ja, vielen Dank für den Hinweis, die SQL-Abfrage ist jetzt o.k., allerdings bleibt das Skript jetzt bei den smarty's hängen. Im Browser erscheint: assign('language', $_SESSION['language']); $smarty->caching = 0; if (!defined(RM)) $smarty->load_filter('output', 'note'); $smarty->display(CURRENT_TEMPLATE.'/index.html'); include ('includes/application_bottom.php'); ?> Weil er sich anscheinend bei der $_SESSION['language'] aufhängt, habe ich in der sql-Abfrage die language noch mit eingearbeitet (aber als 2 definiert : WHERE p.products_status = '1' AND pd.language_id = '2' ) aber klappt auch nicht . Wenn ich assign('language', $_SESSION['language']); ganz rausnehme, hängt er am nächsten smarty fest!? Hast Du noch eine Idee? Vielen Dank für die Hilfe. Link to comment Share on other sites More sharing options...
hubbabubba Posted December 5, 2008 Report Share Posted December 5, 2008 Ich weiß es auch nicht. Ich kenne den Code nicht und habe keine entspr. modifizierte DB. Alles was ich noch sagen kann ist spekulativ. Du solltest jetzt anfangen systematisch zu debuggen. echo und print_r Lass dir Schritt für Schritt Zustände (Var-Werte) anzeigen und prüfe ob sie dem erwarteten entsprechen. Tausche die SQL Abfrage gegen was garantiert unverfängliches und schaue ob die gleiche Panne immer noch auftritt. Durch simples ausprobieren grenzt du den Fehler anfangs grob ein und ziehst durch immer gezielteres Probieren und ausschließen von möglichen Ursachen die Grenzen immer enger. So tastest du dich an die fehlerhafte Stelle. Nochn Tip. SQL Konstruktionen können durch Sonderzeichen durchsetzte Datenwerte sabotiert werden. Schau auf die Datenwerte (Modell). Und vergiss nicht SQL Injection. mfg Link to comment Share on other sites More sharing options...
ihoppe Posted December 5, 2008 Author Report Share Posted December 5, 2008 Danke für die Antwort. Ich versuche schon, dem Fehler auf die Spur zu kommen. In dem Skript ist ein echo $listing_sql drin, aber es wird nicht angezeigt. Wenn ich dasselbe Skript OHNE das XT-Drumherum laufen lasse, funktioniert es ja. Das echo wird dann angezeigt und wenn ich diese echo select kopiere und in phpmyadmin als sql-query ausprobiere, bekomme ich die korrekten Produkte für die Suchanfrage mit den entsprechenden Feldern fürs listing ausgegeben. ... Ja und dann muss ich mich noch um die Formulardaten kümmern ... Ich will nur das Ganze im Shop erst mal zum Laufen bringen. <?php /* ----------------------------------------------------------------------------------------- $Id: advanced_search_result.php 1141 2005-08-10 11:31:36Z novalis $ XT-Commerce - community made shopping http://www.xt-commerce.com Copyright (c) 2005 XT-Commerce ----------------------------------------------------------------------------------------- based on: (c) 2000-2001 The Exchange Project (earlier name of osCommerce) (c) 2002-2003 osCommerce(advanced_search_result.php,v 1.68 2003/05/14); www.oscommerce.com (c) 2003 nextcommerce (advanced_search_result.php,v 1.17 2003/08/21); www.nextcommerce.org Released under the GNU General Public License ---------------------------------------------------------------------------------------*/ include_once ('includes/application_top.php'); // create smarty elements $smarty = new Smarty; // include boxes require (DIR_FS_CATALOG.'templates/'.CURRENT_TEMPLATE.'/source/boxes.php'); // include needed functions require_once (DIR_FS_INC.'xtc_parse_search_string.inc.php'); require_once (DIR_FS_INC.'xtc_get_subcategories.inc.php'); require_once (DIR_FS_INC.'xtc_get_currencies_values.inc.php'); /* * check search entry */ $error = 0; // reset error flag to false $errorno = 0; $keyerror = 0; $Marke=$_POST["selKategorie"]; $Modell=$_POST["selItems"]; $select_str = "SELECT distinct Unterabfrage.*, p.products_status, p.products_price, p.products_model, p.products_quantity, p.products_shippingtime, p.products_fsk18, p.products_image, p.products_weight, p.products_tax_class_id, pd.products_name, pd.products_short_description, pd.products_description FROM ( SELECT products_gewinde.products_id, p.products_status, pd.language_id FROM products_gewinde, products_modelle_gewinde, products AS p , products_description AS pd WHERE p.products_status = '1' AND pd.language_id = '2' AND products_modelle_gewinde.Modell = '$Modell' AND products_gewinde.AA >= products_modelle_gewinde.A AND products_gewinde.BB >= products_modelle_gewinde.B AND products_gewinde.CC >= products_modelle_gewinde.C AND products_gewinde.DD <= products_modelle_gewinde.D ) as Unterabfrage INNER JOIN products AS p ON Unterabfrage.products_id=p.products_id LEFT JOIN products_description AS pd ON (p.products_id = pd.products_id)"; $listing_sql = $select_str; echo $listing_sql; //glue together $listing_sql = $select_str; require (DIR_WS_MODULES.FILENAME_PRODUCT_LISTING); $smarty->assign('language', $_SESSION['language']); $smarty->caching = 0; if (!defined(RM)) $smarty->load_filter('output', 'note'); $smarty->display(CURRENT_TEMPLATE.'/index.html'); include ('includes/application_bottom.php'); ?>[/PHP] Link to comment Share on other sites More sharing options...
hubbabubba Posted December 5, 2008 Report Share Posted December 5, 2008 Spekulation: Das Modul require (DIR_WS_MODULES.FILENAME_PRODUCT_LISTING); parst die übergebene SQL-Anweisung in gewissem Maße und setzt es neu zusammen. Deine SQL-Anweisung ist ungewöhnlich tief verschachtelt. Gehen wir davon aus, daß die Lib. damit nicht klar kommt: Dann müsstest du die Lib. umschreiben. Ein anderer Weg ist. Du übergibst deine SQL-Anweisung direkt an die DB (xtc_db_query) , liest anschließend in einer Schleife alle product_ids aus und speicherst diese in ein Array. Jetzt hast du jenen Zustand den ich in meinem ersten Beitrag postulierte. Mit diesem product_id Array konstruierst du eine neue (simple) SQL-Anweisung die du der Lib übergibst. Probier mal das. mfg Link to comment Share on other sites More sharing options...
ihoppe Posted December 5, 2008 Author Report Share Posted December 5, 2008 Vielen Dank, dass Du mir immer weiter hilfst!!!! - wo ich doch immer kurz vorm verzweifeln bin. Es ist fast geschafft! Ich bekomme jetzt die ausgewählten Produkte angezeigt seit ich das PHP-Skript im CM nun als Anhang eingefügt habe und nicht wie vorher in das Textarea-Feld. Vom Inhalt her habe ich nichts verändert, nur das echo der select-Abfrage rausgenommen. Allerdings gibt es nun ein neues Phänomen auf der Seite. Wenn die Ergebnisliste angezeigt wird, überlagern sich die Templates. Ich muss wahrscheinlich den aufgerufenen Frame ändern. Grüße. Link to comment Share on other sites More sharing options...
ihoppe Posted December 7, 2008 Author Report Share Posted December 7, 2008 Leider komme ich schon wieder nicht weiter: Die Ergebnisse der Suche werden angezeigt, aber es liegen die templates übereinander. Der header wird 2 mal aufgerufen, der div navi auch 2 mal, der div copyright wird 3 mal aufgerufen!? Was ist denn das nun wieder? www.wandhalterung.tv/content/Teststartseite.html Ich rufe das Skript über die url auf: <form action="http://www.wandhalterung.tv/content/Ergebnisliste.html" method="post"> Ich habe es mit und ohne verschiedene targets probiert, aber das Doppelbild verschwindet nicht!? Und dann noch ein Fehler: die Überschrift (die im CM eingetragen ist) wird nicht angezeigt. Adventsgrüße. Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.