Tutorial: Zusätzliche Datenfelder Artikel

Aus Wiki | modified eCommerce Shopsoftware
Zur Navigation springenZur Suche springen

(by Hendrik Koch, 10.2009, Dies ist ein veralteter Text. Überarbeitete Version: Tutorial: Zusätzliche Datenfelder Artikel (modified shop 106))

Ein typisches Teilproblem vieler Projektarbeiten ist das Hinzufügen von weiteren Daten in die Artikeldatenbank. Der vorliegende Text beschreibt anhand eines typischen Problems beispielhaft die Vorgehensweise.

Ein Shop verkauft Bücher. Jedes Buch hat einen Autor und eine ISBN Nummer. Diese Daten sollen in eigenen Datenfeldern im Backend erfasst und im Frontend, in der Artikeldetailansicht sowie der Artikelliste, an definierter Stelle dargestellt werden.

Datenbank erweitern[Bearbeiten]

Die Datenbanktabelle products wird um 2 Text-Datenfelder erweitert.

products_isbn (varchar, 30 Zeichen)
products_author (varchar, 80 Zeichen)

Mit phpmyadmin folgende SQL-Anweisung ausführen:

ALTER TABLE `products` 
ADD `products_isbn` VARCHAR( 30 ) NOT NULL ,
ADD `products_author` VARCHAR( 80 ) NOT NULL;

Backend Eingabe[Bearbeiten]

Die Artikeladministration wird um die Eingabefelder Autor und ISBN erweitert. Direkt unter EAN.

Products extrafield 1.png

Bevor der Programmcode geändert wird, werden in den Sprachdefinitionen die Worte „Autor“ und „ISBN“ abgelegt um die Mehrsprachigkeit des Systems zu gewährleisten.

lang/german/admin/categories.php
Füge ein:

// products_extrafield
define('TEXT_PRODUCTS_AUTHOR','Autor');
define('TEXT_PRODUCTS_ISBN',  'ISBN');
  

lang/english/admin/categories.php
Füge ein:

// products_extrafield
define('TEXT_PRODUCTS_AUTHOR','Author');
define('TEXT_PRODUCTS_ISBN',  'ISBN');

ggf. weitere Sprachen.

Nun der Patch der Artikeleingabe.
Datei admin/includes/modules/new_product.php
Finde:

      <tr>
        <td><span class="main"><?php echo TEXT_PRODUCTS_EAN; ?></span></td>
        <td><span class="main"><?php echo  xtc_draw_input_field('products_ean', $pInfo->products_ean); ?></span></td>
      </tr>

Füge an:

      <!-- products_extrafield beginn -->
      <tr>
        <td><span class="main"><?php echo TEXT_PRODUCTS_AUTHOR; ?></span></td>
        <td><span class="main"><?php echo  xtc_draw_input_field('products_author', $pInfo->products_author); ?></span></td>
      </tr>
      <tr>
        <td><span class="main"><?php echo TEXT_PRODUCTS_ISBN; ?></span></td>
        <td><span class="main"><?php echo  xtc_draw_input_field('products_isbn', $pInfo->products_isbn); ?></span></td>
      </tr>
      <!-- products_extrafield end -->

Die neuen Eingabefelder erscheinen ab nun:

Products extrafield 2.png

Allerdings werden die Eingaben noch nicht gespeichert. Dazu muß die categories-Klasse leicht erweitert werden.

Datei admin/includes/classes/categories.php

ACHTUNG: ab modified 1.06 ist nur diese Änderung nötig:
Hinzufügen der neuen Datenbankfelder bei ADD_PRODUCTS_FIELDS (kommagetrennt), in ca. Zeile 38:

    define('ADD_PRODUCTS_FIELDS','products_manufacturers_model,products_author,products_isbn');


Die folgenden Änderungen in der Datei admin/includes/classes/categories.php müssen nur bis einschließlich modified 1.05 SP1d durchgeführt werden!

