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: Code zum Generieren von Produktlisten einer Kategorie

    mcm

    • Mitglied
    • Beiträge: 151
    Hallo,
    ich würde gerne einen Code (PHP/Smarty) bereitstellen, mit dem in einem normalen Content-Textfeld eine Linkliste von Produkten erzeugt wird.
    Auswahlkriterium soll in meinem Fall die Kategorienummer sein, denkbar wären aber evtl. auch andere Kriterien.

    D.h. in ein normales Textfeld wird in etwa Folgendes eingegeben: {get_productlist kat_id=15}
    Und ausgegeben wird eine Linkliste mit allen Produkten der Kategorie 15.

    Gibt es sowas eventuell schon und wenn nicht:

    Wie könnte man sowas angehen?

    Ich hab zwar nur geringe PHP-Kenntnisse, würde da aber gerne experimentieren, wenn mir jemand eine grobe Herangehensweise empfehlen könnte.

    Vielen Dank
    - mcm -

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

    GTB

    • modified Team
    • Gravatar
    • Beiträge: 6.307
    • Geschlecht:
    Re: Code zum Generieren von Produktlisten einer Kategorie
    Antwort #1 am: 01. November 2012, 23:29:34
    willst du das innerhalb der Shopseiten machen ?

    Gruss Gerhard

    mcm

    • Mitglied
    • Beiträge: 151
    Re: Code zum Generieren von Produktlisten einer Kategorie
    Antwort #2 am: 01. November 2012, 23:40:50
    Hallo Gerhard,
    der Aufruf soll innerhalb des Shops stattfinden, genauer:
    auf Seiten des MiniCMS-Systems (Infocenter).

    Hast Du da eine Idee?

    GTB

    • modified Team
    • Gravatar
    • Beiträge: 6.307
    • Geschlecht:
    Re: Code zum Generieren von Produktlisten einer Kategorie
    Antwort #3 am: 01. November 2012, 23:48:32
    löse es mit einem Smarty Modifier :  http://www.smarty.net/docs/en/plugins.modifiers.tpl

    Gruss Gerhard

    mcm

    • Mitglied
    • Beiträge: 151
    Re: Code zum Generieren von Produktlisten einer Kategorie
    Antwort #4 am: 01. November 2012, 23:58:42
    Da schließen sich einige Fragen an:

    1. Ist so ein Smary-Aufruf direkt aus einem Editor-Textfeld heraus einfach so möglich, bzw. wie kann ich dies ermöglichen?

    2. Wo müsste ich einen solchen Smarty Modifier anlegen, um möglichst von überall darauf zugreifen zu können?

    3. Wie kann ich per PHP auf die einzelnen Produkte einer Kategorie zugreifen?

    Ich weiß, das klingt jetzt wie: könnt Ihr mir das gleich mal alles Programmieren. Das sollt Ihr natürlich nicht, aber für die geeigneten Ansätze habt Ihr einfach mehr Erfahrung...

    Also vielen Dank für die Hinweise!

    - mcm -

    mcm

    • Mitglied
    • Beiträge: 151
    Re: Code zum Generieren von Produktlisten einer Kategorie
    Antwort #5 am: 02. November 2012, 00:07:07
    Nochwas, die Smarty-Modifier werden ja auf eine vorhandene Smarty-Variable angewandt.

    D.h. ich brauche eine Variable, die alle Kategorien und ihre Produkte bereitstellt.

    Gibt es die schon? Und ist die auch im MiniCMS-System verfügbar?
    Bzw. wie kann ich sie bereitstellen?

    Danke!!!

    hendrik

    • Experte
    • Beiträge: 2.038
    Re: Code zum Generieren von Produktlisten einer Kategorie
    Antwort #6 am: 02. November 2012, 06:38:10
    Mal aus der freien Hand. Ohne Gewährleistung.

    Code: PHP  [Auswählen]
    $cat_id=123;  // Die Kategorie ID deren Artikel du suchst

    $sql="select
            ptc.products_id, pd.products_name
          from
            "
    .TABLE_PRODUCTS_TO_CATEGORIES." ptc,
            "
    .TABLE_PRODUCTS_DESCRIPTION." pd
          where
            ptc.products_id=pd.products_id
            and categories_id='"
    .$cat_id."'
            pd.language_id = '"
    .(int) $_SESSION['languages_id']."'";
    $res=xtc_db_query($sql);
    $link_arr=array();
    while($data=xtc_db_fetch_array($res)) {
      $pid = $data['products_id'];
      $g=xtc_products_link($pid);
      $link_arr[] = array( 'link' => xtc_href_link(FILENAME_PRODUCT_INFO, $g),
                           'name' => $data['products_name'] );
    }


    $smartyobjekt->assign('PROD_LINK_ARR', $link_arr);

    Im Template schreibst du:

    Code: XML  [Auswählen]
    {foreach item=prod_link from=$PROD_LINK_ARR}
      <a href="{$prod_link.link}">{$prod_link.name}</a>
    {/foreach}

    Wie gesagt, aus freier Hand. Ungeprüft. Verstehen, anpassen und entbuggen (hoffentlich nicht :-) ), will ich dir nicht das ganze Vergnügen rauben. ;-)

    Gruß
    Hen

    mcm

    • Mitglied
    • Beiträge: 151
    Re: Code zum Generieren von Produktlisten einer Kategorie
    Antwort #7 am: 02. November 2012, 09:25:19
    Während ich gemütlich schlummere, machen anderere die Arbeit....
    Tausend Dank - Hendrik!

    Natürlich hatte ich gehofft, dass es da schon ne fertige Variable oder XTC-Funktion gibt, welche die Produktlinks bereitstellt. Wenn nicht, dann sollte man (ich - mit Eurer Hilfe...) das vielleicht mal per Modul ermöglichen.

    Wie ich aber schon angesprochen hatte, würde ich das ganze nun auch noch gerne direkt aus einem Editor-TextFeld auslesen lassen, also nicht ins Template, sondern den entsprechenden Codeschnipsel (z.B. {get_productlist $kat_id=15}) direkt in die Produktbeschreibung bzw. in meinem Fall in den Text einer MiniCMS-Seite schreiben.

    Seht Ihr da eine Möglichkeit?
    Alternativ würde ich eine Funktion über das entsprechende Texfeld legen, die nach einem festgelegten Code-Muster sucht.

    Danke

    mcm

    • Mitglied
    • Beiträge: 151
    Re: Code zum Generieren von Produktlisten einer Kategorie
    Antwort #8 am: 03. November 2012, 02:28:25
    Ich habe nun probehalber die folgende Funktion an das Ende der product_info.php eingefügt.
    Sie sucht im 'main_content' nach dem Muster
    Code: XML  [Auswählen]
    {get_catItems cat_id=10}
    , extrahiert die CatId und ersetzt das Muster mit der Linkliste aller Produkte der entsprechenden Kategorie.

    Der Filter funktioniert soweit, aber die DB-Abfrage leider nicht.
    Ich hab da nicht viel Ahnung von, konnte aber keinen Fehler finden.

    Könnt Ihr bitte helfen????

    Code: PHP  [Auswählen]
           
    function get_catItems($contentText)             {
          $reg_muster = '/(\{get_catItems cat_id=)(?P<catId>.*)(\})/';
          if (preg_match ($reg_muster, $contentText, $treffer)) {                  
              $catId = $treffer['catId'];
               
            $sql="select
               ptc.products_id, pd.products_name
             from
               "
    .TABLE_PRODUCTS_TO_CATEGORIES." ptc,
               "
    .TABLE_PRODUCTS_DESCRIPTION." pd
             where
               ptc.products_id=pd.products_id
               and categories_id='"
    .$catId."'
               pd.language_id = '"
    .(int) $_SESSION['languages_id']."'";
                 
            $res=xtc_db_query($sql);
            while($data=xtc_db_fetch_array($res)) {
              $pid = $data['products_id'];
              $g=xtc_products_link($pid);
              $link = xtc_href_link(FILENAME_PRODUCT_INFO, $g);
              $name = $data['products_name'];
              $linklist .= '<a href='.$prod_link['link'].'>'.$prod_link['name'].'</a><br />'
            }  
          return preg_replace($reg_muster,$linklist,$contentText);
          }
        }
    $product_info = get_catItems($product_info);
    $smarty->assign('main_content', $product_info);

    h-h-h

    • modified Team
    • Beiträge: 4.562
    Re: Code zum Generieren von Produktlisten einer Kategorie
    Antwort #9 am: 03. November 2012, 03:24:09
    Ich denke dies könnte dir helfen:
    http://www.gunnart.de/tipps-und-tricks/smarty-function-gunnartproductslist-fuer-xtcommerce/

    In deiner Datenbankabfrage fehlt dir ein AND:
    Code: SQL  [Auswählen]
    AND categories_id='".$catId."'
       [-HIER-]       pd.language_id = '".(int) $_SESSION['languages_id']."'";

    Besten Gruß

    h-h-h

    mcm

    • Mitglied
    • Beiträge: 151
    Re: Code zum Generieren von Produktlisten einer Kategorie
    Antwort #10 am: 03. November 2012, 16:35:23
    Hallo,
    da in meinem Falle ja direkt der Content nach den übergebenen Kategorienummern abgefragt werden soll, nützen mir die Funktionen im Template leider nichts.

    Hab nun eine Funktion in die product_info.php geschrieben (ganz ans Ende), die direkt den Content nach dem Muster
    {get_catItems cat_id=4,22} absucht.

    Und es funktioniert sogar!!!
    Es können eine oder mehrere (kommagetrennt) KategorieIDs übergeben werden.

    Das ganze muss ich dann mal noch für MiniCMS-Seiten (Infocenter) einrichten, wo es ja eigentlich hin sollte!

    Bitte schaut mal rein, sicher finden sich da noch Probleme oder Optimierungsmöglichkeiten...

    Und fertig ist das natürlich auch noch nicht, toll wären Produktlinks mit Vorschaubild und Title-Tag etc. Wie macht man das am besten? Wird dafür ne Funktion bereitgestellt?

    Schönen Dank!

    Code: PHP  [Auswählen]
        /* ### BOF mcm - function get_catItems() ### */
        /* ### filtert aus Content den folgenden Code:  {get_catItems cat_id=4,22}   ### */  
        /* ### und ersetzt ihn mit Produkt-Linklisten der uebergebenen Kategorien   ### */      
        function get_catItems($contentText)         {
          $reg_muster = '/(\{get_catItems cat_id=)(?P<catId>.*)(\})/';
          if (preg_match ($reg_muster, $contentText, $treffer)) {                  
                $catId = htmlspecialchars($treffer['catId']);
                $db_query = xtc_db_query("select
                       ptc.products_id, pd.products_name
                       from
                         "
    .TABLE_PRODUCTS_TO_CATEGORIES." ptc,
                         "
    .TABLE_PRODUCTS_DESCRIPTION." pd
                       where
                        ptc.products_id=pd.products_id
                        and categories_id IN ($catId)
                        and pd.language_id = '"
    .(int) $_SESSION['languages_id']."'");
                 if (xtc_db_num_rows($db_query)) {
                    $linklist = '';
                    while($data=xtc_db_fetch_array($db_query,true)) {
                      $pid = $data['products_id'];
                      $g = xtc_product_link($pid);
                      $prodName = $data['products_name'];
                      $prodLink = xtc_href_link(FILENAME_PRODUCT_INFO, $g);
                      $linklist .= '<a href='.$prodLink.'>'.$prodName.'</a><br />';
                      }
                    if ($linklist != '') {
                      $linklist = '<div class="catLinkList">'.$linklist.'</div>';  
                      return preg_replace($reg_muster,$linklist,$contentText);
                    } else return preg_replace($reg_muster,'',$contentText);
                }                                      
                else return preg_replace($reg_muster,'',$contentText);
          }      
          else return  $contentText;
        }    
        /* ### EOF mcm - function get_catItems() ### */

    $product_info = get_catItems($product_info);   // mcm - suche nach '{get_catItems cat_id=xyz}'
    $smarty->assign('main_content', $product_info);
     

    hendrik

    • Experte
    • Beiträge: 2.038
    Re: Code zum Generieren von Produktlisten einer Kategorie
    Antwort #11 am: 03. November 2012, 17:44:01
    Das ist ein interessanter Lösungsweg. Gefällt mir. Merk ich mir mal.  :thumbs:

    Mit den Bildern kannst du folgendermaßen machen.

    Du erweiterst die Feldliste deines Select-Befehls noch um products_image.
    Code: PHP  [Auswählen]
                $db_query = xtc_db_query("select
                      ptc.products_id, pd.products_name, p.products_image
                      from
                        "
    .TABLE_PRODUCTS_TO_CATEGORIES." ptc,
                        "
    .TABLE_PRODUCTS_DESCRIPTION." pd,
                        "
    .TABLE_PRODUCTS." p
                      where
                       ptc.products_id=pd.products_id
                       p.products_id=pd.products_id
                       and categories_id IN ($catId)
                       and pd.language_id = '"
    .(int) $_SESSION['languages_id']."'");                      
     

    Das Image erhälst du so (innerhalb Schleife):

    Code: PHP  [Auswählen]
    $image = xtc_image(DIR_WS_THUMBNAIL_IMAGES.$data['products_image']);
    $linklist .= '<a href='.$prodLink.'>'.$image .'</a><br />';

    Gruß
    Hen
    (nicht getestet, wer Fehler entdeckt darf sie behalten)

    mcm

    • Mitglied
    • Beiträge: 151
    Re: Code zum Generieren von Produktlisten einer Kategorie
    Antwort #12 am: 03. November 2012, 22:18:32
    Super, das funktioniert!
    Vielen Dank für Eure schnelle und kompetente Hilfe.
    Hätte ich sonst nie hinbekommen!

    Nun erzeuge ich also mit der Eingabe z.B. des Codes
    Code: XML  [Auswählen]
    {get_catItems cat_id=4,22}
    in ein Inhaltsfeld (Editor) eine Link-Liste aller Artikel aus den Kategorien 4 sowie 22 (es geht natürlich auch nur eine).

    [ Für Gäste sind keine Dateianhänge sichtbar ]

    Zusätzlich wird noch eine Produktbild-Miniatur dargestellt, sowie die Artikel.Nr. (ich hab stattdessen nen Subtitel genommen). Für die Art.Nr. sollte noch der Text davor gesetzt werden, ich wusste aber nicht, wie ich den per PHP aufrufen kann.

    Die Funktion get_catItems($contentText) kann nun in eine externe Datei gelegt werden, welche dann per require_once in der ensprechenden Datei zur Erzeugung des Inhaltes geladen wird (in diesem Fall includes/modules/product_info.php).

    Hier muss die Funktion nur noch direkt vor der Übergabe auf den Inhalt angewendet werden:

    Also z.B. vor:
    Code: XML  [Auswählen]
    $smarty->assign('main_content', $product_info);

    Kommt nun noch:
    Code: XML  [Auswählen]
    $product_info = get_catItems($product_info);  // mcm - suche nach '{get_catItems cat_id=xyz}'
     

    Und hier die aktualisierte Funktion:
    Code: PHP  [Auswählen]
        /* ### BOF mcm - function get_catItems() ### */
        /* ### filtert aus Content den folgenden Code:  {get_catItems cat_id=4,22}   ### */  
        /* ### und ersetzt ihn mit Produkt-Linklisten der uebergebenen Kategorien   ### */      
        function get_catItems($contentText)         {
          $reg_muster = '/(\{get_catItems cat_id=)(?P<catId>.*)(\})/';
          if (preg_match ($reg_muster, $contentText, $treffer)) {                  
                $catId = htmlspecialchars($treffer['catId']);
                $db_query = xtc_db_query("select
                       ptc.products_id, pd.products_name, p.products_image, p.products_model
                       from
                         "
    .TABLE_PRODUCTS_TO_CATEGORIES." ptc,
                         "
    .TABLE_PRODUCTS_DESCRIPTION." pd,
                         "
    .TABLE_PRODUCTS." p
                       where
                        ptc.products_id = pd.products_id
                        AND pd.products_id = p.products_id
                        AND categories_id IN ($catId)
                        AND pd.language_id = '"
    .(int) $_SESSION['languages_id']."'");
                 if (xtc_db_num_rows($db_query)) {
                    $linklist = '';
                    while($data=xtc_db_fetch_array($db_query,true)) {
                      $pid = $data['products_id'];
                      $g = xtc_product_link($pid);
                      $prodName = $data['products_name'];
                      $prodName = preg_replace('/\|/',' ',$prodName); // mcm - intern: Titel-Trenner entfernen
                      $prodLink = xtc_href_link(FILENAME_PRODUCT_INFO, $g);
                      $prodModel = $data['products_model'];
                      $image = xtc_image(DIR_WS_THUMBNAIL_IMAGES.$data['products_image'], $prodName,'40','','style="float: left; margin: 0 0 5px -55px; padding: 0;"');
        $linklist .= '<a href="'.$prodLink.'" style="display: block; height: 40px; line-height:20px; clear: both;
        padding-left: 55px;">'
    .$image.$prodName.'<br />'.$prodModel.'</a>';
                     
                      //$linklist .= '<a href='.$prodLink.'>'.$prodName.'</a><br />';
                      }
                    if ($linklist != '') {
                      $linklist = '<span class="catLinkList">'.$linklist.'</span>';  
                      return preg_replace($reg_muster,$linklist,$contentText);
                    } else return preg_replace($reg_muster,'',$contentText);
                }                                      
                else return preg_replace($reg_muster,'',$contentText);
          }      
          else return  $contentText;
        }    
        /* ### EOF mcm - function get_catItems() ### */

    $product_info = get_catItems($product_info);  // mcm - suche nach '{get_catItems cat_id=xyz}'
    $smarty->assign('main_content', $product_info);
    ?>
     

    Wahrscheinlich werden momentan auch versteckte Produkte angezeigt, das sollte dann noch ausgeschlossen werden.
    Außerdem weiß ich nicht, ob die SessionID übergeben wird, wenn Cookies aus sind???
    Kann auch sein, dass das Skript die Seite etwas ausbremst, ich lege die Funktion aber nur auf Content-Seiten, da ist das nicht so schlimm.

    Fällt Euch sonst noch was auf?

    hendrik

    • Experte
    • Beiträge: 2.038
    Re: Code zum Generieren von Produktlisten einer Kategorie
    Antwort #13 am: 04. November 2012, 07:18:15
    Ja. Group_check fehlt noch (Das ist ein Zusatzmodul was aktivieren muß, default=off),
    fsk18-Filter sowie die, von dir richtig bemerkte, Statusabfrage.

    Füge noch folgenden Code ein. Oben:

    Code: PHP  [Auswählen]
     
    if (GROUP_CHECK == 'true') {
        $group_check = " and p.group_permission_".$_SESSION['customers_status']['customers_status_id']."=1 ";
      }
      //fsk18 lock
      $fsk_lock = '';
      if ($_SESSION['customers_status']['customers_fsk18_display'] == '0') {
      $fsk_lock = ' and p.products_fsk18!=1';
      }

     

    In die sql-Abfrage:
    Zitat
                                      and p.products_status = '1'
                                      ".$group_check."
                                      ".$fsk_lock."

    Vorlage siehe includes/modules/default.php, ungefähr ab Zeile 190.

    Gruß
    Hen

    johony

    • Neu im Forum
    • Beiträge: 16
    • Geschlecht:
    Re: Code zum Generieren von Produktlisten einer Kategorie
    Antwort #14 am: 04. November 2012, 11:43:21
    Tach,

    hatte mich vor einiger Zeit auch damit befasst Artikellisten in Contentseiten anzuzeigen, um ggf. Content-Seiten als Landing-Page darzustellen.

    Das Modul welches h-h-h erwähnt hat ist Top, Lässt sich einstellen das nur Artikel einer bestimmten Kategorie ausgelesen werden, nur Artikel mit Bild, nur Aktive Artikel etc ...
    Ich denke dies könnte dir helfen:
    http://www.gunnart.de/tipps-und-tricks/smarty-function-gunnartproductslist-fuer-xtcommerce/

    Oder du nutzt einfach die Gunnart-Product-List ;)
    Habe es so gelöst das die Content-Seite eine php.datei einbindet, welche die Funktion gunnartproductlist aufruft und die Artikel darstellt, bzw die php datei ist dann für die Komplette darstellung der Contentseite verantwortlich.
    Kannst dir folgenden Beitrag mal anschauen, die erklärung ist nicht so gut ... aber könnte dir das gern noch erläutern:
    http://www.modified-shop.org/forum/index.php?topic=22949.msg212424#msg212424

    gruß
    Hannes

    22 Antworten
    12113 Aufrufe
    19. Januar 2012, 22:08:36 von bige
    6 Antworten
    2946 Aufrufe
    19. Mai 2016, 16:24:37 von Tab
    5 Antworten
    3067 Aufrufe
    17. Juni 2010, 05:10:02 von jannemann