Managed Server
Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: Suche in der cross-selling.php erweitern

    0815

    • Viel Schreiber
    • Beiträge: 905
    Suche in der cross-selling.php erweitern
    am: 22. November 2013, 20:54:45
    Hallo,

    die Produktsuche für das Cross-Selling im Backend lässt leider nur einzelne Keywords zu.
    Gibt's da evtl. eine einfache Lösung um die Suche anzupassen, damit man z.B. auch "Koffer blau" suchen kann?

    So schaut's im Original aus:
    Code: PHP  [Auswählen]
    <?php echo xtc_draw_input_field('search', '', 'size="30"');?>
    <?php echo '<input type="submit" class="button" onClick="this.blur();" value="' . BUTTON_SEARCH . '" />';?>

    Für jede Hilfe vorab vielen Dank.

    Linkback: https://www.modified-shop.org/forum/index.php?topic=28445.0

    0815

    • Viel Schreiber
    • Beiträge: 905
    Re: Suche in der cross-selling.php erweitern
    Antwort #1 am: 22. November 2013, 21:10:46
    Oh, mir ist gerade aufgefallen, dass man zwar nach zwei "Wörtern" suchen kann, diese jedoch nicht abkürzen darf.

    "koffer blau" geht
    "koff bl" geht nicht

    ... warum ist das so?
    Im Frontend funktioniert das doch auch.

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 14.008
    • Geschlecht:
    Re: Suche in der cross-selling.php erweitern
    Antwort #2 am: 23. November 2013, 15:32:56
    • Was soll der Doppel-Post ?
    • Suche in /admin/includes/modules/cross_selling.php das
    Code: PHP  [Auswählen]
    $search_query = "SELECT * FROM
                        "
    .TABLE_PRODUCTS_DESCRIPTION." pd,
                        "
    .TABLE_PRODUCTS." p
                        WHERE p.products_id=pd.products_id
                        AND pd.language_id='"
    .$_SESSION['languages_id']."'
                        AND p.products_id!='"
    .$_GET['current_product_id']."'
                        AND (pd.products_name LIKE '%"
    .$_GET['search']."%' or p.products_model LIKE '%".$_GET['search']."%')";

    Dort kannst du im letzten AND-string die Suche anpassen.

    Gruß,
    noRiddle

    *NACHTRAG*
    Wenn du "koff bl" suchst kann die DB das ja nicht finden, woher soll PHP wissen wo du was abkürzt ?
    "koffer bl" würde gehen.

    0815

    • Viel Schreiber
    • Beiträge: 905
    Re: Suche in der cross-selling.php erweitern
    Antwort #3 am: 23. November 2013, 15:38:06
    Zitat
    Was soll der Doppel-Post ?

    Ich hatte das Thema erstellt, bevor ich auf den älteren Beitrag gestoßen bin.
    Hier kann somit gerne zu, so dass wir im anderen Thread weiter diskutieren können.

    Zitat
    *NACHTRAG*
    Wenn du "koff bl" suchst kann die DB das ja nicht finden, woher soll PHP wissen wo du was abkürzt ?
    "koffer bl" würde gehen.

    Im Frontend funktioniert das.

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 14.008
    • Geschlecht:
    Re: Suche in der cross-selling.php erweitern
    Antwort #4 am: 23. November 2013, 15:44:33
    Okay, verstehe.
    Im Frontend wird, da auch Verknüpfungsparameter angegeben werden können (AND und OR), durch jedes einzelne Keyword ge-loop-t.
    Schau dir die /advanced_search_result.php mal an (so ca. ab Zeile 188).

    Gruß,
    noRiddle

    0815

    • Viel Schreiber
    • Beiträge: 905
    Re: Suche in der cross-selling.php erweitern
    Antwort #5 am: 23. November 2013, 15:50:23
    An der Codepassage hatte ich mich bereits vergeblich versucht.
    Es ist zwar mit Sicherheit ein geeigneter Block, ich habe ihn bisher jedoch nicht funktionstüchtig einbauen können.

    Ich werde da deshalb mal weiter basteln.

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 14.008
    • Geschlecht:
    Re: Suche in der cross-selling.php erweitern
    Antwort #6 am: 24. November 2013, 11:09:24
    Analysiere doch mal in Ruhe die Vorgehensweise in der /advanced_search_result.php.
    Durch den for-loop wird jedes Keyword für sich betrachtet, wodurch du das erreichst was du möchtest, nämlich daß auch Fragmente von einzelnen Worten beachtet werden.
    Die dort aufgerufene Funktion xtc_parse_search_string() ist dabei nötig weil sie den Such-String
    - der dann bei dir, um bei deinem Beispiel zu bleiben, aus "koff bl" besteht -
    vor dem Loop in seine Bestandteile ("koff" und "bl") zerlegt.

    Du bekommst das schon hin.

    Gruß,
    noRiddle

    web28

    • modified Team
    • Beiträge: 9.404
    Re: Suche in der cross-selling.php erweitern
    Antwort #7 am: 24. November 2013, 11:59:29
    Einen ähnlichen Codeblock haben wir in der categories_view.php Diesen kann man fast komplett übernehmen.

    Also diesen Code:

    Code: PHP  [Auswählen]
        $search_query = "SELECT * FROM
                        "
    .TABLE_PRODUCTS_DESCRIPTION." pd,
                        "
    .TABLE_PRODUCTS." p
                        WHERE p.products_id=pd.products_id
                        AND pd.language_id='"
    .$_SESSION['languages_id']."'
                        AND p.products_id!='"
    .$_GET['current_product_id']."'
                        AND (pd.products_name LIKE '%"
    .$_GET['search']."%' or p.products_model LIKE '%".$_GET['search']."%')";
        $search_query = xtc_db_query($search_query);

    durch diesen ersetzen:

      
    Code: PHP  [Auswählen]
     include(DIR_FS_INC . 'xtc_parse_search_string.inc.php');
        define(ADMIN_SEARCH_IN_ATTR, true); // true = search in attributes
        define(ADMIN_SEARCH_IN_DESC, false); // true = search in description
        //build query
        $select_str = "SELECT DISTINCT p.products_tax_class_id,
                                       p.products_id,
                                       pd.products_name,
                                       p.products_sort,
                                       p.products_quantity,
                                       p.products_image,
                                       p.products_model,
                                       p.products_price,
                                       p.products_discount_allowed,
                                       p.products_date_added,
                                       p.products_last_modified,
                                       p.products_date_available,
                                       p.products_status,
                                       p.products_startpage,
                                       p.products_startpage_sort"
    ;

        $from_str  = " FROM ".TABLE_PRODUCTS." AS p ";
        $from_str .= "LEFT JOIN ".TABLE_PRODUCTS_DESCRIPTION." AS pd ON (p.products_id = pd.products_id) ";
        if (ADMIN_SEARCH_IN_ATTR == 'true') {
          $from_str .= "LEFT OUTER JOIN ".TABLE_PRODUCTS_ATTRIBUTES." AS pa ON (p.products_id = pa.products_id) ";
          $from_str .= "LEFT OUTER JOIN ".TABLE_PRODUCTS_OPTIONS_VALUES." AS pov ON (pa.options_values_id = pov.products_options_values_id) ";
        }
        //where-string
        $where_str = " WHERE pd.language_id = '".(int) $_SESSION['languages_id']."'";
        //go for keywords... this is the main search process
        if (isset ($_GET['search']) && xtc_not_null($_GET['search'])) {
          if (xtc_parse_search_string(stripslashes($_GET['search']), $search_keywords)) {
            $where_str .= " AND ( ";
            for ($i = 0, $n = sizeof($search_keywords); $i < $n; $i ++) {
              switch ($search_keywords[$i]) {
                case '(' :
                case ')' :
                case 'and' :
                case 'or' :
                  $where_str .= " ".$search_keywords[$i]." ";
                  break;
                default :
                  $ent_keyword = encode_htmlentities($search_keywords[$i]);
                  $ent_keyword = ($ent_keyword != $search_keywords[$i]) ? addslashes($ent_keyword) : false;
                  $keyword = addslashes($search_keywords[$i]);
                  $where_str .= " ( ";
                  $where_str .= "pd.products_keywords LIKE ('%".$keyword."%') ";
                  $where_str .= ($ent_keyword) ? "OR pd.products_keywords LIKE ('%".$ent_keyword."%') " : '';
                  if (ADMIN_SEARCH_IN_DESC == 'true') {
                    $where_str .= "OR pd.products_description LIKE ('%".$keyword."%') ";
                    $where_str .= ($ent_keyword) ? "OR pd.products_description LIKE ('%".$ent_keyword."%') " : '';
                    $where_str .= "OR pd.products_short_description LIKE ('%".$keyword."%') ";
                    $where_str .= ($ent_keyword) ? "OR pd.products_short_description LIKE ('%".$ent_keyword."%') " : '';
                  }
                  $where_str .= "OR pd.products_name LIKE ('%".$keyword."%') ";
                  $where_str .= ($ent_keyword) ? "OR pd.products_name LIKE ('%".$ent_keyword."%') " : '';
                  $where_str .= "OR p.products_model LIKE ('%".$keyword."%') ";
                  $where_str .= ($ent_keyword) ? "OR p.products_model LIKE ('%".$ent_keyword."%') " : '';
                  if (ADMIN_SEARCH_IN_ATTR == 'true') {
                    $where_str .= "OR pa.attributes_model LIKE ('%".$keyword."%') ";
                    $where_str .= ($ent_keyword) ? "OR pa.attributes_model LIKE ('%".$ent_keyword."%') " : '';
                    $where_str .= "OR (pov.products_options_values_name LIKE ('%".$keyword."%') ";
                    $where_str .= ($ent_keyword) ? "OR pov.products_options_values_name LIKE ('%".$ent_keyword."%') " : '';
                    $where_str .= "AND pov.language_id = '".(int) $_SESSION['languages_id']."')";
                  }
                  $where_str .= " ) ";
                  break;
              }
            }
            $where_str .= " ) GROUP BY p.products_id";
          }
        }
        $search_query = xtc_db_query($select_str.$from_str.$where_str);

    Gruss Web28

    0815

    • Viel Schreiber
    • Beiträge: 905
    Re: Suche in der cross-selling.php erweitern
    Antwort #8 am: 24. November 2013, 12:15:47
    Aua!

    Da war ich wirklich sehr nah' an der Lösung dran. Leider hatte ich immer ein paar Zeilen zusätzlich ersetzt.  :doh:

    Vielen, vielen Dank!

    Jetzt fehlen nur noch zwei "Kleinigkeiten" (?) ...
    1. Kann man die Datenbankabfrage noch so anpassen, dass nur noch die Cross-Selling-Produkte ausgegeben werden, welche dem Ausgangsprodukt noch nicht zugeordnet sind?

    2. Beide Speicherbuttons in der Funktion (neues Produkt hinzufügen/Produkt entfernen) zusammenlegen.

    Darüber hinaus habe ich die Datei noch mit anderen, hilfreichen Optionen ausgestattet:

    -Produktthumbnails
    -Alle/Keine-Markierungshilfe
    -Ausgabe des jeweiligen Bestandes
    -Produktstatus (Produkte aktiv/inaktiv) ... Ampelanzeige, aber ohne Manipulationsmöglichkeit.
    -Sicherheitsabfrage, ob man tatsächlich speichern möchte, entfernt (für schnelles arbeiten)
    -etc.

    Die "Komplettlösung" kann ich dann gerne hier hochladen.

    web28

    • modified Team
    • Beiträge: 9.404
    Re: Suche in der cross-selling.php erweitern
    Antwort #9 am: 24. November 2013, 12:58:54
    Lade die Datei hier hoch, das wird bestimmt noch andere interessieren.
    Evtl. kommen noch weitere Vorschläge

    0815

    • Viel Schreiber
    • Beiträge: 905
    Re: Suche in der cross-selling.php erweitern
    Antwort #10 am: 24. November 2013, 14:23:22
    Als Anlage meine Datei.
    Die Datei basiert nicht auf dem modified 1.06, die Unterschiede sind jedoch vermutlich überschaubar.
    (... Änderungen habe ich allerdings nicht gekennzeichnet, o.ä. sondern den vorhanden Code einfach entsprechend geändert.  :whistle:)

    Den Zurück-Button habe ich entfernt, weil ich meine cross-selling.php in einem neuen Tab öffnen lasse (target=_blank").

    Folgende Anpassungen sind zusätzlich noch notwendig:

    /admin/includes/javascript/categories.js
    Am Ende folgende Zeilen einfügen:
    Code: PHP  [Auswählen]
    function checkAll(field)  { for (i = 0; i < field.length; i++) field[i].checked = true ;  }
    function uncheckAll(field) { for (i = 0; i < field.length; i++) field[i].checked = false ; }
    [Quelle: http://www.colornativ.de/tipps-und-tricks/xtcommerce-cross-selling-artikel-anlegen-vereinfacht/
    ... die Anleitung auf der verlinkten Webseite enthält allerdings einen kleinen Fehler, den ich in meiner Datei bereits korrigiert habe.]

    /lang/german/admin/categories.php
    Nach dieser Zeile:
    Code: PHP  [Auswählen]
    define('HEADING_CATEGORY','Kategorie');

    folgende Zeilen einfügen:
    Code: PHP  [Auswählen]
    define('HEADING_QUANTITY','Menge');
    define('HEADING_STATUS','Status');

    ... ich hoffe ich hab' nichts vergessen. Bitte mal testen.

    Darüber hinaus würde ich mich über eine Lösung für die beiden weiter o.g., noch fehlenden Optionen sehr freuen.

    0815

    • Viel Schreiber
    • Beiträge: 905
    Re: Suche in der cross-selling.php erweitern
    Antwort #11 am: 24. November 2013, 15:30:07
    Bei Bedarf kann man die Suchtreffer noch nach dem Produktstatus sortieren lassen.
    suchen nach:
    Code: PHP  [Auswählen]
    $where_str .= " ) GROUP BY p.products_id";

    ersetzen durch:
    Code: PHP  [Auswählen]
    $where_str .= " ) GROUP BY p.products_id ORDER BY p.products_status DESC";

    0815

    • Viel Schreiber
    • Beiträge: 905
    Re: Suche in der cross-selling.php erweitern
    Antwort #12 am: 25. November 2013, 23:50:17
    So, ich habe noch eine Abfrage eingefügt, welche die Anzahl der bereits mit dem Hauptprodukt verlinkten Cross-Selling-Produkte ausgibt.
    Da bei meinem Template 6 Cross-Selling-Produkte pro Reihe (also nebeneinander) angezeig werden, kann ich so auf einen Blick schneller ausmachen, wie viele Reihen gefüllt werden.

    Ich lade das "nachher" hoch, wenn die Datei "Final-Status" hat.

    ... leider fehlen mir dazu noch zwei bereits weiter oben genannte Optionen, mit deren Umsetzung ich leider nicht wirklich weiter komme:

    1. Die Datenbankabfrage der Suche so anpassen, dass nur noch die Cross-Selling-Produkte ausgegeben werden, welche dem Hauptprodukt noch nicht zugeordnet sind?

    2. Beide Speicherbuttons in der Funktion (neues Produkt hinzufügen/Produkt entfernen) zusammenlegen. So, dass man zum Löschen, oder Speichern nicht immer zum entsprechenden Button scrollen muss.

    ... würde mich über Hilfe/Lösungsvorschläge/Anregungen freuen.

    Danke

    0815

    • Viel Schreiber
    • Beiträge: 905
    Re: Suche in der cross-selling.php erweitern
    Antwort #13 am: 26. November 2013, 01:09:16
    Ich habe jetzt mal wieder eine gute Stunde in die Lösung von Option 1. investiert, allerdings leider vergeblich.

    Es erschließt sich mir nicht, wie man die Ergebnisse aus dem array $search_data mit denen des array $cross_data abgleicht, um nur die möglichen, neue Cross-Selling-Produkte auszugeben, welche im array $cross_data nicht bereits enthalten sind.

     :-?

    web0null

    • Experte
    • Beiträge: 1.998
    Re: Suche in der cross-selling.php erweitern
    Antwort #14 am: 26. November 2013, 09:22:03
    Ersetze mal:
    Code: PHP  [Auswählen]
    //where-string
        $where_str = " WHERE pd.language_id = '".(int) $_SESSION['languages_id']."'";
    mit:
    Code: PHP  [Auswählen]
    $cPath_array = explode('_', $_GET['cpath']);
        $current_category_id = end($cPath_array);
        $from_str .= "LEFT JOIN ".TABLE_PRODUCTS_TO_CATEGORIES." AS p2c ON (p2c.products_id = p.products_id AND p2c.categories_id = ".(int)$current_category_id.")
                     WHERE p.products_id NOT IN (
                       SELECT xsell_id
                         FROM "
    .TABLE_PRODUCTS_XSELL."
                         WHERE products_id = "
    .(int)$_GET['current_product_id'].")";
        $from_str .= " AND p.products_id != ".(int)$_GET['current_product_id'];
        $from_str .= " AND pd.language_id = '".(int) $_SESSION['languages_id']."'";
        $where_str = '';
        //where-string
        //$where_str = " WHERE pd.language_id = '".(int) $_SESSION['languages_id']."'";

    Dann dürften nur die auftauchen, die noch nicht zugeordnet sind, ...und der aktuell bearbeitete Artikel taucht auch nicht auf.

    Gruß

    EDIT:
    Die ersten 3 Zeilen wurden geändert.
    0 Antworten
    1335 Aufrufe
    01. Dezember 2016, 05:09:10 von rayban
    0 Antworten
    1683 Aufrufe
    11. Oktober 2012, 13:44:00 von voodoopupp
    0 Antworten
    1885 Aufrufe
    02. März 2015, 10:24:42 von Toby