diff --git a/.gitignore b/.gitignore index 42e13a1..50559e0 100644 --- a/.gitignore +++ b/.gitignore @@ -36,4 +36,4 @@ upload/ # Module data -output.xml \ No newline at end of file +/output/*.xml \ No newline at end of file diff --git a/classes/GoogleProvider.php b/classes/GoogleProvider.php new file mode 100644 index 0000000..e7b402d --- /dev/null +++ b/classes/GoogleProvider.php @@ -0,0 +1,101 @@ + + * @copyright 2020 Pittica S.r.l.s. + * @license http://opensource.org/licenses/LGPL-3.0 The GNU Lesser General Public License, version 3.0 ( LGPL-3.0 ) + */ + +require_once(dirname(__FILE__) . '/Provider.php'); + +class GoogleProvider extends Provider +{ + public function getElementRoot() + { + return 'rss'; + } + + public function getElementItem() + { + return 'item'; + } + + public function getFilename() + { + return 'google'; + } + + public function renderAttributes($xml) + { + $xml->writeAttribute('version', '2.0'); + $xml->WriteAttribute('xmlns:g', 'http://base.google.com/ns/1.0'); + + return $xml; + } + + public function renderItem($xml, $offer) + { + $context = Context::getContext(); + $carrier = new Carrier((int)Configuration::get('PITTICA_TROVAPREZZI_CARRIER')); + $locale = Tools::getContextLocale($context); + + $xml->writeElement('title', $offer->name); + $xml->writeElement('description', $offer->description); + $xml->writeElement('link', $offer->link); + $xml->writeElement('g:id', $offer->id_product . ($offer->id_product_attribute ? ('-' . $offer->id_product_attribute) : '')); + $xml->writeElement('g:image_link', $offer->image_1); + $xml->writeElement('g:price', $locale->formatPrice($offer->original_price, $context->currency->iso_code)); + + if ($offer->original_price != $offer->price) { + $xml->writeElement('g:sale_price', $locale->formatPrice($offer->price, $context->currency->iso_code)); + } + + $xml->writeElement('g:gtin', !empty($offer->ean_code) ? $offer->ean_code : $offer->part_number); + $xml->writeElement('g:brand', $offer->brand); + $xml->writeElement('g:availability', $offer->stock); + $xml->startElement('g:shipping'); + $xml->writeElement('g:country', Country::getIsoById((int)Configuration::get('PS_COUNTRY_DEFAULT'))); + $xml->writeElement('g:service', $carrier->name); + $xml->writeElement('g:price', $locale->formatPrice($offer->shipping_cost, $context->currency->iso_code)); + $xml->endElement(); + + if (!empty($offer->image_2)) { + $xml->writeElement('g:additional_image_link', $offer->image_2); + } + + if (!empty($offer->image_3)) { + $xml->writeElement('g:additional_image_link', $offer->image_3); + } + + return $xml; + } + + public function renderBody($xml) + { + $xml->startElement('channel'); + + $meta = Meta::getHomeMetas((int)Configuration::get('PS_LANG_DEFAULT'), 'index'); + + $xml->writeElement('title', Configuration::get('PS_SHOP_NAME')); + $xml->writeElement('link', Context::getContext()->link->getBaseLink()); + $xml->writeElement('description', $meta['meta_description']); + + $offers = TrovaprezziOffer::getOffers(); + + foreach ($offers as $offer) { + if ($offer->active) { + $xml->startElement($this->getElementItem()); + + $this->renderItem($xml, $offer); + + $xml->endElement(); + } + } + + $xml->endElement(); + } +} diff --git a/classes/Provider.php b/classes/Provider.php new file mode 100644 index 0000000..ea390f8 --- /dev/null +++ b/classes/Provider.php @@ -0,0 +1,80 @@ + + * @copyright 2020 Pittica S.r.l.s. + * @license http://opensource.org/licenses/LGPL-3.0 The GNU Lesser General Public License, version 3.0 ( LGPL-3.0 ) + */ + +require_once(dirname(__FILE__) . '/TrovaprezziOffer.php'); + +abstract class Provider +{ + public static function getProvider($name) + { + $class = ucfirst($name) . 'Provider'; + + require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . $class . '.php'); + + return new $class; + } + + public static function getProviders() + { + return array( + 'trovaprezzi', + 'google' + ); + } + + public abstract function getFilename(); + + public abstract function getElementRoot(); + + public abstract function getElementItem(); + + public function renderAttributes($xml) + { + return $xml; + } + + public abstract function renderItem($xml, $offer); + + public function renderBody($xml) + { + $offers = TrovaprezziOffer::getOffers(); + + foreach ($offers as $offer) { + if ($offer->active) { + $xml->startElement($this->getElementItem()); + + $this->renderItem($xml, $offer); + + $xml->endElement(); + } + } + + return $xml; + } + + public function generate($path) + { + $xml = new XmlWriter(); + $xml->openUri($path); + $xml->startDocument('1.0', 'UTF-8'); + $xml->startElement($this->getElementRoot()); + + $this->renderAttributes($xml); + $this->renderBody($xml); + + $xml->endElement(); + $xml->endDocument(); + $xml->flush(); + + return true; + } +} diff --git a/classes/TrovaprezziOffer.php b/classes/TrovaprezziOffer.php index 4045822..6e93435 100644 --- a/classes/TrovaprezziOffer.php +++ b/classes/TrovaprezziOffer.php @@ -110,26 +110,4 @@ public static function truncate() { return Db::getInstance()->execute('TRUNCATE `' . _DB_PREFIX_ . self::TABLE_NAME . '`'); } - - public function toArray() - { - return array( - 'Name' => $this->name, - 'Brand' => $this->brand, - 'Description' => $this->description, - 'OriginalPrice' => $this->original_price, - 'Price' => $this->price, - 'Code' => $this->id_product . ($this->id_product_attribute ? ('-' . $this->id_product_attribute) : ''), - 'Link' => $this->link, - 'Stock' => $this->stock, - 'Categories' => $this->categories, - 'Image' => $this->image_1, - 'ShippingCost' => $this->shipping_cost, - 'PartNumber' => $this->part_number, - 'EanCode' => $this->ean_code, - 'Weight' => $this->weight, - 'Image2' => $this->image_2, - 'Image3' => $this->image_3 - ); - } } diff --git a/classes/TrovaprezziProvider.php b/classes/TrovaprezziProvider.php new file mode 100644 index 0000000..4bd3578 --- /dev/null +++ b/classes/TrovaprezziProvider.php @@ -0,0 +1,53 @@ + + * @copyright 2020 Pittica S.r.l.s. + * @license http://opensource.org/licenses/LGPL-3.0 The GNU Lesser General Public License, version 3.0 ( LGPL-3.0 ) + */ + +require_once(dirname(__FILE__) . '/Provider.php'); + +class TrovaprezziProvider extends Provider +{ + public function getElementRoot() + { + return 'Products'; + } + + public function getElementItem() + { + return 'Offer'; + } + + public function getFilename() + { + return 'trovaprezzi'; + } + + public function renderItem($xml, $offer) + { + $xml->writeElement('Name', $offer->name); + $xml->writeElement('Brand', $offer->brand); + $xml->writeElement('Description', $offer->description); + $xml->writeElement('OriginalPrice', $offer->original_price); + $xml->writeElement('Price', $offer->price); + $xml->writeElement('Code', $offer->id_product . ($offer->id_product_attribute ? ('-' . $offer->id_product_attribute) : '')); + $xml->writeElement('Link', $offer->link); + $xml->writeElement('Stock', $offer->stock); + $xml->writeElement('Categories', $offer->categories); + $xml->writeElement('Image', $offer->image_1); + $xml->writeElement('ShippingCost', $offer->shipping_cost); + $xml->writeElement('PartNumber', $offer->part_number); + $xml->writeElement('EanCode', $offer->ean_code); + $xml->writeElement('Weight', $offer->weight); + $xml->writeElement('Image2', $offer->image_2); + $xml->writeElement('Image3', $offer->image_3); + + return $xml; + } +} diff --git a/controllers/front/download.php b/controllers/front/download.php index 16568b0..7ffd8e1 100644 --- a/controllers/front/download.php +++ b/controllers/front/download.php @@ -15,16 +15,18 @@ class pitticatrovaprezzidownloadModuleFrontController extends ModuleFrontControl public function initContent() { parent::initContent(); - + if (Tools::getValue('token') === $this->module->getToken()) { - if (file_exists($this->module->getFilePath())) { + $path = $this->module->getFilePath(Tools::getValue('provider', 'trovaprezzi')); + + if (file_exists($path)) { header($_SERVER['SERVER_PROTOCOL'] . ' 200 OK'); header('Cache-Control: public'); header('Content-Type: text/xml'); - readfile($this->module->getFilePath()); + readfile($path); } } - + die(); } } diff --git a/controllers/front/generate.php b/controllers/front/generate.php index f4c8008..e6580af 100644 --- a/controllers/front/generate.php +++ b/controllers/front/generate.php @@ -15,11 +15,11 @@ class pitticatrovaprezzigenerateModuleFrontController extends ModuleFrontControl public function initContent() { parent::initContent(); - + if (Tools::getValue('token') === $this->module->getToken()) { - $this->module->generate(); + $this->module->generate((int)Tools::getValue('refresh', true), Tools::getValue('provider')); } - + die(); } } diff --git a/output/index.php b/output/index.php new file mode 100644 index 0000000..f2de443 --- /dev/null +++ b/output/index.php @@ -0,0 +1,21 @@ + + * @copyright 2020 Pittica S.r.l.s. + * @license http://opensource.org/licenses/LGPL-3.0 The GNU Lesser General Public License, version 3.0 ( LGPL-3.0 ) + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/pitticatrovaprezzi.php b/pitticatrovaprezzi.php index 59f1fa1..dd5461f 100644 --- a/pitticatrovaprezzi.php +++ b/pitticatrovaprezzi.php @@ -15,6 +15,7 @@ } require_once(dirname(__FILE__) . '/classes/TrovaprezziOffer.php'); +require_once(dirname(__FILE__) . '/classes/Provider.php'); class PitticaTrovaprezzi extends Module { @@ -22,110 +23,123 @@ public function __construct() { $this->name = 'pitticatrovaprezzi'; $this->tab = 'front_office_features'; - $this->version = '1.1.1'; + $this->version = '1.2.0'; $this->author = 'Pittica'; $this->need_instance = 1; $this->bootstrap = 1; - + parent::__construct(); - + $this->displayName = $this->l('TrovaPrezzi'); $this->description = $this->l('Creates an XML feed for TrovaPrezzi.it.'); - + $this->ps_versions_compliancy = array( 'min' => '1.7', 'max' => _PS_VERSION_ ); } - + public function install() { include(dirname(__FILE__) . '/sql/install.php'); - + $carriers = Carrier::getCarriers((int) Configuration::get('PS_LANG_DEFAULT'), true); reset($carriers); Configuration::updateValue('PITTICA_TROVAPREZZI_CARRIER', !empty($carriers[0]['id_carrier']) ? (int) $carriers[0]['id_carrier'] : -1); - + return parent::install() && $this->installTab() && $this->registerHook('displayFooterAfter'); } - + public function uninstall() { include(dirname(__FILE__) . '/sql/uninstall.php'); - + return parent::uninstall() && $this->uninstallTab() && Configuration::deleteByName('PITTICA_TROVAPREZZI_CARRIER'); } - + public function installTab() { $id = (int) Tab::getIdFromClassName('AdminTrovaprezzi'); - + if (!$id) { $id = null; } - + $tab = new Tab($id); $tab->active = 1; $tab->class_name = 'AdminTrovaprezzi'; $tab->name = array(); - + foreach (Language::getLanguages() as $lang) { $tab->name[$lang['id_lang']] = 'AdminTrovaprezzi'; } - + $tab->module = $this->name; - + return $tab->add(); } - + public function uninstallTab() { $id = (int) Tab::getIdFromClassName('AdminTrovaprezzi'); - + if ($id) { $tab = new Tab($id); - + return $tab->delete(); } - + return false; } - + public function getContent() { $output = ''; - + if (Tools::isSubmit('savepitticatrovaprezzi')) { Configuration::updateValue('PITTICA_TROVAPREZZI_CARRIER', Tools::getValue('carrier')); - + $output .= $this->displayConfirmation($this->l('Settings updated.')); } - + return $output . $this->renderForm(); } - + protected function renderForm() { $lang = (int) Configuration::get('PS_LANG_DEFAULT'); $carriers = Carrier::getCarriers($lang, true); - - $fields_form = array( + + $helper = new HelperForm(); + $helper->module = $this; + $helper->name_controller = 'pitticatrovaprezzi'; + $helper->identifier = $this->identifier; + $helper->token = Tools::getAdminTokenLite('AdminModules'); + $helper->currentIndex = AdminController::$currentIndex . '&configure=' . $this->name; + $helper->default_form_language = $lang; + $helper->allow_employee_form_lang = $lang; + $helper->title = $this->displayName; + $helper->submit_action = 'savepitticatrovaprezzi'; + + $check = $this->context->link->getAdminLink('AdminTrovaprezzi'); + + $helper->fields_value = array( + 'generate' => $this->getGenerateFeedHtml(null), + 'feed_trovaprezzi' => $this->getViewFeedHtml('trovaprezzi'), + 'generate_trovaprezzi' => $this->getGenerateFeedHtml('trovaprezzi'), + 'feed_google' => $this->getViewFeedHtml('google'), + 'generate_google' => $this->getGenerateFeedHtml('google'), + 'carrier' => Configuration::get('PITTICA_TROVAPREZZI_CARRIER'), + 'check' => '' . $this->l('Check non-compliant products.') . '' + ); + + return $helper->generateForm(array( array( 'form' => array( 'legend' => array( 'title' => $this->l('Settings') ), 'input' => array( - array( - 'type' => 'free', - 'label' => $this->l('Feed URL'), - 'name' => 'feed' - ), - array( - 'type' => 'free', - 'label' => $this->l('Generator URL'), - 'name' => 'generate' - ), array( 'type' => 'select', 'label' => $this->l('Carrier:'), @@ -146,57 +160,90 @@ protected function renderForm() 'title' => $this->l('Save') ) ) + ), + array( + 'form' => array( + 'legend' => array( + 'title' => $this->l('Feed Generator') + ), + 'input' => array( + array( + 'type' => 'free', + 'label' => $this->l('Generator URL'), + 'name' => 'generate' + ) + ), + 'submit' => array( + 'title' => $this->l('Save') + ) + ) + ), + array( + 'form' => array( + 'legend' => array( + 'title' => $this->l('Trovaprezzi') + ), + 'input' => array( + array( + 'type' => 'free', + 'label' => $this->l('Feed URL'), + 'name' => 'feed_trovaprezzi' + ), + array( + 'type' => 'free', + 'label' => $this->l('Generator URL'), + 'name' => 'generate_trovaprezzi' + ) + ), + 'submit' => array( + 'title' => $this->l('Save') + ) + ) + ), + array( + 'form' => array( + 'legend' => array( + 'title' => $this->l('Google') + ), + 'input' => array( + array( + 'type' => 'free', + 'label' => $this->l('Feed URL'), + 'name' => 'feed_google' + ), + array( + 'type' => 'free', + 'label' => $this->l('Generator URL'), + 'name' => 'generate_google' + ) + ), + 'submit' => array( + 'title' => $this->l('Save') + ) + ) ) - ); - - $helper = new HelperForm(); - $helper->module = $this; - $helper->name_controller = 'pitticatrovaprezzi'; - $helper->identifier = $this->identifier; - $helper->token = Tools::getAdminTokenLite('AdminModules'); - $helper->currentIndex = AdminController::$currentIndex . '&configure=' . $this->name; - $helper->default_form_language = $lang; - $helper->allow_employee_form_lang = $lang; - $helper->title = $this->displayName; - $helper->submit_action = 'savepitticatrovaprezzi'; - - $feed = $this->context->link->getModuleLink($this->name, 'download', array( - 'token' => $this->getToken() - )); - $generate = $this->context->link->getModuleLink($this->name, 'generate', array( - 'token' => $this->getToken() )); - $check = $this->context->link->getAdminLink('AdminTrovaprezzi'); - - $helper->fields_value = array( - 'feed' => $this->l('XML Feed URL:') . '
' . $feed . '', - 'generate' => $this->l('Use this link to generate the XML Feed:') . '
' . $generate . '', - 'carrier' => Configuration::get('PITTICA_TROVAPREZZI_CARRIER'), - 'check' => '' . $this->l('Check non-compliant products.') . '' - ); - - return $helper->generateForm($fields_form); } - + public function hookDisplayFooterAfter($params) { return $this->display(__FILE__, 'displayFooterAfter.tpl'); } - - public function getFilePath() + + public function getFilePath($file = 'trovaprezzi') { - return _PS_MODULE_DIR_ . $this->name . DIRECTORY_SEPARATOR . 'output.xml'; + return _PS_MODULE_DIR_ . $this->name . DIRECTORY_SEPARATOR . 'output' . DIRECTORY_SEPARATOR . $file . '.xml'; } - + public function getToken() { return Tools::hash(Configuration::get('PS_SHOP_DOMAIN')); } - + public function updateProducts() { TrovaprezziOffer::truncate(); - + $lang = (int) Configuration::get('PS_LANG_DEFAULT'); $root = (int) Configuration::get('PS_ROOT_CATEGORY'); $home = (int) Configuration::get('PS_HOME_CATEGORY'); @@ -204,44 +251,44 @@ public function updateProducts() $carrier = (int) Configuration::get('PITTICA_TROVAPREZZI_CARRIER'); $country = new Country((int) Configuration::get('PS_COUNTRY_DEFAULT')); $products = Product::getProducts($lang, 0, 0, 'id_product', 'ASC', false, true); - + foreach ($products as $p) { $product = new Product((int) $p['id_product'], $lang); $attributes = $product->getAttributesResume($lang, ': '); $categories = array(); $cat = ''; - + foreach (Product::getProductCategoriesFull($product->id, $lang) as $category) { if ($category['id_category'] != $root && $category['id_category'] != $home) { $categories[] = $category['name']; } - + if ($category['id_category'] == $product->id_category_default) { $cat = $category['link_rewrite']; } } - + if (!empty($attributes)) { foreach ($attributes as $attribute) { if ((int) $attribute['quantity'] > 0) { $cart = $this->getCart($currency, $carrier, $lang); $images = array(); $minimal = (!empty($attribute['minimal_quantity']) && $attribute['minimal_quantity'] > 0) ? (int) $attribute['minimal_quantity'] : 1; - + foreach (Image::getImages($lang, $product->id, (int) $attribute['id_product_attribute']) as $image) { $images[] = $this->context->link->getImageLink($this->getImageRewrite($product, $lang), $image['id_image']); } - + $cart->updateQty($minimal, $product->id, (int) $attribute['id_product_attribute']); - + $cover = Image::getGlobalCover($product->id); - + if (!empty($cover)) { $cover = $this->context->link->getImageLink($this->getImageRewrite($product, $lang), (int) $cover['id_image']); } else { $cover = ''; } - + $offer = new TrovaprezziOffer(); $offer->id_product = $product->id; $offer->id_product_attribute = (int) $attribute['id_product_attribute']; @@ -262,7 +309,7 @@ public function updateProducts() $offer->weight = (float) $attribute['weight'] + (float) $product->weight; $offer->active = $product->active; $offer->add(); - + $cart->delete(); } } @@ -271,13 +318,13 @@ public function updateProducts() $images = array(); $cart = $this->getCart($currency, $carrier, $lang); $minimal = $product->minimal_quantity > 0 ? (int) $product->minimal_quantity : 1; - + foreach (Image::getImages($lang, $product->id) as $image) { $images[] = $this->context->link->getImageLink($this->getImageRewrite($product, $lang), $image['id_image']); } - + $cart->updateQty($minimal, $product->id); - + $offer = new TrovaprezziOffer(); $offer->id_product = $product->id; $offer->name = is_array($product->name) ? $product->name[$lang] : $product->name; @@ -296,45 +343,33 @@ public function updateProducts() $offer->ean_code = $product->ean13; $offer->weight = (float) $product->weight; $offer->add(); - + $cart->delete(); } } } } - - public function generate($refresh = true) + + public function generate($refresh = true, $provider = null) { if ($refresh) { $this->updateProducts(); } - - $xml = new XmlWriter(); - $xml->openUri($this->getFilePath()); - $xml->startDocument('1.0', 'UTF-8'); - $xml->startElement('Products'); - - $offers = TrovaprezziOffer::getOffers(); - - foreach ($offers as $offer) { - if ($offer->active) { - $xml->startElement('Offer'); - - foreach ($offer->toArray() as $key => $element) { - $xml->writeElement($key, $element); - } - - $xml->endElement(); - } + + $providers = Provider::getProviders(); + + if ($provider && in_array($provider, $providers)) { + $providers = array($provider); + } + + foreach ($providers as $p) { + $object = Provider::getProvider($p); + $object->generate($this->getFilePath($p)); } - - $xml->endElement(); - $xml->endDocument(); - $xml->flush(); - + return true; } - + protected function getCart($currency, $carrier, $lang) { $cart = new Cart(0); @@ -342,10 +377,10 @@ protected function getCart($currency, $carrier, $lang) $cart->id_lang = $lang; $cart->id_carrier = $carrier; $cart->save(); - + return $cart; } - + protected function getImageRewrite($product, $lang) { if (!empty($product->link_rewrite)) { @@ -354,9 +389,29 @@ protected function getImageRewrite($product, $lang) return is_array($product->name) && !empty($product->name[$lang]) ? $product->name[$lang] : $product->name; } } - + protected function clearDescription($product, $lang) { return trim(trim(strip_tags(is_array($product->description_short) ? $product->description_short[$lang] : $product->description_short), PHP_EOL), ' '); } + + protected function getGenerateFeedHtml($provider) + { + $url = $this->context->link->getModuleLink($this->name, 'generate', array( + 'provider' => $provider, + 'token' => $this->getToken() + )); + + return $this->l('Use this link to generate the XML Feed:') . '
' . $url . ''; + } + + protected function getViewFeedHtml($provider) + { + $url = $this->context->link->getModuleLink($this->name, 'download', array( + 'provider' => $provider, + 'token' => $this->getToken() + )); + + return $this->l('XML Feed URL:') . '
' . $url . ''; + } } diff --git a/translations/it.php b/translations/it.php index a291692..550c55b 100644 --- a/translations/it.php +++ b/translations/it.php @@ -5,15 +5,18 @@ $_MODULE['<{pitticatrovaprezzi}prestashop>pitticatrovaprezzi_ec2dea077564d3b9e95c613fc53e5ec4'] = 'TrovaPrezzi'; $_MODULE['<{pitticatrovaprezzi}prestashop>pitticatrovaprezzi_63c642e1a2ea3f6d8e5e9c818c6bad50'] = 'Crea un feed XML per TrovaPrezzi.it'; $_MODULE['<{pitticatrovaprezzi}prestashop>pitticatrovaprezzi_f38f5974cdc23279ffe6d203641a8bdf'] = 'Impostazioni aggiornate.'; +$_MODULE['<{pitticatrovaprezzi}prestashop>pitticatrovaprezzi_7860766e05f963cf95a0643ea97c0065'] = 'Controlla i prodotti non conformi'; $_MODULE['<{pitticatrovaprezzi}prestashop>pitticatrovaprezzi_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; -$_MODULE['<{pitticatrovaprezzi}prestashop>pitticatrovaprezzi_62eed6de426b4045d6bcc98d606ade57'] = 'URL del Feed'; -$_MODULE['<{pitticatrovaprezzi}prestashop>pitticatrovaprezzi_8305f92d6e8ea660f655950a4b881b2e'] = 'URL del Generatore'; $_MODULE['<{pitticatrovaprezzi}prestashop>pitticatrovaprezzi_f8617a92ba0a0a4eabee724eab7c9f48'] = 'Corriere:'; $_MODULE['<{pitticatrovaprezzi}prestashop>pitticatrovaprezzi_f7c80edabe1d2fd194093395699df3db'] = 'Controlla Prodotti'; $_MODULE['<{pitticatrovaprezzi}prestashop>pitticatrovaprezzi_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; -$_MODULE['<{pitticatrovaprezzi}prestashop>pitticatrovaprezzi_ba0745fb57938be1f08b7b4fec83071b'] = 'URL del Feed XML:'; +$_MODULE['<{pitticatrovaprezzi}prestashop>pitticatrovaprezzi_c037d187c516f1bbbada677227e4b603'] = 'Generatore Feed'; +$_MODULE['<{pitticatrovaprezzi}prestashop>pitticatrovaprezzi_8305f92d6e8ea660f655950a4b881b2e'] = 'URL del Generatore'; +$_MODULE['<{pitticatrovaprezzi}prestashop>pitticatrovaprezzi_b1ebfda20713b83d86f022bc5f766e48'] = 'Trovaprezzi'; +$_MODULE['<{pitticatrovaprezzi}prestashop>pitticatrovaprezzi_62eed6de426b4045d6bcc98d606ade57'] = 'URL del Feed'; +$_MODULE['<{pitticatrovaprezzi}prestashop>pitticatrovaprezzi_8b36e9207c24c76e6719268e49201d94'] = 'Google'; $_MODULE['<{pitticatrovaprezzi}prestashop>pitticatrovaprezzi_cdfc93793765e417bb1b1179b93fc0eb'] = 'Utilizza questo link per generare il link del Feed XML:'; -$_MODULE['<{pitticatrovaprezzi}prestashop>pitticatrovaprezzi_7860766e05f963cf95a0643ea97c0065'] = 'Controlla i prodotti non conformi'; +$_MODULE['<{pitticatrovaprezzi}prestashop>pitticatrovaprezzi_ba0745fb57938be1f08b7b4fec83071b'] = 'URL del Feed XML:'; $_MODULE['<{pitticatrovaprezzi}prestashop>admintrovaprezzicontroller_deb10517653c255364175796ace3553f'] = 'Prodotto'; $_MODULE['<{pitticatrovaprezzi}prestashop>admintrovaprezzicontroller_ca0dbad92a874b2f69b549293387925e'] = 'Codice'; $_MODULE['<{pitticatrovaprezzi}prestashop>admintrovaprezzicontroller_be53a0541a6d36f6ecb879fa2c584b08'] = 'Immagine';