%PDF- %PDF-
| Direktori : /home1/lightco1/www/plugins/csviaddon/virtuemart/com_virtuemart/model/ |
| Current File : //home1/lightco1/www/plugins/csviaddon/virtuemart/com_virtuemart/model/maintenance.php |
<?php
/**
* @package CSVI
* @subpackage VirtueMart
*
* @author Roland Dalmulder <contact@csvimproved.com>
* @copyright Copyright (C) 2006 - 2015 RolandD Cyber Produksi. All rights reserved.
* @license GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
* @link http://www.csvimproved.com
*/
defined('_JEXEC') or die;
/**
* VirtueMart maintenance.
*
* @package CSVI
* @subpackage VirtueMart
* @since 6.0
*/
class Com_VirtuemartMaintenance
{
/**
* Database connector
*
* @var JDatabaseDriver
* @since 6.0
*/
private $db = null;
/**
* Logger helper
*
* @var CsviHelperLog
* @since 6.0
*/
private $log = null;
/**
* CSVI Helper.
*
* @var CsviHelperCsvi
* @since 6.0
*/
private $csvihelper = null;
/**
* The categories in the system
*
* @var array
* @since 3.0
*/
private $categories = array();
/**
* A list of levels deep per category
*
* @var array
* @since 3.0
*/
private $catlevels = array();
/**
* A list of subcategories per category
*
* @var array
* @since 3.0
*/
private $catpaths = array();
/**
* Constructor.
*
* @param JDatabase $db The database class
* @param CsviHelperLog $log The CSVI logger
* @param CsviHelperCsvi $csvihelper The CSVI helper
*
* @since 6.0
*/
public function __construct($db, $log, $csvihelper)
{
$this->db = $db;
$this->log = $log;
$this->csvihelper = $csvihelper;
}
/**
* Load a number of maintenance tasks.
*
* @return array List of available operations.
*
* @since 6.0
*/
public function getOperations()
{
return array('options' => array(
'' => JText::_('COM_CSVI_MAKE_CHOICE'),
'sortcategories' => JText::_('COM_CSVI_SORTCATEGORIES_LABEL'),
'removeemptycategories' => JText::_('COM_CSVI_REMOVEEMPTYCATEGORIES_LABEL'),
'removeproductprices' => JText::_('COM_CSVI_REMOVEPRODUCTPRICES_LABEL'),
'unpublishproductbycategory' => JText::_('COM_CSVI_UNPUBLISHPRODUCTBYCATEGORY_LABEL'),
'removeproductmedialink' => JText::_('COM_CSVI_REMOVEPRODUCTMEDIALINK_LABEL'),
'backupvm' => JText::_('COM_CSVI_BACKUPVM_LABEL'),
'emptydatabase' => JText::_('COM_CSVI_EMPTYDATABASE_LABEL'),
'vmexchangerates' => JText::_('COM_CSVI_VMEXCHANGERATES_LABEL'),
'ecbexchangerates' => JText::_('COM_CSVI_ECBEXCHANGERATES_LABEL')
)
);
}
/**
* Load the options for a selected operation.
*
* @param string $operation The operation to get the options for
*
* @return string The options for a selected operation.
*
* @since 6.0
*/
public function getOptions($operation)
{
switch ($operation)
{
case 'sortcategories':
$language = JFactory::getLanguage();
$known = $language->getKnownLanguages();
$options = array();
foreach ($known as $lang)
{
$options[] = JHtml::_('select.option', str_replace('-', '_', strtolower($lang['tag'])), $lang['name']);
}
return '<div class="control-group ">
<div class="control-label">
<label title="" class="hasTooltip" for="jform_title" id="jform_title-lbl" data-original-title=" ' . JText::_('COM_CSVI_LANGUAGE_DESC') . '">
' . JText::_('COM_CSVI_SORTCATEGORIES_LABEL') . '
</label>
</div>
<div class="controls">
' . JHtml::_('select.genericlist', $options, 'form[language]') . '
</div>
</div>';
break;
case 'removeemptycategories':
$layout = new JLayoutFile('csvi.modal');
return $layout->render(
array(
'modal-header' => JText::_('COM_CSVI_' . $operation . '_LABEL'),
'modal-body' => JText::_('COM_CSVI_CONFIRM_CATEGORY_DELETE'),
'cancel-button' => true
));
break;
case 'emptydatabase':
$layout = new JLayoutFile('csvi.modal');
$html = '<span class="help-block">' . JText::_('COM_CSVI_' . $operation . '_DESC') . '</span>';
$html .= $layout->render(
array(
'modal-header' => JText::_('COM_CSVI_' . $operation . '_LABEL'),
'modal-body' => JText::_('COM_CSVI_CONFIRM_DB_DELETE'),
'cancel-button' => true
));
return $html;
break;
default:
return '<span class="help-block">' . JText::_('COM_CSVI_' . $operation . '_DESC') . '</span>';
break;
}
}
/**
* Sorts all VirtueMart categories in alphabetical order.
*
* @return bool True if categories are sorted | False if an error occured.
*
* @since 3.0
*/
public function sortCategories(FOFInput $input)
{
$jinput = JFactory::getApplication()->input;
$linenumber = 1;
// Load the form values
$language = $input->get('language');
// Check if the table exists
$tables = $this->db->getTableList();
if (!in_array($this->db->getPrefix() . 'virtuemart_categories_' . $language, $tables))
{
$this->log->addStats('information', JText::sprintf('COM_CSVI_LANG_TABLE_NOT_EXIST', $language));
}
else
{
// Get all categories
$query = $this->db->getQuery(true);
$query->select('LOWER(' . $this->db->quoteName('category_name') . ') AS ' . $this->db->quoteName('category_name'));
$query->select($this->db->quoteName('category_child_id', 'cid'));
$query->select($this->db->quoteName('category_parent_id', 'pid'));
$query->from($this->db->quoteName('#__virtuemart_categories', 'c'));
$query->leftJoin(
$this->db->quoteName('#__virtuemart_category_categories', 'cc')
. ' ON ' . $this->db->quoteName('c.virtuemart_category_id') . ' = ' . $this->db->quoteName('cc.category_child_id')
);
$query->leftJoin(
$this->db->quoteName('#__virtuemart_categories_' . $language, 'cl')
. ' ON ' . $this->db->quoteName('cc.category_child_id') . ' = ' . $this->db->quoteName('cl.virtuemart_category_id')
);
// Execute the query
$this->db->setQuery($query);
$records = $this->db->loadObjectList();
if (count($records) > 0)
{
$categories = array();
// Group all categories together according to their level
foreach ($records as $record)
{
$categories[$record->pid][$record->cid] = $record->category_name;
}
// Sort the categories and store the item list
foreach ($categories as $category)
{
asort($category);
$listorder = 1;
foreach ($category as $category_id => $category_name)
{
// Store the new sort order
$query = $this->db->getQuery(true);
$query->update($this->db->quoteName('#__virtuemart_categories'));
$query->set($this->db->quoteName('ordering') . ' = ' . $this->db->quote($listorder));
$query->where($this->db->quoteName('virtuemart_category_id') . ' = ' . (int) $category_id);
$this->db->setQuery($query);
$this->db->execute();
// Set the line number
$this->log->setLinenumber($linenumber++);
$this->log->addStats('information', JText::sprintf('COM_CSVI_SAVED_CATEGORY', $category_name, $listorder));
$listorder++;
}
}
// Store the log count
$linenumber--;
$jinput->set('logcount', $linenumber);
}
else
{
$this->log->addStats('information', 'COM_CSVI_NO_CATEGORIES_FOUND');
}
}
return true;
}
/**
* Remove all categories that have no products
* Parent categories are only deleted if there are no more children left.
*
* @return bool Always returns true.
*
* @since 3.0
*/
public function removeEmptyCategories()
{
$this->getCategoryTreeModule();
arsort($this->catlevels);
foreach ($this->catlevels as $catid => $nrlevels)
{
// Check if there are any products in the category
$this->db->setQuery($this->getCatQuery($catid));
if ($this->db->loadResult() > 0 && array_key_exists($catid, $this->catpaths))
{
foreach ($this->catpaths[$catid] as $level)
{
unset($this->catpaths[$level]);
unset($this->catlevels[$level]);
}
unset($this->catpaths[$catid]);
unset($this->catlevels[$catid]);
}
else
{
if (array_key_exists($catid, $this->catpaths))
{
foreach ($this->catpaths[$catid] as $level)
{
$this->db->setQuery($this->getCatQuery($level));
if ($this->db->loadResult() > 0)
{
unset($this->catpaths[$level]);
unset($this->catlevels[$level]);
}
}
}
}
}
$delcats = array_keys($this->catpaths);
if (!empty($delcats))
{
// Remove all categories except the ones we have
$query = $this->db->getQuery(true)
->delete($this->db->quoteName('#__virtuemart_categories'))
->where($this->db->quoteName('virtuemart_category_id') . ' IN (' . implode(', ', $delcats) . ')');
$this->db->setQuery($query);
if ($this->db->execute())
{
$this->log->addStats('deleted', 'COM_CSVI_MAINTENANCE_CATEGORIES_DELETED');
}
else
{
$this->log->addStats('incorrect', 'COM_CSVI_MAINTENANCE_CATEGORIES_NOT_DELETED');
}
// Remove all category parent-child relations except the ones we have
$query = $this->db->getQuery(true)
->delete($this->db->quoteName('#__virtuemart_category_categories'))
->where($this->db->quoteName('category_child_id') . ' IN (' . implode(', ', $delcats) . ')');
$this->db->setQuery($query);
if ($this->db->execute())
{
$this->log->addStats('deleted', 'COM_CSVI_MAINTENANCE_CATEGORIES_XREF_DELETED');
}
else
{
$this->log->addStats('incorrect', 'COM_CSVI_MAINTENANCE_CATEGORIES_XREF_NOT_DELETED');
}
// Delete category translations
jimport('joomla.language.helper');
$languages = array_keys(JLanguageHelper::getLanguages('lang_code'));
foreach ($languages as $language)
{
$query = $this->db->getQuery(true)
->delete($this->db->quoteName('#__virtuemart_categories_' . strtolower(str_replace('-', '_', $language))))
->where($this->db->quoteName('virtuemart_category_id') . ' IN (' . implode(', ', $delcats) . ')');
$this->db->setQuery($query);
$this->log->add(JText::_('COM_CSVI_DEBUG_DELETE_CATEGORY_LANG_XREF'), true);
$this->db->execute();
}
// Delete media
$query = $this->db->getQuery(true)
->delete($this->db->quoteName('#__virtuemart_category_medias'))
->where($this->db->quoteName('virtuemart_category_id') . ' IN (' . implode(', ', $delcats) . ')');
$this->db->setQuery($query);
$this->log->add(JText::_('COM_CSVI_DEBUG_DELETE_MEDIA_XREF'), true);
$this->db->execute();
}
else
{
$this->log->addStats('information', 'COM_CSVI_NO_CATEGORIES_FOUND');
}
return true;
}
/**
* This function is repsonsible for returning an array containing category information.
*
* @return bool False if no categories are found.
*
* @since 2.3.6
*/
private function getCategoryTreeModule()
{
$query = $this->db->getQuery(true);
// Get all categories
$query->select($this->db->quoteName('category_child_id', 'cid') . ',' . $this->db->quoteName('category_parent_id', 'pid'))
->from($this->db->quoteName('#__virtuemart_categories', 'c'))
->leftJoin(
$this->db->quoteName('#__virtuemart_category_categories', 'x')
. ' ON ' . $this->db->quoteName('c.virtuemart_category_id') . ' = ' . $this->db->quoteName('x.category_child_id')
);
// Execute the query
$this->db->setQuery($query);
$records = $this->db->loadObjectList();
// Check if there are any records
if (count($records) == 0)
{
$this->categories = false;
return false;
}
else
{
$this->categories = array();
// Group all categories together according to their level
foreach ($records as $record)
{
$this->categories[$record->pid][$record->cid]["category_id"] = $record->pid;
$this->categories[$record->pid][$record->cid]["category_child_id"] = $record->cid;
}
}
$catpath = array();
krsort($this->categories);
foreach ($this->categories as $pid => $categories)
{
foreach ($categories as $cid => $category)
{
$catpath[$cid] = $pid;
}
// Free up memory
unset($this->categories[$pid]);
}
// Clean up unused array
unset($this->categories);
foreach ($catpath as $cid => $value)
{
$catlevel = $value;
$this->catpaths[$cid][] = $catlevel;
while ($catlevel > 0)
{
$this->catpaths[$cid][] = $catpath[$catlevel];
$catlevel = $catpath[$catlevel];
}
// Clean up for some memory
unset($catpath[$cid]);
}
// Clean up unused array
unset($catpath);
foreach ($this->catpaths as $cid => $paths)
{
$this->catlevels[$cid] = count($paths);
}
return true;
}
/**
* Construct a query to count the number of references to a category.
*
* @param int $catid The ID of the category to filter on
*
* @return JDatabaseQuery A JDatabaseQuery object.
*
* @since 3.0
*/
private function getCatQuery($catid)
{
$query = $this->db->getQuery(true)
->select('COUNT(*)')
->from($this->db->quoteName('#__virtuemart_product_categories'))
->where($this->db->quoteName('virtuemart_category_id') . ' = ' . (int) $catid);
return $query;
}
/**
* Remove all product prices.
*
* @return bool Always returns true.
*
* @since 5.9.5
*/
public function removeProductPrices()
{
$this->db->truncateTable('#__virtuemart_product_prices');
$this->log->setLineNumber(1);
$this->log->addStats('empty', JText::_('COM_CSVI_VM_PRICES_EMPTIED'));
return true;
}
/**
* Unpublish products in unpublished categories.
*
* @return bool Always returns true.
*
* @since 3.5
*/
public function unpublishProductByCategory()
{
$this->log->setLineNumber(1);
$query = $this->db->getQuery(true)
->select($this->db->quoteName('p.virtuemart_product_id'))
->from($this->db->quoteName('#__virtuemart_products', 'p'))
->innerJoin(
$this->db->quoteName('#__virtuemart_product_categories', 'pc')
. ' ON ' . $this->db->quoteName('p.virtuemart_product_id') . ' = ' . $this->db->quoteName('pc.virtuemart_product_id')
)
->innerJoin(
$this->db->quoteName('#__virtuemart_categories', 'c')
. ' ON ' . $this->db->quoteName('pc.virtuemart_category_id') . ' = ' . $this->db->quoteName('c.virtuemart_category_id')
)
->where($this->db->quoteName('p.published') . ' = 1')
->where($this->db->quoteName('c.published') . ' = 0');
$this->db->setQuery($query);
$ids = $this->db->loadColumn();
if (!empty($ids))
{
// Unpublish the IDs
$query = $this->db->getQuery(true)
->update($this->db->quoteName('#__virtuemart_products'))
->set($this->db->quoteName('published') . ' = 0')
->where($this->db->quoteName('virtuemart_product_id') . ' IN (' . implode(',', $ids) . ')');
$this->db->setQuery($query);
if ($this->db->execute())
{
//$jinput->set('linesprocessed', $this->db->getAffectedRows());
$this->log->addStats('updated', JText::sprintf('COM_CSVI_PRODUCTS_UNPUBLISHED', $this->db->getAffectedRows()));
}
else
{
$this->log->addStats('incorrect', JText::sprintf('COM_CSVI_PRODUCTS_NOT_UNPUBLISHED', $this->db->getErrorMsg()));
}
}
else
{
$this->log->addStats('information', 'COM_CSVI_PRODUCTS_NOT_FOUND');
}
return true;
}
/**
* Remove any links between products and media items.
*
* @return bool Always returns true.
*
* @since 3.0
*/
public function removeProductMediaLink()
{
$this->log->setLineNumber(1);
$this->db->truncateTable('#__virtuemart_product_medias');
$this->log->addStats('information', JText::_('COM_CSVI_PRODUCT_MEDIA_LINK_REMOVED'));
return true;
}
/**
* Export all VirtueMart tables.
*
* @return bool Always returns true.
*
* @since 3.0
*/
public function backupVm()
{
jimport('joomla.filesystem.file');
jimport('joomla.filesystem.folder');
$jinput = JFactory::getApplication()->input;
$filepath = JPATH_SITE . '/tmp/com_csvi';
$filename = 'virtuemart_' . time() . '.sql';
$file = $filepath . '/' . $filename;
$sqlstring = '';
$fp = fopen($file, "w+");
if ($fp)
{
// Load a list of VirtueMart tables
$q = "SHOW TABLES LIKE '" . $this->db->getPrefix() . "virtuemart\_%'";
$this->db->setQuery($q);
$tables = $this->db->loadColumn();
$linenumber = 1;
foreach ($tables as $table)
{
$this->log->setLinenumber($linenumber);
// Get the create table statement
$q = "SHOW CREATE TABLE " . $table;
$this->db->setQuery($q);
$tcreate = $this->db->loadAssocList();
$sqlstring .= "-- Table structure for table " . $this->db->quoteName($table) . "\n\n";
$sqlstring .= $tcreate[0]['Create Table'] . ";\n\n";
// Check if there is any data in the table
$q = "SELECT COUNT(*) FROM " . $this->db->quoteName($table);
$this->db->setQuery($q);
$count = $this->db->loadResult();
if ($count > 0)
{
$sqlstring .= "-- Data for table " . $this->db->quoteName($table) . "\n\n";
// Get the field names
$q = "SHOW COLUMNS FROM " . $this->db->quoteName($table);
$this->db->setQuery($q);
$fields = $this->db->loadObjectList();
$sqlstring .= 'INSERT INTO ' . $this->db->quoteName($table) . ' (';
foreach ($fields as $field)
{
$sqlstring .= $this->db->quoteName($field->Field) . ',';
}
$sqlstring = substr(trim($sqlstring), 0, -1) . ") VALUES \n";
$start = 0;
while ($count > 0)
{
$q = "SELECT * FROM " . $table . " LIMIT " . $start . ", 50";
$this->db->setQuery($q);
$records = $this->db->loadAssocList();
// Add the values
foreach ($records as $record)
{
foreach ($record as $rkey => $value)
{
if (!is_numeric($value))
{
$record[$rkey] = $this->db->quote($value);
}
else
{
$record[$rkey] = $value;
}
}
$sqlstring .= '(' . implode(',', $record) . "),\n";
}
$start += 50;
$count -= 50;
// Fix the end of the query
if ($count < 1)
{
$sqlstring = substr(trim($sqlstring), 0, -1) . ";\n";
}
// Add a linebreak
$sqlstring .= "\n\n";
// Write the data to the file
fwrite($fp, $sqlstring);
// Empty the string
$sqlstring = '';
}
// Update the log
$this->log->addStats('added', JText::sprintf('COM_CSVI_BACKUP_COMPLETE_FOR', $table));
$linenumber++;
}
}
// Store the log count
$linenumber--;
$jinput->set('logcount', $linenumber);
// Zip up the file
jimport('joomla.filesystem.archive');
$zip = JArchive::getAdapter('zip');
$files = array();
$files[] = array('name' => $filename, 'time' => filemtime($file), 'data' => JFile::read($file));
if ($zip->create($filepath . '/' . $filename . '.zip', $files))
{
// Close the file
fclose($fp);
// Remove the SQL file
JFile::delete($file);
// Add a download link for the backup
$this->log->setFilename(JHtml::link(JURI::root() . 'tmp/com_csvi/' . $filename . '.zip', JText::_('COM_CSVI_BACKUP_DOWNLOAD_LINK')));
}
else
{
$this->log->addStats('incorrect', 'COM_CSVI_BACKUP_NO_ZIP_CREATE');
$this->log->setFilename($filepath . '/' . $filename);
}
}
else
{
$this->log->addStats('incorrect', JText::sprintf('COM_CSVI_COULD_NOT_OPEN_FILE', $file));
}
return true;
}
/**
* Empty VirtueMart tables.
*
* @return bool Always returns true.
*
* @since 3.0
*/
public function emptyDatabase()
{
$linenumber = 1;
jimport('joomla.language.helper');
$languages = array_keys(JLanguageHelper::getLanguages('lang_code'));
$tables = $this->db->getTableList();
// Empty all the necessary tables
$this->log->setLinenumber($linenumber++);
$q = 'TRUNCATE TABLE ' . $this->db->quoteName('#__virtuemart_products');
$this->db->setQuery($q);
$this->log->add('Empty product table', true);
if ($this->db->execute())
{
$this->log->addStats('empty', 'COM_CSVI_PRODUCT_TABLE_HAS_BEEN_EMPTIED');
}
else
{
$this->log->addStats('incorrect', 'COM_CSVI_PRODUCT_TABLE_HAS_NOT_BEEN_EMPTIED');
}
foreach ($languages as $language)
{
$table = $this->db->getPrefix() . 'virtuemart_products_' . strtolower(str_replace('-', '_', $language));
if (in_array($table, $tables))
{
$q = 'TRUNCATE TABLE ' . $this->db->quoteName($table) . ';';
$this->db->setQuery($q);
$this->log->add('Empty product language table', true);
if ($this->db->execute())
{
$this->log->addStats('empty', JText::sprintf('COM_CSVI_PRODUCT_LANGUAGE_TABLE_HAS_BEEN_EMPTIED', $language));
}
else
{
$this->log->addStats('incorrect', JText::sprintf('COM_CSVI_PRODUCT_LANGUAGE_TABLE_HAS_NOT_BEEN_EMPTIED', $language));
}
}
}
$this->log->setLinenumber($linenumber++);
$q = 'TRUNCATE TABLE ' . $this->db->quoteName('#__virtuemart_product_categories');
$this->db->setQuery($q);
$this->log->add('Empty product category link table', true);
if ($this->db->execute())
{
$this->log->addStats('empty', 'COM_CSVI_PRODUCT_CATEGORY_LINK_TABLE_HAS_BEEN_EMPTIED');
}
else
{
$this->log->addStats('incorrect', 'COM_CSVI_PRODUCT_CATEGORY_LINK_TABLE_HAS_NOT_BEEN_EMPTIED');
}
$this->log->setLinenumber($linenumber++);
$q = 'TRUNCATE TABLE ' . $this->db->quoteName('#__virtuemart_product_customfields');
$this->db->setQuery($q);
$this->log->add('Empty product custom fields table', true);
if ($this->db->execute())
{
$this->log->addStats('empty', 'COM_CSVI_PRODUCT_CUSTOMFIELDS_TABLE_HAS_BEEN_EMPTIED');
}
else
{
$this->log->addStats('incorrect', 'COM_CSVI_PRODUCT_CUSTOMFIELDS_TABLE_HAS_NOT_BEEN_EMPTIED');
}
$this->log->setLinenumber($linenumber++);
$q = 'TRUNCATE TABLE ' . $this->db->quoteName('#__virtuemart_product_manufacturers');
$this->db->setQuery($q);
$this->log->add('Empty product manufacturer link table', true);
if ($this->db->execute())
{
$this->log->addStats('empty', 'COM_CSVI_PRODUCT_MANUFACTURER_LINK_TABLE_HAS_BEEN_EMPTIED');
}
else
{
$this->log->addStats('incorrect', 'COM_CSVI_PRODUCT_MANUFACTURER_LINK_TABLE_HAS_NOT_BEEN_EMPTIED');
}
$this->log->setLinenumber($linenumber++);
$q = 'TRUNCATE TABLE ' . $this->db->quoteName('#__virtuemart_product_medias');
$this->db->setQuery($q);
$this->log->add('Empty product medias table', true);
if ($this->db->execute())
{
$this->log->addStats('empty', 'COM_CSVI_PRODUCT_MEDIAS_TABLE_HAS_BEEN_EMPTIED');
}
else
{
$this->log->addStats('incorrect', 'COM_CSVI_PRODUCT_MEDIAS_TABLE_HAS_NOT_BEEN_EMPTIED');
}
$this->log->setLinenumber($linenumber++);
$q = 'TRUNCATE TABLE ' . $this->db->quoteName('#__virtuemart_product_prices');
$this->db->setQuery($q);
$this->log->add('Empty product price table', true);
if ($this->db->execute())
{
$this->log->addStats('empty', 'COM_CSVI_PRODUCT_PRICE_TABLE_HAS_BEEN_EMPTIED');
}
else
{
$this->log->addStats('incorrect', 'COM_CSVI_PRODUCT_PRICE_TABLE_HAS_NOT_BEEN_EMPTIED');
}
$this->log->setLinenumber($linenumber++);
$q = 'TRUNCATE TABLE ' . $this->db->quoteName('#__virtuemart_product_shoppergroups');
$this->db->setQuery($q);
$this->log->add('Empty product shoppergroups table', true);
if ($this->db->execute())
{
$this->log->addStats('empty', 'COM_CSVI_PRODUCT_SHOPPERGROUPS_TABLE_HAS_BEEN_EMPTIED');
}
else
{
$this->log->addStats('incorrect', 'COM_CSVI_PRODUCT_SHOPPERGROUPS_TABLE_HAS_NOT_BEEN_EMPTIED');
}
$this->log->setLinenumber($linenumber++);
$q = 'TRUNCATE TABLE ' . $this->db->quoteName('#__virtuemart_categories');
$this->db->setQuery($q);
$this->log->add('Empty category table', true);
if ($this->db->execute())
{
$this->log->addStats('empty', 'COM_CSVI_CATEGORY_TABLE_HAS_BEEN_EMPTIED');
}
else
{
$this->log->addStats('incorrect', 'COM_CSVI_CATEGORY_TABLE_HAS_NOT_BEEN_EMPTIED');
}
foreach ($languages as $language)
{
$table = $this->db->getPrefix() . 'virtuemart_categories_' . strtolower(str_replace('-', '_', $language));
if (in_array($table, $tables))
{
$q = 'TRUNCATE TABLE ' . $this->db->quoteName($table) . ';';
$this->db->setQuery($q);
$this->log->add('Empty category language table', true);
if ($this->db->execute())
{
$this->log->addStats('empty', JText::sprintf('COM_CSVI_CATEGORY_LANGUAGE_TABLE_HAS_BEEN_EMPTIED', $language));
}
else
{
$this->log->addStats('incorrect', JText::sprintf('COM_CSVI_CATEGORY_LANGUAGE_TABLE_HAS_NOT_BEEN_EMPTIED', $language));
}
}
}
$this->log->setLinenumber($linenumber++);
$q = 'TRUNCATE TABLE ' . $this->db->quoteName('#__virtuemart_category_categories');
$this->db->setQuery($q);
$this->log->add('Empty category link table', true);
if ($this->db->execute())
{
$this->log->addStats('empty', 'COM_CSVI_CATEGORY_LINK_TABLE_HAS_BEEN_EMPTIED');
}
else
{
$this->log->addStats('incorrect', 'COM_CSVI_CATEGORY_LINK_TABLE_HAS_NOT_BEEN_EMPTIED');
}
$this->log->setLinenumber($linenumber++);
$q = 'TRUNCATE TABLE ' . $this->db->quoteName('#__virtuemart_category_medias');
$this->db->setQuery($q);
$this->log->add('Empty category medias table', true);
if ($this->db->execute())
{
$this->log->addStats('empty', 'COM_CSVI_CATEGORY_MEDIAS_TABLE_HAS_BEEN_EMPTIED');
}
else
{
$this->log->addStats('incorrect', 'COM_CSVI_CATEGORY_MEDIAS_TABLE_HAS_NOT_BEEN_EMPTIED');
}
$this->log->setLinenumber($linenumber++);
$q = 'TRUNCATE TABLE ' . $this->db->quoteName('#__virtuemart_manufacturers');
$this->db->setQuery($q);
$this->log->add('Empty manufacturers table', true);
if ($this->db->execute())
{
$this->log->addStats('empty', 'COM_CSVI_MANUFACTURER_TABLE_HAS_BEEN_EMPTIED');
}
else
{
$this->log->addStats('incorrect', 'COM_CSVI_MANUFACTURER_TABLE_HAS_NOT_BEEN_EMPTIED');
}
// Empty manufacturer language table
foreach ($languages as $language)
{
$table = $this->db->getPrefix() . 'virtuemart_manufacturers_' . strtolower(str_replace('-', '_', $language));
if (in_array($table, $tables))
{
$q = 'TRUNCATE TABLE ' . $this->db->quoteName($table) . ';';
$this->db->setQuery($q);
$this->log->add('Empty manufacturer language table', true);
if ($this->db->execute())
{
$this->log->addStats('empty', JText::sprintf('COM_CSVI_MANUFACTURER_LANGUAGE_TABLE_HAS_BEEN_EMPTIED', $language));
}
else
{
$this->log->addStats('incorrect', JText::sprintf('COM_CSVI_MANUFACTURER_LANGUAGE_TABLE_HAS_NOT_BEEN_EMPTIED', $language));
}
}
}
$this->log->setLinenumber($linenumber++);
$q = 'TRUNCATE TABLE ' . $this->db->quoteName('#__virtuemart_manufacturercategories');
$this->db->setQuery($q);
$this->log->add('Empty manufacturer categories table', true);
if ($this->db->execute())
{
$this->log->addStats('empty', 'COM_CSVI_MANUFACTURER_CATEGORY_TABLE_HAS_BEEN_EMPTIED');
}
else
{
$this->log->addStats('incorrect', 'COM_CSVI_MANUFACTURER_CATEGORY_TABLE_HAS_NOT_BEEN_EMPTIED');
}
// Empty manufacturer language table
foreach ($languages as $language)
{
$table = $this->db->getPrefix() . 'virtuemart_manufacturercategories_' . strtolower(str_replace('-', '_', $language));
if (in_array($table, $tables))
{
$q = 'TRUNCATE TABLE ' . $this->db->quoteName($table) . ';';
$this->db->setQuery($q);
$this->log->add('Empty manufacturer categories language table', true);
if ($this->db->execute())
{
$this->log->addStats('empty', JText::sprintf('COM_CSVI_MANUFACTURER_LANGUAGE_TABLE_HAS_BEEN_EMPTIED', $language));
}
else
{
$this->log->addStats('incorrect', JText::sprintf('COM_CSVI_MANUFACTURER_LANGUAGE_TABLE_HAS_NOT_BEEN_EMPTIED', $language));
}
}
}
$this->log->setLinenumber($linenumber++);
$q = 'TRUNCATE TABLE ' . $this->db->quoteName('#__virtuemart_ratings');
$this->db->setQuery($q);
$this->log->add('Empty ratings table', true);
if ($this->db->execute())
{
$this->log->addStats('empty', 'COM_CSVI_RATINGS_TABLE_HAS_BEEN_EMPTIED');
}
else
{
$this->log->addStats('incorrect', 'COM_CSVI_RATINGS_TABLE_HAS_NOT_BEEN_EMPTIED');
}
$this->log->setLinenumber($linenumber++);
$q = 'TRUNCATE TABLE ' . $this->db->quoteName('#__virtuemart_rating_reviews');
$this->db->setQuery($q);
$this->log->add('Empty rating reviews table', true);
if ($this->db->execute())
{
$this->log->addStats('empty', 'COM_CSVI_RATING_REVIEWS_TABLE_HAS_BEEN_EMPTIED');
}
else
{
$this->log->addStats('incorrect', 'COM_CSVI_RATING_REVIEWS_TABLE_HAS_NOT_BEEN_EMPTIED');
}
$this->log->setLinenumber($linenumber++);
$q = 'TRUNCATE TABLE ' . $this->db->quoteName('#__virtuemart_rating_votes');
$this->db->setQuery($q);
$this->log->add('Empty rating votes table', true);
if ($this->db->execute())
{
$this->log->addStats('empty', 'COM_CSVI_RATING_VOTES_TABLE_HAS_BEEN_EMPTIED');
}
else
{
$this->log->addStats('incorrect', 'COM_CSVI_RATING_VOTES_TABLE_HAS_NOT_BEEN_EMPTIED');
}
// Store the log count
$linenumber--;
$this->log->setLineNumber($linenumber);
return true;
}
/**
* Load the exchange rates from VirtueMart.
*
* @return bool Always returns true.
*
* @since 3.0
*/
public function vmExchangeRates()
{
$jinput = JFactory::getApplication()->input;
$this->log->setLineNumber(1);
// Empty table
$this->db->truncateTable('#__csvi_currency');
// Add the Euro
$query = $this->db->getQuery(true)
->insert($this->db->quoteName('#__csvi_currency'))
->columns(array($this->db->quoteName('currency_code'), $this->db->quoteName('currency_rate')))
->values($this->db->quote('EUR') . ', 1');
$this->db->setQuery($query)->execute();
$squery = $this->db->getQuery(true)
->select(
array(
'null',
$this->db->quoteName('currency_code_3'),
$this->db->quoteName('currency_exchange_rate')
)
)
->from($this->db->quoteName('#__virtuemart_currencies'))
->where($this->db->quoteName('currency_exchange_rate') . ' > 0');
$q = "INSERT INTO " .
$this->db->quoteName('#__csvi_currency') .
"(" . $squery->__toString() . ")";
$this->db->setQuery($q);
if ($this->db->execute())
{
$this->log->addStats('added', JText::_('COM_CSVI_VM_EXCHANGE_RATES_LOADED'));
}
else
{
$this->log->addStats('incorrect', JText::_('COM_CSVI_VM_EXCHANGE_RATES_NOT_LOADED'));
}
// Store the log count
$jinput->set('linesprocessed', 1);
return true;
}
/**
* Add exchange rates
* The eurofxref-daily.xml file is updated daily between 14:15 and 15:00 CET.
*
* @return bool Always returns true.
*
* @since 3.0
*/
public function ecbExchangeRates()
{
$jinput = JFactory::getApplication()->input;
$linenumber = 1;
// Read eurofxref-daily.xml file in memory
$XMLContent = file("http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml");
// Process the file
if ($XMLContent)
{
// Empty table
$this->db->truncateTable('#__csvi_currency');
// Add the Euro
$query = $this->db->getQuery(true)
->insert($this->db->quoteName('#__csvi_currency'))
->columns(array($this->db->quoteName('currency_code'), $this->db->quoteName('currency_rate')))
->values($this->db->quote('EUR') . ', 1');
$this->db->setQuery($query)->execute();
$currencyCode = array();
$rate = array();
foreach ($XMLContent as $line)
{
if (preg_match("/currency='([[:alpha:]]+)'/", $line, $currencyCode))
{
if (preg_match("/rate='([[:graph:]]+)'/", $line, $rate))
{
$rate_name = 'COM_CSVI_EXCHANGE_RATE_' . $currencyCode[1] . '_ADDED';
$this->log->setLinenumber($linenumber++);
$query = $this->db->getQuery(true)
->insert($this->db->quoteName('#__csvi_currency'))
->columns(array($this->db->quoteName('currency_code'), $this->db->quoteName('currency_rate')))
->values($this->db->quote($currencyCode[1]) . ', ' . $this->db->quote($rate[1]));
$this->db->setQuery($query);
if ($this->db->execute())
{
$this->log->addStats('added', JText::_($rate_name));
}
else
{
$this->log->addStats('incorrect', JText::_($rate_name));
}
}
}
}
}
else
{
$this->log->addStats('incorrect', 'COM_CSVI_CANNOT_LOAD_EXCHANGERATE_FILE');
}
// Store the log count
$linenumber--;
$jinput->set('linesprocessed', $linenumber);
return true;
}
/**
* Update available fields that require extra processing.
*
* @return void.
*
* @since 6.0
*/
public function updateAvailableFields()
{
// Use the ramifications of the Multi Variant plugin as regular fields
$query = $this->db->getQuery(true)
->select($this->db->quoteName('cf.customfield_params'))
->from($this->db->quoteName('#__virtuemart_customs', 'c'))
->leftJoin(
$this->db->quoteName('#__virtuemart_product_customfields', 'cf')
. ' ON ' . $this->db->quoteName('cf.virtuemart_custom_id') . ' = ' . $this->db->quoteName('c.virtuemart_custom_id')
)
->where($this->db->quoteName('c.field_type') . ' = ' . $this->db->quote('C'));
$this->db->setQuery($query);
$params = $this->db->loadColumn();
// Start the query
$query->clear()
->insert($this->db->quoteName('#__csvi_availablefields'))
->columns($this->db->quoteName(array('csvi_name', 'component_name', 'component_table', 'component', 'action')));
$fieldnames = array();
foreach ($params as $param)
{
// Get the different segments
$segments = explode('|', $param);
// Process each segment
foreach ($segments as $segment)
{
if ($firstpos = stripos($segment, '='))
{
// Get the values
$group = substr($segment, 0, $firstpos);
$value = substr($segment, $firstpos + 1);
// Assign the value to it's group
$values = json_decode($value);
if ($group == 'selectoptions' && is_array($values))
{
foreach ($values as $ramification)
{
$csvi_name = trim($ramification->voption);
if ($ramification->voption == 'clabels')
{
$csvi_name = trim($ramification->clabel);
}
$fieldnames[] = $csvi_name;
}
}
}
}
}
if (count($fieldnames) > 0)
{
$fieldnames = array_unique($fieldnames);
foreach ($fieldnames as $csvi_name)
{
$query->values(
$this->db->quote($csvi_name) . ',' .
$this->db->quote($csvi_name) . ',' .
$this->db->quote('product') . ',' .
$this->db->quote('com_virtuemart') . ',' .
$this->db->quote('import')
);
$query->values(
$this->db->quote($csvi_name) . ',' .
$this->db->quote($csvi_name) . ',' .
$this->db->quote('product') . ',' .
$this->db->quote('com_virtuemart') . ',' .
$this->db->quote('export')
);
}
$this->db->setQuery($query)->execute();
}
}
}