Contentseiten und Variablen in Artikelbeschreibungen

Thema wurde von Elmar, 4. Januar 2012 erstellt.

  1. Elmar
    Elmar Neues Mitglied
    Registriert seit:
    29. Dezember 2011
    Beiträge:
    3
    Danke erhalten:
    0
    Hat jemand eine Idee, wie ich in Artikelbeschreibungen Variablen (z.B. Kategorienamen, Artikelbezeichnungen) anzeigen, oder idealerweise sogar Contentseiten anzeigen kann, die ebenfalls diese Variablen enthalten.
    Grund: Ich habe viele Artikel, deren Beschreibung sich nur durch den Artikelnamen und die Kategorie unterscheiden, durch Attributsetzen läßt sich das aber nicht lösen.

    Gruß
    Elmar
     
  2. Anonymous
    Anonymous Erfahrener Benutzer
    Mitarbeiter
    Registriert seit:
    22. Juni 2011
    Beiträge:
    4.760
    Danke erhalten:
    1.749
    Danke vergeben:
    137
    Hallo,

    ich würde für diese Artikel einfach eine separate Vorlage für die Artikeldetailseite bauen (/templates/EyeCandy/module/products_info/standard.html kopieren und anpassen), in der statt {$PRODUCTS_DESCRIPTION} ein fester Text mit den entsprechenden Smarty-Variablen an den richtigen Stellen steht.
     
  3. Anonymous
    Anonymous Erfahrener Benutzer
    Registriert seit:
    14. Juli 2011
    Beiträge:
    997
    Danke erhalten:
    71
    Danke vergeben:
    131
    Können die Filter-Attribute zukünftig auch als Smarty Variablen verwendet werden. Ich denke da z.B. an einen 2. Reiter "Datenblatt" in der Artikelbeschreibung...
     
  4. Anonymous
    Anonymous Erfahrener Benutzer
    Registriert seit:
    14. Juli 2011
    Beiträge:
    997
    Danke erhalten:
    71
    Danke vergeben:
    131
    PUSH - Ich benötige ein Array von Filterwertepaaren. Z.B.: Farbe - blau; Diese möchte ich z.B. in einer Schleife per Smarty in HTML ausgeben... Ist das möglich?
     
  5. FMJ
    FMJ Aktives Mitglied
    Registriert seit:
    3. April 2012
    Beiträge:
    32
    Danke erhalten:
    4
    Danke vergeben:
    9
  6. Anonymous
    Anonymous Erfahrener Benutzer
    Registriert seit:
    14. Juli 2011
    Beiträge:
    997
    Danke erhalten:
    71
    Danke vergeben:
    131
    Optimal. Ja, genau das habe ich gesucht. Dann mache ich mich mal an die Arbeit...
     
  7. Anonymous
    Anonymous Erfahrener Benutzer
    Registriert seit:
    14. Juli 2011
    Beiträge:
    997
    Danke erhalten:
    71
    Danke vergeben:
    131
    So, für alle denen das interessiert:

    Die Filterdaten werden nun dynamisch ausgelesen und in der Artikelbeschreibung angezeigt.

    Hier das Ergebnis:
    (Link nur für registrierte Nutzer sichtbar.)

    Umsetzung:
    Unter /user_classes/overloads/ProductInfoContentView

    folgende Datei anlegen: fhu_ProductInfoContentView.inc.php

    Code:
    <?php
    class fhu_ProductInfoContentView extends fhu_ProductInfoContentView_parent
    {
      function get_html($p_coo_product, $p_current_category_id = 0)
      {
        $products_id=$p_coo_product->data['products_id'];
        if ($products_id)
        {
          $sql='
              SELECT fd.feature_admin_name, fvd.feature_value_text
            FROM feature_description fd, feature_value_description fvd, products_feature_value pfv, feature_value fv
            WHERE fd.feature_id = fv.feature_id
            AND fv.feature_value_id = fvd.feature_value_id
            AND fvd.feature_value_id = pfv.feature_value_id
            AND products_id='.$products_id;
          $res=xtc_db_query($sql);
          while ($products_features=xtc_db_fetch_array($res))
          {
               $this->set_content_data("KEY_".$products_features['feature_admin_name'], $products_features['feature_admin_name']);
            $this->set_content_data("VALUE_".$products_features['feature_admin_name'], $products_features['feature_value_text']);        
          }
        }
        return parent::get_html($p_coo_product, $p_current_category_id);
      }
    }
    ?>
    Die Variablen können jetzt z.B. in der standard.html (/templates/EyeCandy/module/product_info) ausgegeben werden:

    Code:
    <div class="info clearfix">
                    <div class="inside">
                        <h1>{$PRODUCTS_NAME}</h1>
                        <dl>
                        {if $KEY_Produktkategorie!='' and $VALUE_Produktkategorie!=''}
                            <dt>{$KEY_Produktkategorie}</dt>
                            <dd class="products_categorie">{$VALUE_Produktkategorie}</dd>
                        {/if}
                        {if $KEY_Hersteller!='' and $VALUE_Hersteller!=''}
                            <dt>Marke</dt>
                            <dd class="products_marke">{$VALUE_Hersteller}</dd>
                        {/if}
    ...............
    ....
    ..
    ...
    ..
    
    Der Feature Name muss dabei bekannt sein. Hier ist es z.B. Produktkategorie und Hersteller..

    Verbesserungsvorschläge sind gerne willkommen!

    Achso: anschließend tempate- und browsercache leeren!
     
  8. Anonymous
    Anonymous Erfahrener Benutzer
    Registriert seit:
    14. Juli 2011
    Beiträge:
    997
    Danke erhalten:
    71
    Danke vergeben:
    131
    Soo. Kann ein Filter mehrere Werte annehmen, werden diese jetzt komma-separiert ausgegeben.

    Umsetzung:
    Code:
    <?php
    
    class fhu_ProductInfoContentView extends fhu_ProductInfoContentView_parent
    {
      function get_html($p_coo_product, $p_current_category_id = 0)
      {
        $products_id=$p_coo_product->data['products_id'];
        if ($products_id)
        {
          $sql='
              SELECT fd.feature_admin_name, fvd.feature_value_text
            FROM feature_description fd, feature_value_description fvd, products_feature_value pfv, feature_value fv
            WHERE fd.feature_id = fv.feature_id
            AND fv.feature_value_id = fvd.feature_value_id
            AND fvd.feature_value_id = pfv.feature_value_id
            AND products_id='.$products_id;
          $res=xtc_db_query($sql);
          
          $feature_array = array();
         
         while(($products_features = xtc_db_fetch_array($res) )) 
         { 
             if (isset($feature_array["KEY_".$products_features['feature_admin_name']]) == false){
                $feature_array["KEY_".$products_features['feature_admin_name']] = $products_features['feature_admin_name']; 
                $feature_array["VALUE_".$products_features['feature_admin_name']] = $products_features['feature_value_text'];        
             } else {
                 $feature_array["VALUE_".$products_features['feature_admin_name']] = $feature_array["VALUE_".            $products_features['feature_admin_name']].", ".$products_features['feature_value_text'];                                 
             }
         } 
        
         foreach($feature_array as $key => $val){
            $this->set_content_data($key, $val);
         }                      
        }
        return parent::get_html($p_coo_product, $p_current_category_id);
      }
    }
    ?>
    
    Beispiel: Filter "Für wen" -> 2 Werte: Jungs, Mädchen
    (Link nur für registrierte Nutzer sichtbar.)

    Vielleicht hat ja jemand noch eine bessere Implementierung. Ohne Umweg über ein Zwischenarray...
     
  9. Avenger
    Avenger G-WARD 2012/13/14/15
    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Jetzt bist Du ja gar nicht mehr zu bremsen... :)

    Ich habe das mal etwas optimiert, und vor allem, "generisch" gemacht, d.h., man muss nicht mehr wissen, wie die Eigenschaftsnamen sind, und die definierte Sortierfolge der Eigenschaften wird berücksichtigt.

    Der PHP-Teil sieht dann so aus.

    PHP:
    <?php
    class fhu_ProductInfoContentView extends fhu_ProductInfoContentView_parent
    {
      function 
    get_html($p_coo_product$p_current_category_id 0)
      {
        
    $products_id=$p_coo_product->data['products_id'];
        if (
    $products_id)
        {
          
    $features = array();
          
    $sql='
            SELECT
              fd.feature_name,
              fvd.feature_value_text
            FROM
              feature_description fd,
              feature_value_description fvd,
              products_feature_value pfv,
              feature_value fv
            WHERE
              fd.feature_id = fv.feature_id AND
              fv.feature_value_id = fvd.feature_value_id AND
              fvd.feature_value_id = pfv.feature_value_id AND
              pfv.products_id='
    .$products_id.'
            ORDER BY
              fv.sort_order'
    ;
          
    $res=xtc_db_query($sql);
          while((
    $products_features xtc_db_fetch_array($res) ))
          {
            
    $feature_name=$products_features['feature_name'];
            if (
    $features[$feature_name])
            {
              
    $features[$feature_name].=', ';
            }
            
    $features[$feature_name].=$products_features['feature_value_text'];
          }
          
    $this->set_content_data('features'$features);
        }
        return 
    parent::get_html($p_coo_product$p_current_category_id);
      }
    }
    ?>
    Der HTML-Teil sieht dann so aus:

    PHP:
    {if $features|count>0}
    <
    dl id="products_features">
      {foreach 
    from=$features item=feature_value key=feature_name}
      <
    dt class="feature_name">{$feature_name}:</dt>
      <
    dd class="feature_value">{$feature_value}</dd>
      {/foreach}
    </
    dl>
    {/if}
    Dann noch ein wenig CSS dazu:

    PHP:
    #products_features {
      
    clear:both;
      
    margin-top20px;
      
    margin-bottom20px;
    }

    #products_features .feature_name,
    #products_features .feature_value {
      
    float:left;
      
    margin-bottom5px;
    }

    #products_features .feature_name {
      
    clearboth;
      
    font-weightbold;
      
    width120px;
    }
    und man bekommt so etwas wie im angefügten Bild...
     

    Anhänge:

  10. Anonymous
    Anonymous Erfahrener Benutzer
    Registriert seit:
    14. Juli 2011
    Beiträge:
    997
    Danke erhalten:
    71
    Danke vergeben:
    131
    Hi Avenger,

    danke für deinen Lösungsvorschlag. Diese Idee hatte ich zuerst auch. Aber ich möchte die Filterattribute zukünftig an unterschiedlichen Stellen abfragen und ggf. anzeigen. Beispielsweise um für das Attribut "Geschlecht" kleine Symbole für Mädchen und Jungs anzuzeigen und ähnliche Ideen. D.h. Ein Array mit allen Filtern ist in meinem Fall nicht sehr praktikabel und somit bevorzuge ich die nicht generische Lösung.
     
  11. Avenger
    Avenger G-WARD 2012/13/14/15
    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Nun, das kannst Du doch im Template immer noch tun...

    Meine Lösung leistet das gleiche wie Deine, nur effizienter und übersichtlicher...

    Statt jeden Key und Wert einzeln an das Template zu übergeben, wird das alles in einem Array an das Template übergeben.

    Dein Template-Beispiel würde dann z.B. so aussehen:

    PHP:
    {if $features|count>0}
    <
    dl id="products_features">
      {foreach 
    from=$features item=feature_value key=feature_name}
        {if 
    $feature_name=='Produktkategorie' and $feature_value!=''}
      <
    dt>{$feature_name}</dt>
      <
    dd class="feature_value">{$feature_value}</dd>
        {/if}
        {
    esleif $feature_name=='Hersteller' and $feature_value!=''}
      <
    dt>Marke</dt>
      <
    dd class="feature_value">{$feature_value}</dd>
        {else}  
      <
    dt>{$feature_name}</dt>
      <
    dd class="feature_value">{$feature_value}</dd>
        {/if}
      {/foreach}
    </
    dl>
    {/if}
    Wobei das natürlich nur dann wirklich so Sinn macht, wenn man für einen Eigenschaftswert z.B. ein Bild statt des Textes substituieren oder auch ausschließen will.

    Die Texte werden ja sonst generisch automatisch ausgegeben....

    m.E. sollte man solche Lösungen so flexibel wie möglich gestalten, und nicht von vorne herein zu speziell anlegen.
     
  12. Anonymous
    Anonymous Erfahrener Benutzer
    Registriert seit:
    14. Juli 2011
    Beiträge:
    997
    Danke erhalten:
    71
    Danke vergeben:
    131
    Ich hätte gerne folgende Reihenfolge:

    filter.JPG

    Wo werden die Daten gespeichert? Es handelt sich dabei nicht um die Spalte "sort_order" in der Tabelle "feature_value"
     
  13. Anonymous
    Anonymous Erfahrener Benutzer
    Registriert seit:
    14. Juli 2011
    Beiträge:
    997
    Danke erhalten:
    71
    Danke vergeben:
    131
    Habe es selbst herausgefunden. Die Daten werden in der Tabelle "categories_filter" gespeichert
     
  14. Anonymous
    Anonymous Erfahrener Benutzer
    Registriert seit:
    14. Juli 2011
    Beiträge:
    997
    Danke erhalten:
    71
    Danke vergeben:
    131
    #14 Anonymous, 15. April 2012
    Zuletzt bearbeitet: 15. April 2012
    Also hier nochmal der angepasste SQL Befehl mit Reihenfolge aus dem Adminbereich. Ausserdem ist ANSI JOIN ein klein wenig schneller:

    Code:
    SELECT fd.feature_admin_name, fvd.feature_value_text
    FROM feature_description fd
    INNER  JOIN feature_value fv ON ( fd.feature_id = fv.feature_id ) 
    INNER  JOIN feature_value_description fvd ON ( fv.feature_value_id = fvd.feature_value_id ) 
    INNER  JOIN products_feature_value pfv ON ( fvd.feature_value_id = pfv.feature_value_id ) 
    LEFT JOIN categories_filter cf ON ( cf.feature_id = fd.feature_id ) 
    WHERE products_id =1570
    ORDER  BY cf.sort_order
     
  15. Manni_HB
    Manni_HB G-WARD 2012/13/14/15
    Registriert seit:
    26. April 2011
    Beiträge:
    9.098
    Danke erhalten:
    1.540
    Danke vergeben:
    909
    Ort:
    Bremen
    Hai Avenger,
    wie kann ich außerhalb der "foreach" einzelne Werte abfragen/anzeigen?
    Der "IchStehAufmSchlauchFaktor" hat mich grad voll im Griff! :(
     
  16. Avenger
    Avenger G-WARD 2012/13/14/15
    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Das müsste eigentlich mit

    PHP:
    $features.feature_name
    funktionieren....

    z.B. $features.Farbe, wenn "Farbe" eine Eigenschaft ist...
     
  17. Manni_HB
    Manni_HB G-WARD 2012/13/14/15
    Registriert seit:
    26. April 2011
    Beiträge:
    9.098
    Danke erhalten:
    1.540
    Danke vergeben:
    909
    Ort:
    Bremen
    Wie könnte man sie denn zusätzlich z.B. in der "...\templates\EyeCandy\module\product_listing\product_listing_v1.html" ausgeben?
     
  18. Anonymous
    Anonymous Erfahrener Benutzer
    Registriert seit:
    14. Juli 2011
    Beiträge:
    997
    Danke erhalten:
    71
    Danke vergeben:
    131
    Hierzu muss die Funktion buildDataArray in der product.php (includes/classes) erweitert werden. D.h. das SQL erweitern und das Rückgabearray füllen
     
  19. Avenger
    Avenger G-WARD 2012/13/14/15
    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Ja, gute Idee.....

    Folgenden Code als "user_classes\overloads\product\pt_features_product.inc.php" speichern

    PHP:
    <?php
    /*
       Copyright (c) 2012 Avenger, entwicklung@powertemplate.de
       Overload class for method "buildDataArray" of "product" class.

       Store as "user_classes\overloads\product\pt_features_product.inc.php"
    */

    class pt_features_product extends pt_features_product_parent
    {
      function 
    buildDataArray(&$array,$image='thumbnail')
      {
        
    $template_data=parent::buildDataArray($array,$image);
        
    $products_id=$array['products_id'];
        if (
    $products_id)
        {
          
    $features = array();
          
    $sql='
            SELECT DISTINCT
              fd.feature_name,
              fvd.feature_value_text
            FROM
              feature_description fd
                INNER JOIN feature_value fv ON ( fd.feature_id = fv.feature_id )
                INNER JOIN feature_value_description fvd ON ( fv.feature_value_id = fvd.feature_value_id )
                INNER JOIN products_feature_value pfv ON ( fvd.feature_value_id = pfv.feature_value_id )
                LEFT JOIN categories_filter cf ON ( cf.feature_id = fd.feature_id )
            WHERE
              pfv.products_id ='
    .(int)$products_id.'
            ORDER BY
              cf.sort_order'
    ;
          
    $res=xtc_db_query($sql);
          if (
    xtc_db_num_rows($res)>0)
          {
            
    $features=array();
            while((
    $products_features xtc_db_fetch_array($res) ))
            {
              
    $feature_name=$products_features['feature_name'];
              if (
    $features[$feature_name])
              {
                
    $features[$feature_name].=', ';
              }
              
    $features[$feature_name].=$products_features['feature_value_text'];
            }
            
    $template_data['PRODUCTS_FEATURES']=$features;
          }
        }
        return 
    $template_data;
      }
    }
    ?>
    Der Template-Teil sollte dann so aussehen:

    PHP:
    {if $module_data.PRODUCTS_FEATURES|count>0}
    <
    dl class="products_features">
      {foreach 
    from=$module_data.PRODUCTS_FEATURES item=feature_value key=feature_name}
      <
    dt class="feature_name">{$feature_name}:</dt>
      <
    dd class="feature_value">{$feature_value}</dd>
      {/foreach}
    </
    dl>
    {/if}
     
  20. Manni_HB
    Manni_HB G-WARD 2012/13/14/15
    Registriert seit:
    26. April 2011
    Beiträge:
    9.098
    Danke erhalten:
    1.540
    Danke vergeben:
    909
    Ort:
    Bremen
    Hallo Avenger,

    wie beschrieben eingebaut erscheint diese Meldung:
    Parse error: syntax error, unexpected T_STRING, expecting '{' in /www/htdocs/XXXXXXX/_testshop/system/core/ClassOverloadRegistry.inc.php(131) : eval()'d code on line 1

    Fatal error: Class 'pt_features_product_parent' not found in /www/htdocs/XXXXXXX/_testshop/user_classes/overloads/product/pt_features_product .inc.php on line 9