Tutorial: Zusätzliche Datenfelder Artikel (modified shop 106)

Aus Wiki | modified eCommerce Shopsoftware
Zur Navigation springenZur Suche springen

(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.

New datefields106 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, '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:

New datefields106 2.png

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.

New datefields106 3.png

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>

New datefields106 4.png

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>

New datefields106 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 ('%".$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)

           
anything