Tutorial: Zusätzliche Datenfelder Artikel (modified shop 106)
(by Hendrik Koch, 05.2015)
Überarbeitetes Tutorial für modified-Shop V1.06
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. 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.
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, 'style="width: 135px"'); ?></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:
Allerdings werden die Eingaben noch nicht gespeichert. Dazu muß die categories-Klasse leicht erweitert werden.
Datei admin/includes/classes/categories.php
Finde (oben):
define('ADD_PRODUCTS_FIELDS','products_manufacturers_model');
Ergänze zu:
define('ADD_PRODUCTS_FIELDS','products_manufacturers_model,products_author,products_isbn');
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 xtc5-Standardtemplate werden die neuen Datenfelder unterhalb von "Lieferzeit" platziert.
Datei templates/xtc4/module/product_info/product_info_v1_tabs.html
Datei templates/xtc4/module/product_info/product_info_v1.html
Datei templates/xtc4/module/product_info/product_info_v1_accordion.html
Finde:
<p class="productprice"><strong>{$PRODUCTS_PRICE}</strong></p>
<p class="taxandshippinginfo" style="white-space:nowrap">{$PRODUCTS_TAX_INFO}{if $PRODUCTS_SHIPPING_LINK}{$PRODUCTS_SHIPPING_LINK}{/if}</p>
{if $SHIPPING_NAME}<p class="shippingtime"><strong>{#text_shippingtime#}</strong>{if $SHIPPING_IMAGE}<img src="{$SHIPPING_IMAGE}" alt="{$SHIPPING_NAME}" />{/if} {$SHIPPING_NAME_LINK}</p>
{/if}
Füge an:
{* products_extrafields *}
<p class="shippingtime"><strong>{#text_products_author#}: </strong>{$PRODUCTS_AUTHOR}</p>
<p class="shippingtime"><strong>{#text_products_isbn#}: </strong>{$PRODUCTS_ISBN}</p>
Produktlisting[Bearbeiten]
Datei includes/modules/default.php
Finde:
$select .= 'p.products_manufacturers_model, ';
$listing_sql = "-- /includes/modules/default.php
SELECT ".$select."
p.products_id,
p.products_ean,
p.products_quantity,
p.products_shippingtime,
p.products_model,
p.products_image,
p.products_price,
p.products_discount_allowed,
p.products_weight,
p.products_tax_class_id,
p.manufacturers_id,
p.products_fsk18,
p.products_vpe,
p.products_vpe_status,
p.products_vpe_value,
pd.products_name,
pd.products_description,
pd.products_short_description
FROM ".TABLE_PRODUCTS_DESCRIPTION." pd
JOIN ".TABLE_PRODUCTS." p
".$from."
WHERE p.products_status = '1'
AND p.products_id = pd.products_id
AND pd.language_id = '".(int) $_SESSION['languages_id']."'
".$group_check."
".$fsk_lock."
".$where."
".$sorting;
Füge die Felder products_author und products_isbn ein.
$select .= 'p.products_manufacturers_model, ';
$listing_sql = "-- /includes/modules/default.php
SELECT ".$select."
p.products_id,
p.products_ean,
p.products_quantity,
p.products_shippingtime,
p.products_model,
p.products_author,
p.products_isbn,
p.products_image,
p.products_price,
p.products_discount_allowed,
p.products_weight,
p.products_tax_class_id,
p.manufacturers_id,
p.products_fsk18,
p.products_vpe,
p.products_vpe_status,
p.products_vpe_value,
pd.products_name,
pd.products_description,
pd.products_short_description
FROM ".TABLE_PRODUCTS_DESCRIPTION." pd
JOIN ".TABLE_PRODUCTS." p
".$from."
WHERE p.products_status = '1'
AND p.products_id = pd.products_id
AND pd.language_id = '".(int) $_SESSION['languages_id']."'
".$group_check."
".$fsk_lock."
".$where."
".$sorting;
Datei includes/classes/product.php
Finde:
$productData = array ('PRODUCTS_NAME' => $array['products_name'],
'COUNT' => isset($array['ID']) ? $array['ID'] : 0,
'PRODUCTS_ID'=> $array['products_id'],
'PRODUCTS_MODEL'=> isset($array['products_model']) ? $array['products_model'] : '',
Füge an:
// products_extrafield
'PRODUCTS_AUTHOR' => $array['products_author'],
'PRODUCTS_ISBN' => $array['products_isbn'],
Datei:
templates/xtc4/module/product_listing/product_listing_v1.html
Finde:
<p class="price">{$module_data.PRODUCTS_PRICE}</p><p class="taxandshippinginfo">( {$module_data.PRODUCTS_TAX_INFO}{$module_data.PRODUCTS_SHIPPING_LINK} )</p>
{if $module_data.PRODUCTS_VPE}<p class="vpe">{$module_data.PRODUCTS_VPE}</p>{/if}
{if $module_data.PRODUCTS_SHIPPING_NAME}<p class="shippingtime">{#text_shippingtime#}{if $module_data.PRODUCTS_SHIPPING_IMAGE}<img src="{$module_data.PRODUCTS_SHIPPING_IMAGE}" alt="{$module_data.PRODUCTS_SHIPPING_NAME}" />{/if}
{$module_data.PRODUCTS_SHIPPING_NAME_LINK}</p>
{/if}
Füge an:
{* products_extrafields *}
<p class="shippingtime"><strong>{#text_products_author#}: </strong>{$module_data.PRODUCTS_AUTHOR}</p>
<p class="shippingtime"><strong>{#text_products_isbn#}: </strong>{$module_data.PRODUCTS_ISBN}</p>
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 ('%".$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."%') " : '';
Füge an:
// products_extrafields
$where_str .= "OR p.products_author LIKE ('%".$keyword."%') ";
$where_str .= $ent_keyword ? "OR p.products_author LIKE ('%".$ent_keyword."%') " : '';
$where_str .= "OR p.products_isbn LIKE ('%".$keyword."%') ";
$where_str .= $ent_keyword ? "OR p.products_isbn LIKE ('%".$ent_keyword."%') " : '';
Nun werden die neuen Felder in der Suche im Frontend berücksichtigt.
Teil 2: Tutorial: Zusätzliche Datenfelder sprachabhängig (modified shop 106)