Der Grund meines heutigen Beitrages ist mal nicht ein Problem, sondern das folgende Modul von Andreas Guder (http://www.andreas-guder.de/agi-softwar ... maerz.html) welches ich Euch hiermit vorstellen möchte. Die folgende Version (bis 1000 Artikel) habe ich von Herrn Guder komplett auf Webs umbauen lassen und seine Genehmigung erhalten, dieses hier öffentlich anbieten zu dürfen. Es gibt noch eine Primium Version, die noch zusätzliche Features enthält und für Shops über 1000 Artikel benötigt wird. Diese kann ebenfalls bei Herrn Guder (siehe Link oben) bezogen werden.
Nun aber alles von Beginn. Was genau macht oder kann dieses Modul?
Seit einiger Zeit bietet Google für Shopbesitzer eine neue Möglichkeit, Bilder und Preise direkt in die Suchabfragen zu integrieren. Ein Beispiel: Gebe ich die Suchbegriffe "la mer ultra" ein, erhalte ich folgende Anzeige von Google
Wie Ihr im Bild oben seht, werden nun gleich vier meiner Produkte aus dem Shop sehr übersichtlich präsentiert. Bei einem Klick auf ein jeweiliges Produkt, landet der Kunde also direkt auf der Produkteseite des jeweiligen Artikels.
Das ist nun die bildliche Beschreibung dieses Moduls. Doch was macht dieses genau?
Dieses Modul überträgt Produkte in einem XML-Datenfeed in das Google-Merchant-Center. Einmal eingerichtet, kann die URL des Datenfeeds im Google-Merchant-Center hinterlegt werden, worauf Google diesen regelmässig abrufen wird. D.h. Ihr müsst Euch um nichts mehr kümmern. Egal ob Ihr neue Produkte, Aktionen, andere Staffelpreise, ein anderes Bild etc. erfasst, der Feed wird automatisch innert vorgegebener Zeit (in der Regel innert 24h) automatisch angepasst. Der manuelle Upload entfällt also vollständig.
Die wichtigsten Features
Vorbereitet für die Produkt-Feed-Spezifikation gültig ab Juli 2013
Das Modul ist angepasst an die Google-Produkt-Feed-Spezifikation gültig am Juli 2013.
Neue Eigenschaften wie „Kennzeichnung existiert“, „Nicht jugendfrei“, „Energieeffizienzklasse“ und die Grundpreis-Eigenschaften wurden ergänzt.
Google-Kategorien, Google-Taxonomie
In einem separaten Menüpunkt könnt Ihr alle benötigten Google-Kategorien speichern. Aus dieser Auswahl an Kategorien wird eine dynamische Liste erzeugt, welche im Admin-Bereich am Produkt und den Shop-Kategorien angezeigt wird. Durch anklicken eines Listenpunktes wird dem Produkt bzw. der Shop-Kategorie eine Google-Kategorie zuordnet. Das Modul arbeitet rekursiv. Beim erstellen des Datenfeeds wird geprüft, ob dem Produkt eine Google-Kategorie zugeordnet ist. Ist dies nicht der Fall, wird die Shop-Kategorie des Produktes auf eine Google-Kategorie geprüft. Ist dieser auch keine Google-Kategorie zugeordnet, wird in der nächst höheren Shop-Kategorie danach geschaut. Ist die oberste Ebene erreicht und noch immer keine Google-Kategorie gefunden, wird eine zuvor festgelegte Standard-Kategorie exportiert. Die verfügbaren Google-Kategorien findet Ihr hier: http://www.google.com/basepages/product ... .de-DE.txt
Verfügbarkeit
Produkte können als „immer Verfügbar“ exportiert werden, oder Anhand der verfügbaren Anzahl als verfügbar oder nicht verfügbar.
Pagination, große Datenfeeds
Sollte Dein Server nicht in der Lage sein, Aufgrund der Anzahl an Produkten, den kompletten Feed zu erstellen, lässt sich dieser automatisch in mehrere Feeds aufteilen.
Dafür steht der Parameter „page=x“ zur Verfügung. Je Seite/Feed werden per default 5000 Produkte ausgegeben. Die Anzahl an Produkte je Seite kann individuell im Script angepasst werden.
Caching, Zwischenspeicher
Um die Serverlast zu reduzieren und den Feed nicht bei jedem Aufruf neu erstellen zu lassen, wird dieser für mindestens 24 Stunden zwischengespeichert. In der Premium-Version erfolgt gzip-komprimiert. Die Caching-Funktion kann auch genutzt werden, um den Feed noch vor den Google-Aufrufen per Cronjob erstellen zu lassen, sodass Google beim Aufruf der URL bereits die zwischengespeicherte Version erhält, was die Übertragungszeit verringert.
Das Modul funktioniert auch in der Schweiz.
Weitere Informationen oder die Premium Version erhält Ihr auch direkt auf der Seite von Herrn Guder http://www.andreas-guder.de/agi-softwar ... maerz.html
OK, dann geht's nun an den Einbau
Hinweise:
=======================
Legt vor dem Einbau, von allen zu ändernden Dateien eine Sicherungskopie an!
Das Verzeichnis /export/ muss beschreibbar sein und darf nicht etwa durch die .htaccess Datei gesperrt werden.
Die Datei /admin/google_taxonomie.php erfordert PHP Version 5
Solltet Ihr noch eine tiefere Version laufen haben, geht bitte auf die Seite von Herrn Guder und zieht Euch ein aktuelles Installations-Paket. Dort findet Ihr auch eine Version für PHP 4. Die Datei /admin/google_taxonomie.php.fuer-php-4.php muss dann allerdings entsprechend angepasst werden, da die Änderungen für Webs in der Datei google_taxonomie.php gemacht wurden.
Ok, dann mal los
Erstellt die folgenden, neuen Dateien und legt diese in den angegebenen Verzeichnissen Eures Shops ab:
/admin/google_taxonomie.php
Code: Alles auswählen
<?php
/* admin/google_taxonomie.php
.---------------------------------------------------------------------------.
| Software: GOOGLE-Shopping XML-Export for modified-shops and xt:c 3 |
| Author: Andreas Guder |
| Version: 1 |
| Contact: info@andreas-guder.de / http://www.andreas-guder.de |
| Copyright (c) 2013, Andreas Guder [info@andreas-guder.de] |
| GNU General Public License |
'--------------------------------------------------------------------------�'
*/
require('includes/application_top.php');
class GOOGLE_TAXONOMIE
{
private $taxonomie_array = array();
private $taxonomie_file = array();
/**
* @param string path to google-taxonomieflile
*/
public function __construct($file)
{
if (file_exists($file))
{
$this->taxonomie_file = file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
}
$this->file_to_array();
}
/**
* create $taxonomie_array from $taxonomie_file
*/
private function file_to_array()
{
foreach ($this->taxonomie_file as $row)
{
$is_empty = preg_replace('/\s/', '', $row);
if (empty($is_empty))
continue;
$google_cats = explode('>',$row);
$ref = &$this->taxonomie_array;
foreach ($google_cats as $category)
{
$check_cat = trim($category);
if (array_key_exists($check_cat, $ref))
{
$ref = &$ref[$check_cat];
}
else
{
$ref[$check_cat] = array();
$ref = &$ref[$check_cat];
}
}
}
}
/**
* create json-string of given array
* @param array $array: array to create json from
* @param array $child_path: child-elements of the given array
* @return string
*/
private function array_to_json($array, $child_path = array())
{
$string = '';
$count = 0;
foreach($array as $key => $value)
{
$add_child_path = $child_path;
$add_child_path[] = $key;
if($count > 0)
$string .= ',';
$string .= '"'.rawurlencode($key).'":{';
$string .= '"string":"'.rawurlencode(implode(' > ', $add_child_path)).'"';
if (!empty($value))
{
$string .= ',"childs":{';
$string .= $this->array_to_json($value, $add_child_path);
$string .= '}';
}
$string .= '}';
$count++;
}
return $string;
}
/**
* public function to handle json-string (save to file or return as string
* @param string $save_path: path (and name) of file to create, or empty to return string only
* @param string $wrap: string to wrap the json-string use "%s" for explode
* @return mixed string/bool
*/
public function taxonomie_to_json($save_path = '', $wrap = 'var g_taxonimie = eval(%s)')
{
$string = '';
$wrap_explode = !empty($wrap) ? explode('%s',$wrap) : array('','');
if ($wrap_explode[0])
$string .= $wrap_explode[0];
$string .= '{';
$string .= '"string":""';
$string .= ',"childs":{';
$string .= $this->array_to_json($this->taxonomie_array);
$string .= '}}';
if ($wrap_explode[1])
$string .= $wrap_explode[1];
if (empty($save_path))
return $string;
else
{
// try to write file
if ($fp = fopen($save_path, 'w'))
{
fwrite($fp, $string);
fclose($fp);
return true;
}
else
return false;
}
}
}
define('FILENAME_AGI_GOOGLE_TAXONOMIE','google_taxonomie.php');
$print_error = array();
switch ($_GET['action']) {
case 'save':
if ($fp = fopen(DIR_FS_DOCUMENT_ROOT.'export/google_taxonomie.txt', 'w'))
{
fwrite($fp, $_POST['google_cats']);
fclose($fp);
if (file_exists(DIR_FS_DOCUMENT_ROOT.'export/google_taxonomie.txt'))
{
$google = new GOOGLE_TAXONOMIE(DIR_FS_DOCUMENT_ROOT.'export/google_taxonomie.txt');
$success = $google->taxonomie_to_json(DIR_FS_DOCUMENT_ROOT.'export/google_taxonomie.json.js');
if (!$success)
$print_error[] = 'google_taxonomie.json.js konnte nicht erstellt werden';
}
xtc_redirect(FILENAME_AGI_GOOGLE_TAXONOMIE);
}
else
$print_error[] = 'google_taxonomie.txt konnte nicht erstellt werden';
break;
}
// get file_information
$google_text = 'not available';
$google_json = 'not available';
$google_file = '';
if (file_exists(DIR_FS_DOCUMENT_ROOT.'export/google_taxonomie.txt'))
{
$info = filemtime(DIR_FS_DOCUMENT_ROOT.'export/google_taxonomie.txt');
$google_text = 'Date: '.date('Y-m-d H:i',$info);
if (!is_writable(DIR_FS_DOCUMENT_ROOT.'export/google_taxonomie.txt'))
$google_text .= ' NOT writable, please ask your administrator';
$google_file = file_get_contents(DIR_FS_DOCUMENT_ROOT.'export/google_taxonomie.txt');
}
if (file_exists(DIR_FS_DOCUMENT_ROOT.'export/google_taxonomie.json.js'))
{
$info = filemtime(DIR_FS_DOCUMENT_ROOT.'export/google_taxonomie.json.js');
$google_json = 'Date: '.date('Y-m-d H:i',$info);
if (!is_writable(DIR_FS_DOCUMENT_ROOT.'export/google_taxonomie.json.js'))
$google_json .= ' NOT writable, please ask your administrator';
}
?>
<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
<html <?php echo HTML_PARAMS; ?>>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=<?php echo $_SESSION['language_charset']; ?>">
<title><?php echo TITLE; ?></title>
<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
<script type="text/javascript" src="includes/general.js"></script>
</head>
<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF">
<!-- header //-->
<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
<!-- header_eof //-->
<!-- body //-->
<table border="0" width="100%" cellspacing="2" cellpadding="2">
<tr>
<td class="columnLeft2" width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
<!-- left_navigation //-->
<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
<!-- left_navigation_eof //-->
</table></td>
<!-- body_text //-->
<td class="boxCenter" width="100%" valign="top">
<table border="0" width="100%" cellspacing="0" cellpadding="0">
<tr>
<td>
<table border="0" width="100%" cellspacing="0" cellpadding="0">
<tr>
<td width="80" rowspan="2"><?php echo xtc_image(DIR_WS_ICONS.'heading_news.gif'); ?></td>
<td class="pageHeading">Google Taxonomie</td>
</tr>
<tr>
<td class="main" valign="top"><a href="http://www.andreas-guder.de" onClick="window.open(this.href,'_blank',''); return false;">AGI - Internetagentur Andreas Guder</a></td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="main">
<table class="infoBoxHeading" width="100%">
<tr>
<td width="250">export/google_taxonomie.txt</td>
<td><?php echo $google_text; ?></td>
</tr>
<tr>
<td width="250">export/google_taxonomie.json.js</td>
<td><?php echo $google_json; ?></td>
</tr>
<tr>
<td width="250">Google taxonomy.de-DE.txt</td>
<td><a href="http://www.google.com/basepages/producttype/taxonomy.de-DE.txt" onClick="window.open(this.href,'_blank',''); return false;">http://www.google.com/basepages/producttype/taxonomy.de-DE.txt</a></td>
</tr>
</table>
<table width="100%" border="0" cellspacing="5" cellpadding="0">
<tr>
<td class="pageHeading">Google-Taxonomie-Datei:</td>
</tr>
<tr>
<td class="dataTableHeadingContent">
<?php
echo xtc_draw_form('google_taxonomie',FILENAME_AGI_GOOGLE_TAXONOMIE,'action=save','POST');
echo xtc_draw_textarea_field('google_cats','', 60, 30, $google_file, 'style="width: 90%"');
echo '<br/><input type="submit" class="button" onClick="this.blur();" value="' . BUTTON_SAVE . '"/>';
?>
</form>
<p> </p>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
<!-- body_text_eof //-->
</tr>
</table>
<!-- body_eof //-->
<!-- footer //-->
<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
<!-- footer_eof //-->
</body>
</html>
<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
Code: Alles auswählen
<?php
$agi_google_destination_options = array(
array('id' => '', 'text' => TEXT_NONE),
array('id' => 'Shopping', 'text' => 'Shopping'),
array('id' => 'Commerce Search', 'text' => 'Commerce Search')
);
$agi_google_condition_options = array(
array('id' => 'new', 'text' => TEXT_GOOGLE_CONDITION_NEW),
array('id' => 'used', 'text' => TEXT_GOOGLE_CONDITION_USED),
array('id' => 'refurbished', 'text' => TEXT_GOOGLE_CONDITION_REFURBISHED)
);
$agi_google_energy_options = array(
array('id' => '', 'text' => ''),
array('id' => 'A+++', 'text' => 'A+++'),
array('id' => 'A++', 'text' => 'A++'),
array('id' => 'A+', 'text' => 'A+'),
array('id' => 'A', 'text' => 'A'),
array('id' => 'B', 'text' => 'B'),
array('id' => 'C', 'text' => 'C'),
array('id' => 'D', 'text' => 'D'),
array('id' => 'E', 'text' => 'E'),
array('id' => 'F', 'text' => 'F'),
array('id' => 'G', 'text' => 'G')
);
?>
<table style="width: 100%;" cellspacing="0" cellpadding="3">
<tr>
<td><span class="main"><?php echo AGI_GOOGLE_EXPORT_ALLOWED ?></span></td>
<td><?php echo xtc_draw_selection_field('agi_google_export', 'checkbox', '1', $pInfo->agi_google_export==1 ? true : false); ?></td>
<td style="width: 30px"></td>
<td><span class="main"><?php echo AGI_GOOGLE_ONLINE_ONLY ?></span></td>
<td><?php echo xtc_draw_selection_field('agi_google_online_only', 'checkbox', '1', $pInfo->agi_google_online_only==1 ? true : false); ?></td>
</tr>
<tr>
<td><span class="main"><?php echo AGI_GOOGLE_CONDITION ?></span></td>
<td><?php echo xtc_draw_pull_down_menu('agi_google_condition', $agi_google_condition_options, $pInfo->agi_google_condition); ?></td>
<td style="width: 30px"></td>
<td><span class="main"><?php echo AGI_GOOGLE_IDENTIFIER_EXISTS ?></span></td>
<td><?php echo xtc_draw_selection_field('agi_google_identifier_exists', 'checkbox', '1', $pInfo->agi_google_identifier_exists==1 ? true : false); ?></td>
</tr>
<tr>
<td><span class="main"><?php echo AGI_GOOGLE_PRODUCTS_BRAND ?></span></td>
<td><?php echo xtc_draw_input_field('agi_google_products_brand', $pInfo->agi_google_products_brand, 'style="width:100%"'); ?></td>
<td style="width: 30px"></td>
<td><span class="main"><?php echo AGI_GOOGLE_ENERGY_EFFICIENCY ?></span></td>
<td><?php echo xtc_draw_pull_down_menu('agi_google_energy_efficiency', $agi_google_energy_options, $pInfo->agi_google_energy_efficiency); ?></td>
</tr>
<tr>
<td><span class="main"><?php echo AGI_GOOGLE_MULTIPACK_AMOUNT ?></span></td>
<td><?php echo xtc_draw_input_field('agi_google_multipack_amount', $pInfo->agi_google_multipack_amount, 'style="width:100%"'); ?></td>
<td style="width: 30px"></td>
<td></td>
<td></td>
</tr>
<tr>
<td><span class="main"><?php echo AGI_GOOGLE_ADWORDS_GROUPING ?></span></td>
<td><?php echo xtc_draw_input_field('agi_google_adwords_grouping', $pInfo->agi_google_adwords_grouping, 'style="width:100%"'); ?></td>
<td style="width: 30px"></td>
<td><span class="main"><?php echo AGI_GOOGLE_ADWORDS_LABELS ?></span></td>
<td><?php echo xtc_draw_input_field('agi_google_adwords_labels', $pInfo->agi_google_adwords_labels, 'style="width:100%"'); ?></td>
</tr>
<tr>
<td><span class="main"><?php echo AGI_GOOGLE_ADWORDS_REDIRECT ?></span></td>
<td colspan="4"><span class="main"><?php echo xtc_draw_input_field('agi_google_adwords_redirect', $pInfo->agi_google_adwords_redirect, 'style="width:100%"'); ?></span></td>
</tr>
<tr>
<td><span class="main"><?php echo AGI_GOOGLE_EXCLUDED_DESTINATION ?></span></td>
<td><?php echo xtc_draw_pull_down_menu('agi_google_excluded_destination', $agi_google_destination_options, $pInfo->agi_google_excluded_destination); ?></td>
<td style="width: 30px"></td>
<td><span class="main"><?php echo AGI_GOOGLE_EXPIRATION_DATE ?></span></td>
<td><?php echo xtc_draw_input_field('agi_google_expiration_date', $pInfo->agi_google_expiration_date, 'style="width: 135px"'); ?></td>
</tr>
<tr>
<td><span class="main"><?php echo AGI_GOOGLE_CATEGORY; ?></span>
<td colspan="4"><?php echo xtc_draw_input_field('google_category', $pInfo->google_category, 'size="50" style="width: 100%"'); ?></td>
</tr>
<tr>
<td colspan="5"><div id="g_taxonomie_select"></div></td>
</tr>
</table>
<script type="text/javascript" src="../export/google_taxonomie.json.js"></script>
<script type="text/javascript">
if (g_taxonimie && document.getElementById('g_taxonomie_select') && document.getElementsByName('google_category'))
create_agi_google_taxonomie();
function create_agi_google_taxonomie()
{
var parent = document.getElementById('g_taxonomie_select');
var ul = document.createElement('UL');
ul.className = 'agi_taxonomie_select';
parent.appendChild(ul);
build_taxonomie_list_element(ul, '---', '');
if (g_taxonimie.childs)
build_agi_taxonomie_list(ul, g_taxonimie.childs);
}
function build_agi_taxonomie_list(parent, taxonomie_object)
{
for (var i in taxonomie_object)
{
var li = build_taxonomie_list_element(parent, i, taxonomie_object[i].string);
li.className = 'agi_taxonomie_li'; // just for IE in Quirksmode
if (taxonomie_object[i].childs)
{
var ul = document.createElement('UL');
ul.className = 'agi_taxonomie_ul'; // just for IE in Quirksmode
li.appendChild(ul);
li.className = 'has_childs';
li.onmouseover = new Function('hover_taxonomie_list_element(this)');
build_agi_taxonomie_list(ul, taxonomie_object[i].childs);
}
}
}
function build_taxonomie_list_element(parent, text, value)
{
var li = document.createElement('LI');
parent.appendChild(li);
var span = document.createElement('SPAN');
span.className = 'agi_taxonomie_span'; // just for IE in Quirksmode
li.appendChild(span);
span.appendChild(document.createTextNode(decodeURIComponent(text)));
span.onclick = new Function ("document.getElementsByName('google_category')[0].value='"+decodeURIComponent(value)+"'");
return li;
}
function hover_taxonomie_list_element(me)
{
var myParent = me.parentNode;
var lis = myParent.getElementsByTagName('LI');
for (var i=0; i<lis.length; i++)
{
lis[i].className = lis[i].className.replace(new RegExp(" hover\\b"), "");
lis[i].onmouseover = new Function('hover_taxonomie_list_element(this)');
}
me.className+=" hover";
me.onmouseover = '';
}
</script>
<!-- AGI google-taxonomie http://www.andreas-guder.de END -->
Code: Alles auswählen
<?php
/* admin/includes/modules/export/agi_google_xml.php
.---------------------------------------------------------------------------.
| Software: GOOGLE-Shopping XML-Export for modified-shops and xt:c 3 |
| Author: Andreas Guder |
| Version: 1.4 Standard |
| Contact: info@andreas-guder.de / http://www.andreas-guder.de |
| Copyright (c) 2013, Andreas Guder [info@andreas-guder.de] |
| GNU General Public License |
'--------------------------------------------------------------------------�'
*/
defined( '_VALID_XTC' ) or die( 'Direct Access to this location is not allowed.' );
define('MODULE_AGI_GOOGLE_XML_DESCRIPTION', 'XML-Datenfeed für Google-Merchant-Center,<br />aktiviert die Datei /export/google_xml.php');
define('MODULE_AGI_GOOGLE_XML_TEXT_TITLE', 'XML-Datenfeed für Google-Merchant-Center');
define('MODULE_AGI_GOOGLE_XML_STATUS_TITLE', 'Modul aktiv');
define('MODULE_AGI_GOOGLE_XML_STATUS_DESC', 'Soll das Modul aktiviert werden?');
define('MODULE_AGI_GOOGLE_XML_VPE_TITLE_TITLE', 'Grundpreis im Titel');
define('MODULE_AGI_GOOGLE_XML_VPE_TITLE_DESC', 'Die Grundpreisauszeichnung wird an den Produkttitel angefügt');
define('MODULE_AGI_GOOGLE_XML_VPE_DESCRIPTION_TITLE', 'Grundpreis in der Beschreibung');
define('MODULE_AGI_GOOGLE_XML_VPE_DESCRIPTION_DESC', 'Die Grundpreisauszeichnung wird der Beschreibung vorangestellt');
define('MODULE_AGI_GOOGLE_XML_LONG_DESCRIPTION_TITLE', 'Artikelbeschreibung exportieren');
define('MODULE_AGI_GOOGLE_XML_LONG_DESCRIPTION_DESC', 'Artikelbeschreibung anstelle der Kurzbeschreibung exportieren?');
define('MODULE_AGI_GOOGLE_XML_AVAILABILITY_FROM_QUANTITY_TITLE', 'Bestandsabhängige Verfügbarkeit');
define('MODULE_AGI_GOOGLE_XML_AVAILABILITY_FROM_QUANTITY_DESC', 'Bestandsabhängige Verfügbarkeit übermitteln anstelle von dauerhaft "in stock"');
define('MODULE_AGI_GOOGLE_XML_SHIPPING_LIST_TITLE', 'Versandkosten');
define('MODULE_AGI_GOOGLE_XML_SHIPPING_LIST_DESC', 'Die Versandkosten basieren auf dem Artikelpreis oder dem Artikelgewicht. Beispiel: 25:4.90,50:9.90,etc.. Bis 25 werden 4.90 verrechnet, darüber bis 50 werden 9.90 verrechnet, etc.');
define('MODULE_AGI_GOOGLE_XML_SHIPPING_BASE_TITLE', 'Versandkosten-Basis');
define('MODULE_AGI_GOOGLE_XML_SHIPPING_BASE_DESC', 'Die Versandkosten basieren auf dem Artikelpreis oder dem Artikelgewicht.');
define('MODULE_AGI_GOOGLE_CHECK_GRADUATED_PRICE_TITLE', 'Staffelpreise beachten');
define('MODULE_AGI_GOOGLE_CHECK_GRADUATED_PRICE_DESC', 'der g�nstigste Staffelpreis wird zu Google �bertragen');
define('MODULE_AGI_GOOGLE_IGNORE_FREESHIPPING_MODULES_TITLE', 'Versandkostenfrei-Einstellungen ignorieren');
define('MODULE_AGI_GOOGLE_IGNORE_FREESHIPPING_MODULES_DESC', 'Einstellungen aus den Modulen ot_shipping und freeamount, durch die Versand ab einem bestimmten Preis kostenfrei wird, werden ignoriert.');
define('MODULE_AGI_GOOGLE_XML_GENDER_WORDS_MALE_TITLE', 'Attributwerte für "Herren"');
define('MODULE_AGI_GOOGLE_XML_GENDER_WORDS_MALE_DESC', 'Geben Sie Ihre verwendeten Attributwerte an, die für "männlich" stehen. (klein, mit Komma hintereinander)');
define('MODULE_AGI_GOOGLE_XML_GENDER_WORDS_FEMALE_TITLE', 'Attributwerte für "Damen"');
define('MODULE_AGI_GOOGLE_XML_GENDER_WORDS_FEMALE_DESC', 'Geben Sie Ihre verwendeten Attributwerte an, die für "weiblich" stehen. (klein, mit Komma hintereinander)');
define('MODULE_AGI_GOOGLE_XML_GENDER_WORDS_UNISEX_TITLE', 'Attributwerte für "Unisex"');
define('MODULE_AGI_GOOGLE_XML_GENDER_WORDS_UNISEX_DESC', 'Geben Sie Ihre verwendeten Attributwerte an, die für "geschlechtsneutral" stehen. (klein, mit Komma hintereinander)');
define('MODULE_AGI_GOOGLE_XML_AGE_GROUP_WORDS_KIDS_TITLE', 'Attributwerte für "Kinder"');
define('MODULE_AGI_GOOGLE_XML_AGE_GROUP_WORDS_KIDS_DESC', 'Geben Sie Ihre verwendeten Attributwerte an, die für "Kinder" stehen. (klein, mit Komma hintereinander)');
define('MODULE_AGI_GOOGLE_XML_AGE_GROUP_WORDS_ADULT_TITLE', 'Attributwerte für "Erwachsen"');
define('MODULE_AGI_GOOGLE_XML_AGE_GROUP_WORDS_ADULT_DESC', 'Geben Sie Ihre verwendeten Attributwerte an, die für "Erwachsene" stehen. (klein, mit Komma hintereinander)');
define('MODULE_AGI_GOOGLE_XML_DEFAULT_CATEGORY_TITLE', 'Standard Google-Kategorie');
define('MODULE_AGI_GOOGLE_XML_DEFAULT_CATEGORY_DESC', 'Diese Google-Kategorie wird ausgegeben, wenn dem Produkt keine Google-Kategorie zugeordnet werden kann.');
define('MODULE_AGI_GOOGLE_XML_CAMPAIGN_TITLE', 'Kampanien-Parameter');
define('MODULE_AGI_GOOGLE_XML_CAMPAIGN_DESC', 'Diese Parameter werden jedem Produktlink angefügt. Bspl: pk_campaign=google_shopping');
define('MODULE_AGI_GOOGLE_XML_USE_PRODUCT_IMAGE_TITLE', 'Bilder verwenden');
define('MODULE_AGI_GOOGLE_XML_USE_PRODUCT_IMAGE_DESC', 'Diese Produktbilder werden exportiert.');
class agi_google_xml {
function agi_google_xml()
{
if (defined('MODULE_AGI_GOOGLE_XML_STATUS'))
$this->enabled = (MODULE_AGI_GOOGLE_XML_STATUS == 'TRUE') ? true : false;
else
$this->enabled = false;
$this->code = 'agi_google_xml';
$this->title = MODULE_AGI_GOOGLE_XML_TEXT_TITLE;
$this->description = MODULE_AGI_GOOGLE_XML_DESCRIPTION;
$this->sort_order = MODULE_AGI_GOOGLE_XML_SORT_ORDER;
}
function process()
{
// do nothing
}
function display()
{
$this->do_modul_updates();
// print more instructions
$text = '<hr /><br />Nachdem Sie das Modul aktiviert haben, geben Sie im Google MerchantCenter die URL zur Exportdatei an:';
$text .= '<br /><em>"'.HTTP_SERVER.'/export/google_xml.php"</em>';
$text .= '<br />Der Aufruf der URL erzeugt automatisch die aktuellste Produktliste Ihres Shops, sofern er außerhalb des Cache-Zeitraums erfolgt.';
$text .= '<br />Der Standard-Cache-Zeitraum ist auf 1 Tag eingestellt, dadurch wird die Produktliste nur einmal täglich neu erstellt.';
$text .= '<br />Mit dem Parameter "cache=" an der URL können Sie Anzahl der Tage bei Bedarf beeinflussen.';
$text .= '<br /><br />Ab einer geschätzten Anzahl von 3000 Shop-Artikeln ist es unter Umständen nicht mehr möglich, die komplette XML-Datei zu erstellen.';
$text .= '<br /><em>(Stichworte: Server-Timeout, Memory-Limit)</em>';
$text .= '<br />In diesen Fällen müssen Sie die Produktliste in mehrere Seiten aufteilen:';
$text .= '<br />Legen Sie im Merchant-Center mehrere Feeds mit der genannten URL an.';
$text .= '<br />Ergänzen Sie an jeder URL den Parameter "page=X".';
$text .= '<br />Anstelle von "X" geben Sie eine Seitenzahl 1 bis X an';
$text .= '<br />Seitenzahl 1 gibt die ersten 3000 Produkte aus, Seitenzahl 2 die Produkte 3000 bis 6000, Seitenzahl 3 die Produkte 6000 bis 9000, usw.';
$text .= '<br />Bei Bedarf kann die Anzahl der Produkte pro Seite in der Datei "export/google_xml.php" geändert werden.';
$text .= '<br /><br />Außerdem stehen folgende URL-Parameter zur Verfügung:';
$text .= '<br />"lang=" ID der Sprache, die verwendet werden soll. (Standard: 2 = deutsch)';
$text .= '<br />"group=" ID der Kundengruppe, die verwendet werden soll. (Standard: 1 = Gast)';
$text .= '<br /><br />';
$text .= '<br />Autor: <a href="http://www.andreas-guder.de" target="_blank">www.andreas-guder.de</a><br />';
$text .= '<br />' . xtc_button(BUTTON_SAVE);
$text .= xtc_button_link(BUTTON_CANCEL, xtc_href_link(FILENAME_MODULE_EXPORT, 'set=' . $_GET['set'] . '&module=agi_google_xml'));
return array('text'=>$text);
}
function check()
{
if (!isset($this->_check))
{
$check_query = xtc_db_query("SELECT `configuration_value` FROM " . TABLE_CONFIGURATION . " WHERE `configuration_key` = 'MODULE_AGI_GOOGLE_XML_STATUS'");
$this->_check = xtc_db_num_rows($check_query);
}
return $this->_check;
}
function install()
{
if (!defined('MODULE_AGI_GOOGLE_XML_STATUS'))
{
xtc_db_query("INSERT INTO `" . TABLE_CONFIGURATION . "` (`configuration_key`, `configuration_value`, `configuration_group_id`, `sort_order`, `set_function`, `date_added`) VALUES ('MODULE_AGI_GOOGLE_XML_STATUS', 'TRUE', '6', '1', 'xtc_cfg_select_option(array(\'TRUE\', \'FALSE\'), ', now())");
xtc_db_query("INSERT INTO `" . TABLE_CONFIGURATION . "` (`configuration_key`, `configuration_value`, `configuration_group_id`, `sort_order`, `set_function`, `date_added`) VALUES ('MODULE_AGI_GOOGLE_XML_VPE_TITLE', 'FALSE', '6', '1', 'xtc_cfg_select_option(array(\'TRUE\', \'FALSE\'), ', now())");
xtc_db_query("INSERT INTO `" . TABLE_CONFIGURATION . "` (`configuration_key`, `configuration_value`, `configuration_group_id`, `sort_order`, `set_function`, `date_added`) VALUES ('MODULE_AGI_GOOGLE_XML_VPE_DESCRIPTION', 'FALSE', '6', '1', 'xtc_cfg_select_option(array(\'TRUE\', \'FALSE\'), ', now())");
xtc_db_query("INSERT INTO `" . TABLE_CONFIGURATION . "` (`configuration_key`, `configuration_value`, `configuration_group_id`, `sort_order`, `set_function`, `date_added`) VALUES ('MODULE_AGI_GOOGLE_XML_LONG_DESCRIPTION', 'TRUE', '6', '1', 'xtc_cfg_select_option(array(\'TRUE\', \'FALSE\'), ', now())");
xtc_db_query("INSERT INTO `" . TABLE_CONFIGURATION . "` (`configuration_key`, `configuration_value`, `configuration_group_id`, `sort_order`, `set_function`, `date_added`) VALUES ('MODULE_AGI_GOOGLE_XML_AVAILABILITY_FROM_QUANTITY', 'TRUE', '6', '1', 'xtc_cfg_select_option(array(\'TRUE\', \'FALSE\'), ', now())");
xtc_db_query("INSERT INTO `" . TABLE_CONFIGURATION . "` (`configuration_key`, `configuration_value`, `configuration_group_id`, `sort_order`, `set_function`, `date_added`) VALUES ('MODULE_AGI_GOOGLE_CHECK_GRADUATED_PRICE', 'FALSE', '6', '1', 'xtc_cfg_select_option(array(\'TRUE\', \'FALSE\'), ', now())");
xtc_db_query("INSERT INTO `" . TABLE_CONFIGURATION . "` (`configuration_key`, `configuration_value`, `configuration_group_id`, `sort_order`, `set_function`, `date_added`) VALUES ('MODULE_AGI_GOOGLE_IGNORE_FREESHIPPING_MODULES', 'FALSE', '6', '1', 'xtc_cfg_select_option(array(\'TRUE\', \'FALSE\'), ', now())");
xtc_db_query("INSERT INTO `" . TABLE_CONFIGURATION . "` (`configuration_key`, `configuration_value`, `configuration_group_id`, `sort_order`, `set_function`, `date_added`) VALUES ('MODULE_AGI_GOOGLE_XML_SHIPPING_BASE', 'price', '6', '1', 'xtc_cfg_select_option(array(\'price\', \'weight\'), ', now())");
xtc_db_query("INSERT INTO `" . TABLE_CONFIGURATION . "` (`configuration_key`, `configuration_value`, `configuration_group_id`, `sort_order`, `set_function`, `date_added`) VALUES ('MODULE_AGI_GOOGLE_XML_SHIPPING_LIST', '0:4.95,50:0', '6', '1', '', now())");
xtc_db_query("INSERT INTO `" . TABLE_CONFIGURATION . "` (`configuration_key`, `configuration_value`, `configuration_group_id`, `sort_order`, `set_function`, `date_added`) VALUES ('MODULE_AGI_GOOGLE_XML_GENDER_WORDS_MALE', 'herr,mann,herren', '6', '1', '', now())");
xtc_db_query("INSERT INTO `" . TABLE_CONFIGURATION . "` (`configuration_key`, `configuration_value`, `configuration_group_id`, `sort_order`, `set_function`, `date_added`) VALUES ('MODULE_AGI_GOOGLE_XML_GENDER_WORDS_FEMALE', 'frau,dame,damen,frauen', '6', '1', '', now())");
xtc_db_query("INSERT INTO `" . TABLE_CONFIGURATION . "` (`configuration_key`, `configuration_value`, `configuration_group_id`, `sort_order`, `set_function`, `date_added`) VALUES ('MODULE_AGI_GOOGLE_XML_GENDER_WORDS_UNISEX', 'unisex', '6', '1', '', now())");
xtc_db_query("INSERT INTO `" . TABLE_CONFIGURATION . "` (`configuration_key`, `configuration_value`, `configuration_group_id`, `sort_order`, `set_function`, `date_added`) VALUES ('MODULE_AGI_GOOGLE_XML_AGE_GROUP_WORDS_KIDS', 'kind,kinder,kids,baby', '6', '1', '', now())");
xtc_db_query("INSERT INTO `" . TABLE_CONFIGURATION . "` (`configuration_key`, `configuration_value`, `configuration_group_id`, `sort_order`, `set_function`, `date_added`) VALUES ('MODULE_AGI_GOOGLE_XML_AGE_GROUP_WORDS_ADULT', 'erwachsen,normal', '6', '1', '', now())");
xtc_db_query("INSERT INTO `" . TABLE_CONFIGURATION . "` (`configuration_key`, `configuration_value`, `configuration_group_id`, `sort_order`, `set_function`, `date_added`) VALUES ('MODULE_AGI_GOOGLE_XML_DEFAULT_CATEGORY', '', '6', '1', '', now())");
xtc_db_query("INSERT INTO `" . TABLE_CONFIGURATION . "` (`configuration_key`, `configuration_value`, `configuration_group_id`, `sort_order`, `set_function`, `date_added`) VALUES ('MODULE_AGI_GOOGLE_XML_CAMPAIGN', 'pk_campaign=google_shopping', '6', '1', '', now())");
xtc_db_query("INSERT INTO `" . TABLE_CONFIGURATION . "` (`configuration_key`, `configuration_value`, `configuration_group_id`, `sort_order`, `set_function`, `date_added`) VALUES ('MODULE_AGI_GOOGLE_XML_USE_PRODUCT_IMAGE', 'popup_images', '6', '1', 'xtc_mod_select_option(array(\'popup_images\'=>\'popup_images\', \'info_images\'=>\'info_images\'), \'MODULE_AGI_GOOGLE_XML_USE_PRODUCT_IMAGE\', ', now())");
}
$query_result = xtc_db_query("SHOW COLUMNS FROM `" . TABLE_PRODUCTS_OPTIONS . "`");
$db_table_rows = array();
while ($row = xtc_db_fetch_array($query_result))
$db_table_rows[] = $row['Field'];
if (!in_array('is_google_attribute', $db_table_rows))
xtc_db_query("ALTER TABLE `" . TABLE_PRODUCTS_OPTIONS . "` ADD `is_google_attribute` VARCHAR( 64 ) NOT NULL");
$query_result = xtc_db_query("SHOW COLUMNS FROM `" . TABLE_PRODUCTS . "`");
$db_table_rows = array();
while ($row = xtc_db_fetch_array($query_result))
$db_table_rows[] = $row['Field'];
if (!in_array('agi_google_export', $db_table_rows))
{
$query = "ALTER TABLE `products`
ADD `agi_google_export` TINYINT( 1 ) NOT NULL DEFAULT '1',
ADD `agi_google_online_only` TINYINT( 1 ) NOT NULL DEFAULT '0',
ADD `agi_google_condition` VARCHAR( 63 ) NOT NULL DEFAULT 'new',
ADD `agi_google_adwords_grouping` VARCHAR( 255 ) NOT NULL ,
ADD `agi_google_adwords_labels` VARCHAR( 255 ) NOT NULL ,
ADD `agi_google_adwords_redirect` VARCHAR( 255 ) NOT NULL ,
ADD `agi_google_excluded_destination` VARCHAR( 63 ) NOT NULL ,
ADD `agi_google_expiration_date` VARCHAR( 63 ) NOT NULL";
xtc_db_query($query);
$query = "ALTER TABLE `products` ADD `agi_google_products_brand` VARCHAR( 128 ) NOT NULL DEFAULT '',
ADD `agi_google_identifier_exists` TINYINT( 1 ) NOT NULL DEFAULT '1',
ADD `agi_google_multipack_amount` INT( 5 ) NOT NULL DEFAULT '1',
ADD `agi_google_energy_efficiency` VARCHAR( 32 ) NOT NULL DEFAULT ''";
xtc_db_query($query);
}
if (!in_array('google_category', $db_table_rows))
xtc_db_query("ALTER TABLE `" . TABLE_PRODUCTS . "` ADD `google_category` TEXT NOT NULL");
$query_result = xtc_db_query("SHOW COLUMNS FROM `" . TABLE_CATEGORIES . "`");
$db_table_rows = array();
while ($row = xtc_db_fetch_array($query_result))
$db_table_rows[] = $row['Field'];
if (!in_array('google_category', $db_table_rows))
xtc_db_query("ALTER TABLE `" . TABLE_CATEGORIES . "` ADD `google_category` TEXT NOT NULL");
$query_result = xtc_db_query("SHOW COLUMNS FROM `" . TABLE_ADMIN_ACCESS . "`");
$db_table_rows = array();
while ($row = xtc_db_fetch_array($query_result))
$db_table_rows[] = $row['Field'];
if (!in_array('google_taxonomie', $db_table_rows))
{
xtc_db_query("ALTER TABLE `" . TABLE_ADMIN_ACCESS . "` ADD google_taxonomie INT(1) NOT NULL DEFAULT 0");
xtc_db_query("UPDATE `" . TABLE_ADMIN_ACCESS . "` SET `google_taxonomie` = 1 WHERE `customers_id` = 1");
}
}
function remove()
{
xtc_db_query("DELETE FROM `" . TABLE_CONFIGURATION . "` WHERE `configuration_key` IN ('" . implode("', '", $this->keys()) . "')");
}
function keys()
{
return array(
'MODULE_AGI_GOOGLE_XML_STATUS','MODULE_AGI_GOOGLE_XML_VPE_TITLE','MODULE_AGI_GOOGLE_XML_VPE_DESCRIPTION','MODULE_AGI_GOOGLE_CHECK_GRADUATED_PRICE',
'MODULE_AGI_GOOGLE_XML_LONG_DESCRIPTION','MODULE_AGI_GOOGLE_XML_AVAILABILITY_FROM_QUANTITY','MODULE_AGI_GOOGLE_IGNORE_FREESHIPPING_MODULES','MODULE_AGI_GOOGLE_XML_SHIPPING_LIST',
'MODULE_AGI_GOOGLE_XML_SHIPPING_BASE','MODULE_AGI_GOOGLE_XML_USE_PRODUCT_IMAGE','MODULE_AGI_GOOGLE_XML_GENDER_WORDS_MALE','MODULE_AGI_GOOGLE_XML_GENDER_WORDS_FEMALE',
'MODULE_AGI_GOOGLE_XML_GENDER_WORDS_UNISEX','MODULE_AGI_GOOGLE_XML_AGE_GROUP_WORDS_KIDS','MODULE_AGI_GOOGLE_XML_AGE_GROUP_WORDS_ADULT',
'MODULE_AGI_GOOGLE_XML_DEFAULT_CATEGORY','MODULE_AGI_GOOGLE_XML_CAMPAIGN'
);
}
function do_modul_updates()
{
// update itself
// to version s1.2
if (!defined('MODULE_AGI_GOOGLE_CHECK_GRADUATED_PRICE'))
xtc_db_query("INSERT INTO `" . TABLE_CONFIGURATION . "` (`configuration_key`, `configuration_value`, `configuration_group_id`, `sort_order`, `set_function`, `date_added`) VALUES ('MODULE_AGI_GOOGLE_CHECK_GRADUATED_PRICE', 'FALSE', '6', '1', 'xtc_cfg_select_option(array(\'TRUE\', \'FALSE\'), ', now())");
if (!defined('MODULE_AGI_GOOGLE_IGNORE_FREESHIPPING_MODULES'))
xtc_db_query("INSERT INTO `" . TABLE_CONFIGURATION . "` (`configuration_key`, `configuration_value`, `configuration_group_id`, `sort_order`, `set_function`, `date_added`) VALUES ('MODULE_AGI_GOOGLE_IGNORE_FREESHIPPING_MODULES', 'FALSE', '6', '1', 'xtc_cfg_select_option(array(\'TRUE\', \'FALSE\'), ', now())");
// update to 1.4 S and P
if (!defined('MODULE_AGI_GOOGLE_XML_USE_PRODUCT_IMAGE'))
{
// modul-Konfiguration
xtc_db_query("INSERT INTO `" . TABLE_CONFIGURATION . "` (`configuration_key`, `configuration_value`, `configuration_group_id`, `sort_order`, `set_function`, `date_added`) VALUES ('MODULE_AGI_GOOGLE_XML_USE_PRODUCT_IMAGE', 'popup_images', '6', '1', 'xtc_mod_select_option(array(\'popup_images\'=>\'popup_images\', \'info_images\'=>\'info_images\'), \'MODULE_AGI_GOOGLE_XML_USE_PRODUCT_IMAGE\', ', now())");
// neue Produktwerte
$query = "ALTER TABLE `products` ADD `agi_google_products_brand` VARCHAR( 128 ) NOT NULL DEFAULT '',
ADD `agi_google_identifier_exists` TINYINT( 1 ) NOT NULL DEFAULT '1',
ADD `agi_google_multipack_amount` INT( 5 ) NOT NULL DEFAULT '1',
ADD `agi_google_energy_efficiency` VARCHAR( 32 ) NOT NULL DEFAULT ''";
xtc_db_query($query);
$query = "UPDATE `products` SET `agi_google_identifier_exists`=1";
xtc_db_query($query);
}
}
}
?>