Finde (Zeile 502 ca):

    $sql_data_array = array ('products_quantity' => xtc_db_prepare_input($products_data['products_quantity']), 
                               ........usw...usw.....

Die gleiche Zeile etwas übersichtlicher formatiert:

    $sql_data_array = array (
      'products_quantity' => xtc_db_prepare_input($products_data['products_quantity']), 
      'products_model' => xtc_db_prepare_input($products_data['products_model']), 
      'products_ean' => xtc_db_prepare_input($products_data['products_ean']), 
      'products_price' => xtc_db_prepare_input($products_data['products_price']), 
      'products_sort' => xtc_db_prepare_input($products_data['products_sort']), 
      'products_shippingtime' => xtc_db_prepare_input($products_data['shipping_status']), 
      'products_discount_allowed' => xtc_db_prepare_input($products_data['products_discount_allowed']), 
      'products_date_available' => $products_date_available, 
      'products_weight' => xtc_db_prepare_input($products_data['products_weight']), 
      'products_status' => $products_status, 
      'products_startpage' => xtc_db_prepare_input($products_data['products_startpage']), 
      'products_startpage_sort' => xtc_db_prepare_input($products_data['products_startpage_sort']), 
      'products_tax_class_id' => xtc_db_prepare_input($products_data['products_tax_class_id']), 
      'product_template' => xtc_db_prepare_input($products_data['info_template']), 
      'options_template' => xtc_db_prepare_input($products_data['options_template']), 
      'manufacturers_id' => xtc_db_prepare_input($products_data['manufacturers_id']), 
      'products_fsk18' => xtc_db_prepare_input($products_data['fsk18']), 
      'products_vpe_value' => xtc_db_prepare_input($products_data['products_vpe_value']), 
      'products_vpe_status' => xtc_db_prepare_input($products_data['products_vpe_status']), 
      'products_vpe' => xtc_db_prepare_input($products_data['products_vpe']));

Einfügung der markierten Zeilen Autor und ISBN:

    $sql_data_array = array (
      'products_quantity' => xtc_db_prepare_input($products_data['products_quantity']), 
      'products_model' => xtc_db_prepare_input($products_data['products_model']), 
      'products_ean' => xtc_db_prepare_input($products_data['products_ean']), 

      // products_extrafield
      'products_author' => xtc_db_prepare_input($products_data['products_author']), 
      'products_isbn' => xtc_db_prepare_input($products_data['products_isbn']), 

      'products_price' => xtc_db_prepare_input($products_data['products_price']), 
      'products_sort' => xtc_db_prepare_input($products_data['products_sort']), 
      'products_shippingtime' => xtc_db_prepare_input($products_data['shipping_status']), 
      'products_discount_allowed' => xtc_db_prepare_input($products_data['products_discount_allowed']), 
      'products_date_available' => $products_date_available, 
      'products_weight' => xtc_db_prepare_input($products_data['products_weight']), 
      'products_status' => $products_status, 
      'products_startpage' => xtc_db_prepare_input($products_data['products_startpage']), 
      'products_startpage_sort' => xtc_db_prepare_input($products_data['products_startpage_sort']), 
      'products_tax_class_id' => xtc_db_prepare_input($products_data['products_tax_class_id']), 
      'product_template' => xtc_db_prepare_input($products_data['info_template']), 
      'options_template' => xtc_db_prepare_input($products_data['options_template']), 
      'manufacturers_id' => xtc_db_prepare_input($products_data['manufacturers_id']), 
      'products_fsk18' => xtc_db_prepare_input($products_data['fsk18']), 
      'products_vpe_value' => xtc_db_prepare_input($products_data['products_vpe_value']), 
      'products_vpe_status' => xtc_db_prepare_input($products_data['products_vpe_status']), 
      'products_vpe' => xtc_db_prepare_input($products_data['products_vpe']));

Damit auch das Duplizieren von Artikeln vollständig klappt muß noch eine zweite Stelle gepatcht werden.

Finde (Zeile 743 ca.)

    $sql_data_array=array('products_quantity'=>$product['products_quantity'],
            'products_model'=>$product['products_model'],
            'products_ean'=>$product['products_ean'],
            'products_shippingtime'=>$product['products_shippingtime'],
            'products_sort'=>$product['products_sort'],
            'products_startpage'=>$startpage,
            'products_sort'=>$product['products_sort'],
            'products_price'=>$product['products_price'],
            'products_discount_allowed'=>$product['products_discount_allowed'],
            'products_date_added'=>'now()',
            'products_date_available'=>$product['products_date_available'],
            'products_weight'=>$product['products_weight'],
            'products_status'=>$products_status,
            'products_tax_class_id'=>$product['products_tax_class_id'],
            'manufacturers_id'=>$product['manufacturers_id'],
            'product_template'=>$product['product_template'],
            'options_template'=>$product['options_template'],
            'products_fsk18'=>$product['products_fsk18'],
            );

Füge markierte Zeilen ein:

    $sql_data_array=array('products_quantity'=>$product['products_quantity'],
            'products_model'=>$product['products_model'],
            'products_ean'=>$product['products_ean'],

            // products_extrafield
            'products_author'=>$product['products_author'],
            'products_isbn'=>$product['products_isbn'],

            'products_shippingtime'=>$product['products_shippingtime'],
            'products_sort'=>$product['products_sort'],
            'products_startpage'=>$startpage,
            'products_sort'=>$product['products_sort'],
            'products_price'=>$product['products_price'],
            'products_discount_allowed'=>$product['products_discount_allowed'],
            'products_date_added'=>'now()',
            'products_date_available'=>$product['products_date_available'],
            'products_weight'=>$product['products_weight'],
            'products_status'=>$products_status,
            'products_tax_class_id'=>$product['products_tax_class_id'],
            'manufacturers_id'=>$product['manufacturers_id'],
            'product_template'=>$product['product_template'],
            'options_template'=>$product['options_template'],
            'products_fsk18'=>$product['products_fsk18'],
            );


Das Backend ist soweit fertig. Autor und ISBN können eingegeben und gespeichert werden.

Frontend[Bearbeiten]

Die neuen Datenfelder sollen auf der Artikeldetailseite (products_info) platziert werden.

Zuerst wieder eine Definition in den Sprachdateien für die Textvorsätze „Autor“ und „ISBN“.

Datei lang/german/lang_german.conf
Füge am Beginn ein:

/* products_extrafield */
text_products_author = 'Autor'
text_products_isbn = 'ISBN'

sowie Datei lang/english/lang_english.conf
Füge am Beginn ein:

/* products_extrafield */
text_products_author = 'Author'
text_products_isbn = 'ISBN'

ggf. weitere Sprachen


Nun die Platzhalter für den Templategenerator definieren.
Datei includes/modules/product_info.php

Finde:

  $info_smarty->assign('PRODUCTS_MODEL', $product->data['products_model']);
  $info_smarty->assign('PRODUCTS_EAN', $product->data['products_ean']);

Füge an:

  // products_extrafield
  $info_smarty->assign('PRODUCTS_AUTHOR', $product->data['products_author']);
  $info_smarty->assign('PRODUCTS_ISBN', $product->data['products_isbn']);


Zuletzt die Anpassung des Templates. Im xtc4-Standardtemplate werden die neuen Datenfelder unterhalb von "Lieferzeit" platziert.

Products extrafield 3.png

Datei templates/xtc4/module/product_info/product_info_v1.html

Finde:

              <tr valign="middle">
                <td class="main">{#text_shippingtime#}</td>
                {if $SHIPPING_IMAGE}<td><img src="{$SHIPPING_IMAGE}" alt="{$SHIPPING_NAME}" /></td>
                {/if}
                <td class="main">{$SHIPPING_NAME}</td>
              </tr>

Füge an:

              <tr valign="middle">
                <td class="main">{#text_products_author#}</td>
                <td class="main">{$PRODUCTS_AUTHOR}</td>
              </tr>
              <tr valign="middle">
                <td class="main">{#text_products_isbn#}</td>
                <td class="main">{$PRODUCTS_ISBN}</td>
              </tr>

Products extrafield 4.png

Produktlisting[Bearbeiten]

Datei includes/modules/default.php

Finde 4 Zeilen beginnend mit "$listing_sql = "select ...usw..."
hinter: "p.products_ean,"
Füge ein:

                                 p.products_author,
                                 p.products_isbn,

(Diese Einfügung ist an 4 an Stellen vorzunehmen, also insgesamt 4 mal!)


Datei includes/classes/product.php

Finde:

		return array ('PRODUCTS_NAME' => $array['products_name'], 
				'COUNT'=>$array['ID'],
				'PRODUCTS_ID'=>$array['products_id'],
        'PRODUCTS_VPE' => $this->getVPEtext($array, $products_price['plain']),

Füge an:

        // products_extrafield
        'PRODUCTS_AUTHOR' => $array['products_author'],
        'PRODUCTS_ISBN' => $array['products_isbn'],


Dateien:
templates/xtc4/module/product_listing/product_listing_v1.html
und
templates/xtc4/module/product_listing/_product_listing_v1.html

Finde:

            {if $module_data.PRODUCTS_VPE}<br />{$module_data.PRODUCTS_VPE}{/if}

Füge an:

            {* ----- products_extrafield ----- *}
            <br />{#text_products_author#}:{$module_data.PRODUCTS_AUTHOR}
            <br />{#text_products_isbn#}:{$module_data.PRODUCTS_ISBN}

Products extrafield 5.png

Produktsuche Listing[Bearbeiten]

Datei advanced_search_results.php
Finde:

	//build query
	$select_str = "SELECT distinct
	                  p.products_id,
	                  p.products_price,
	                  p.products_model,

Füge an:

                    p.products_author,
                    p.products_isbn,


Suche in den neuen Datenfeldern[Bearbeiten]

Datei advanced_search_results.php, Zeile 221 ca. Finde:

  $where_str .= "OR pd.products_name LIKE ('%".addslashes($search_keywords[$i])."%') ";
  $where_str .= "OR p.products_model LIKE ('%".addslashes($search_keywords[$i])."%') ";

Füge an:

  $where_str .= "OR p.products_author LIKE ('%".addslashes($search_keywords[$i])."%') ";
  $where_str .= "OR p.products_isbn LIKE ('%".addslashes($search_keywords[$i])."%') ";

Nun werden die neuen Felder in der Suche im Frontend berücksichtigt.

           
anything