Resolved gh-444 by adding the new phpspreadsheet library, and removing the old PHPExcel library.
This commit is contained in:
@ -12,6 +12,8 @@
|
||||
// No direct access to this file
|
||||
defined('_JEXEC') or die('Restricted access');
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\IOFactory;
|
||||
|
||||
/**
|
||||
* Componentbuilder Import Model
|
||||
*/
|
||||
@ -355,30 +357,30 @@ class ComponentbuilderModelImport extends JModelLegacy
|
||||
$check['type'] = $this->getType;
|
||||
|
||||
return $check;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check the extension
|
||||
*
|
||||
* @param string $file Name of the uploaded file
|
||||
*
|
||||
* @return boolean True on success
|
||||
*
|
||||
*/
|
||||
protected function checkExtension($file)
|
||||
{
|
||||
// check the extention
|
||||
switch(strtolower(pathinfo($file, PATHINFO_EXTENSION)))
|
||||
{
|
||||
case 'xls':
|
||||
case 'ods':
|
||||
case 'csv':
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check the extension
|
||||
*
|
||||
* @param string $file Name of the uploaded file
|
||||
*
|
||||
* @return boolean True on success
|
||||
*
|
||||
*/
|
||||
protected function checkExtension($file)
|
||||
{
|
||||
// check the extention
|
||||
switch(strtolower(pathinfo($file, PATHINFO_EXTENSION)))
|
||||
{
|
||||
case 'xls':
|
||||
case 'ods':
|
||||
case 'csv':
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Clean up temporary uploaded spreadsheet
|
||||
*
|
||||
@ -404,263 +406,263 @@ class ComponentbuilderModelImport extends JModelLegacy
|
||||
// It might also be just a base filename
|
||||
JFile::delete(JPath::clean($package));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the data from the spreadsheet to the database
|
||||
*
|
||||
* @param string $package Paths to the uploaded package file
|
||||
*
|
||||
* @return boolean false on failure
|
||||
*
|
||||
**/
|
||||
protected function setData($package,$table,$target_headers)
|
||||
{
|
||||
if (ComponentbuilderHelper::checkArray($target_headers))
|
||||
{
|
||||
// make sure the file is loaded
|
||||
ComponentbuilderHelper::composerAutoload('phpspreadsheet');
|
||||
$jinput = JFactory::getApplication()->input;
|
||||
foreach($target_headers as $header)
|
||||
{
|
||||
$data['target_headers'][$header] = $jinput->getString($header, null);
|
||||
}
|
||||
// set the data
|
||||
if(isset($package['dir']))
|
||||
{
|
||||
$inputFileType = IOFactory::identify($package['dir']);
|
||||
$excelReader = IOFactory::createReader($inputFileType);
|
||||
$excelReader->setReadDataOnly(true);
|
||||
$excelObj = $excelReader->load($package['dir']);
|
||||
$data['array'] = $excelObj->getActiveSheet()->toArray(null, true,true,true);
|
||||
$excelObj->disconnectWorksheets();
|
||||
unset($excelObj);
|
||||
return $this->save($data, $table);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the data from the file to the database
|
||||
*
|
||||
* @param string $package Paths to the uploaded package file
|
||||
*
|
||||
* @return boolean false on failure
|
||||
*
|
||||
**/
|
||||
protected function save($data,$table)
|
||||
{
|
||||
// import the data if there is any
|
||||
if(ComponentbuilderHelper::checkArray($data['array']))
|
||||
{
|
||||
// get user object
|
||||
$user = JFactory::getUser();
|
||||
// remove header if it has headers
|
||||
$id_key = $data['target_headers']['id'];
|
||||
$published_key = $data['target_headers']['published'];
|
||||
$ordering_key = $data['target_headers']['ordering'];
|
||||
// get the first array set
|
||||
$firstSet = reset($data['array']);
|
||||
|
||||
// check if first array is a header array and remove if true
|
||||
if($firstSet[$id_key] == 'id' || $firstSet[$published_key] == 'published' || $firstSet[$ordering_key] == 'ordering')
|
||||
{
|
||||
array_shift($data['array']);
|
||||
}
|
||||
|
||||
// make sure there is still values in array and that it was not only headers
|
||||
if(ComponentbuilderHelper::checkArray($data['array']) && $user->authorise($table.'.import', 'com_componentbuilder') && $user->authorise('core.import', 'com_componentbuilder'))
|
||||
{
|
||||
// set target.
|
||||
$target = array_flip($data['target_headers']);
|
||||
// Get a db connection.
|
||||
$db = JFactory::getDbo();
|
||||
// set some defaults
|
||||
$todayDate = JFactory::getDate()->toSql();
|
||||
// get global action permissions
|
||||
$canDo = ComponentbuilderHelper::getActions($table);
|
||||
$canEdit = $canDo->get('core.edit');
|
||||
$canState = $canDo->get('core.edit.state');
|
||||
$canCreate = $canDo->get('core.create');
|
||||
$hasAlias = $this->getAliasesUsed($table);
|
||||
// prosses the data
|
||||
foreach($data['array'] as $row)
|
||||
{
|
||||
$found = false;
|
||||
if (isset($row[$id_key]) && is_numeric($row[$id_key]) && $row[$id_key] > 0)
|
||||
{
|
||||
// raw items import & update!
|
||||
$query = $db->getQuery(true);
|
||||
$query
|
||||
->select('version')
|
||||
->from($db->quoteName('#__componentbuilder_'.$table))
|
||||
->where($db->quoteName('id') . ' = '. $db->quote($row[$id_key]));
|
||||
// Reset the query using our newly populated query object.
|
||||
$db->setQuery($query);
|
||||
$db->execute();
|
||||
$found = $db->getNumRows();
|
||||
}
|
||||
|
||||
if($found && $canEdit)
|
||||
{
|
||||
// update item
|
||||
$id = $row[$id_key];
|
||||
$version = $db->loadResult();
|
||||
// reset all buckets
|
||||
$query = $db->getQuery(true);
|
||||
$fields = array();
|
||||
// Fields to update.
|
||||
foreach($row as $key => $cell)
|
||||
{
|
||||
// ignore column
|
||||
if ('IGNORE' == $target[$key])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// update modified
|
||||
if ('modified_by' == $target[$key])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// update modified
|
||||
if ('modified' == $target[$key])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// update version
|
||||
if ('version' == $target[$key])
|
||||
{
|
||||
$cell = (int) $version + 1;
|
||||
}
|
||||
// verify publish authority
|
||||
if ('published' == $target[$key] && !$canState)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// set to update array
|
||||
if(in_array($key, $data['target_headers']) && is_numeric($cell))
|
||||
{
|
||||
$fields[] = $db->quoteName($target[$key]) . ' = ' . $cell;
|
||||
}
|
||||
elseif(in_array($key, $data['target_headers']) && is_string($cell))
|
||||
{
|
||||
$fields[] = $db->quoteName($target[$key]) . ' = ' . $db->quote($cell);
|
||||
}
|
||||
elseif(in_array($key, $data['target_headers']) && is_null($cell))
|
||||
{
|
||||
// if import data is null then set empty
|
||||
$fields[] = $db->quoteName($target[$key]) . " = ''";
|
||||
}
|
||||
}
|
||||
// load the defaults
|
||||
$fields[] = $db->quoteName('modified_by') . ' = ' . $db->quote($user->id);
|
||||
$fields[] = $db->quoteName('modified') . ' = ' . $db->quote($todayDate);
|
||||
// Conditions for which records should be updated.
|
||||
$conditions = array(
|
||||
$db->quoteName('id') . ' = ' . $id
|
||||
);
|
||||
|
||||
$query->update($db->quoteName('#__componentbuilder_'.$table))->set($fields)->where($conditions);
|
||||
$db->setQuery($query);
|
||||
$db->execute();
|
||||
}
|
||||
elseif ($canCreate)
|
||||
{
|
||||
// insert item
|
||||
$query = $db->getQuery(true);
|
||||
// reset all buckets
|
||||
$columns = array();
|
||||
$values = array();
|
||||
$version = false;
|
||||
// Insert columns. Insert values.
|
||||
foreach($row as $key => $cell)
|
||||
{
|
||||
// ignore column
|
||||
if ('IGNORE' == $target[$key])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// remove id
|
||||
if ('id' == $target[$key])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// update created
|
||||
if ('created_by' == $target[$key])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// update created
|
||||
if ('created' == $target[$key])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// Make sure the alias is incremented
|
||||
if ('alias' == $target[$key])
|
||||
{
|
||||
$cell = $this->getAlias($cell,$table);
|
||||
}
|
||||
// update version
|
||||
if ('version' == $target[$key])
|
||||
{
|
||||
$cell = 1;
|
||||
$version = true;
|
||||
}
|
||||
// set to insert array
|
||||
if(in_array($key, $data['target_headers']) && is_numeric($cell))
|
||||
{
|
||||
$columns[] = $target[$key];
|
||||
$values[] = $cell;
|
||||
}
|
||||
elseif(in_array($key, $data['target_headers']) && is_string($cell))
|
||||
{
|
||||
$columns[] = $target[$key];
|
||||
$values[] = $db->quote($cell);
|
||||
}
|
||||
elseif(in_array($key, $data['target_headers']) && is_null($cell))
|
||||
{
|
||||
// if import data is null then set empty
|
||||
$columns[] = $target[$key];
|
||||
$values[] = "''";
|
||||
}
|
||||
}
|
||||
// load the defaults
|
||||
$columns[] = 'created_by';
|
||||
$values[] = $db->quote($user->id);
|
||||
$columns[] = 'created';
|
||||
$values[] = $db->quote($todayDate);
|
||||
if (!$version)
|
||||
{
|
||||
$columns[] = 'version';
|
||||
$values[] = 1;
|
||||
}
|
||||
// Prepare the insert query.
|
||||
$query
|
||||
->insert($db->quoteName('#__componentbuilder_'.$table))
|
||||
->columns($db->quoteName($columns))
|
||||
->values(implode(',', $values));
|
||||
// Set the query using our newly populated query object and execute it.
|
||||
$db->setQuery($query);
|
||||
$done = $db->execute();
|
||||
if ($done)
|
||||
{
|
||||
$aId = $db->insertid();
|
||||
// make sure the access of asset is set
|
||||
ComponentbuilderHelper::setAsset($aId,$table);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the data from the spreadsheet to the database
|
||||
*
|
||||
* @param string $package Paths to the uploaded package file
|
||||
*
|
||||
* @return boolean false on failure
|
||||
*
|
||||
**/
|
||||
protected function setData($package,$table,$target_headers)
|
||||
{
|
||||
if (ComponentbuilderHelper::checkArray($target_headers))
|
||||
{
|
||||
// make sure the file is loaded
|
||||
JLoader::import('PHPExcel', JPATH_COMPONENT_ADMINISTRATOR . '/helpers');
|
||||
$jinput = JFactory::getApplication()->input;
|
||||
foreach($target_headers as $header)
|
||||
{
|
||||
$data['target_headers'][$header] = $jinput->getString($header, null);
|
||||
}
|
||||
// set the data
|
||||
if(isset($package['dir']))
|
||||
{
|
||||
$inputFileType = PHPExcel_IOFactory::identify($package['dir']);
|
||||
$excelReader = PHPExcel_IOFactory::createReader($inputFileType);
|
||||
$excelReader->setReadDataOnly(true);
|
||||
$excelObj = $excelReader->load($package['dir']);
|
||||
$data['array'] = $excelObj->getActiveSheet()->toArray(null, true,true,true);
|
||||
$excelObj->disconnectWorksheets();
|
||||
unset($excelObj);
|
||||
return $this->save($data,$table);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the data from the file to the database
|
||||
*
|
||||
* @param string $package Paths to the uploaded package file
|
||||
*
|
||||
* @return boolean false on failure
|
||||
*
|
||||
**/
|
||||
protected function save($data,$table)
|
||||
{
|
||||
// import the data if there is any
|
||||
if(ComponentbuilderHelper::checkArray($data['array']))
|
||||
{
|
||||
// get user object
|
||||
$user = JFactory::getUser();
|
||||
// remove header if it has headers
|
||||
$id_key = $data['target_headers']['id'];
|
||||
$published_key = $data['target_headers']['published'];
|
||||
$ordering_key = $data['target_headers']['ordering'];
|
||||
// get the first array set
|
||||
$firstSet = reset($data['array']);
|
||||
|
||||
// check if first array is a header array and remove if true
|
||||
if($firstSet[$id_key] == 'id' || $firstSet[$published_key] == 'published' || $firstSet[$ordering_key] == 'ordering')
|
||||
{
|
||||
array_shift($data['array']);
|
||||
}
|
||||
|
||||
// make sure there is still values in array and that it was not only headers
|
||||
if(ComponentbuilderHelper::checkArray($data['array']) && $user->authorise($table.'.import', 'com_componentbuilder') && $user->authorise('core.import', 'com_componentbuilder'))
|
||||
{
|
||||
// set target.
|
||||
$target = array_flip($data['target_headers']);
|
||||
// Get a db connection.
|
||||
$db = JFactory::getDbo();
|
||||
// set some defaults
|
||||
$todayDate = JFactory::getDate()->toSql();
|
||||
// get global action permissions
|
||||
$canDo = ComponentbuilderHelper::getActions($table);
|
||||
$canEdit = $canDo->get('core.edit');
|
||||
$canState = $canDo->get('core.edit.state');
|
||||
$canCreate = $canDo->get('core.create');
|
||||
$hasAlias = $this->getAliasesUsed($table);
|
||||
// prosses the data
|
||||
foreach($data['array'] as $row)
|
||||
{
|
||||
$found = false;
|
||||
if (isset($row[$id_key]) && is_numeric($row[$id_key]) && $row[$id_key] > 0)
|
||||
{
|
||||
// raw items import & update!
|
||||
$query = $db->getQuery(true);
|
||||
$query
|
||||
->select('version')
|
||||
->from($db->quoteName('#__componentbuilder_'.$table))
|
||||
->where($db->quoteName('id') . ' = '. $db->quote($row[$id_key]));
|
||||
// Reset the query using our newly populated query object.
|
||||
$db->setQuery($query);
|
||||
$db->execute();
|
||||
$found = $db->getNumRows();
|
||||
}
|
||||
|
||||
if($found && $canEdit)
|
||||
{
|
||||
// update item
|
||||
$id = $row[$id_key];
|
||||
$version = $db->loadResult();
|
||||
// reset all buckets
|
||||
$query = $db->getQuery(true);
|
||||
$fields = array();
|
||||
// Fields to update.
|
||||
foreach($row as $key => $cell)
|
||||
{
|
||||
// ignore column
|
||||
if ('IGNORE' == $target[$key])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// update modified
|
||||
if ('modified_by' == $target[$key])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// update modified
|
||||
if ('modified' == $target[$key])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// update version
|
||||
if ('version' == $target[$key])
|
||||
{
|
||||
$cell = (int) $version + 1;
|
||||
}
|
||||
// verify publish authority
|
||||
if ('published' == $target[$key] && !$canState)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// set to update array
|
||||
if(in_array($key, $data['target_headers']) && is_numeric($cell))
|
||||
{
|
||||
$fields[] = $db->quoteName($target[$key]) . ' = ' . $cell;
|
||||
}
|
||||
elseif(in_array($key, $data['target_headers']) && is_string($cell))
|
||||
{
|
||||
$fields[] = $db->quoteName($target[$key]) . ' = ' . $db->quote($cell);
|
||||
}
|
||||
elseif(in_array($key, $data['target_headers']) && is_null($cell))
|
||||
{
|
||||
// if import data is null then set empty
|
||||
$fields[] = $db->quoteName($target[$key]) . " = ''";
|
||||
}
|
||||
}
|
||||
// load the defaults
|
||||
$fields[] = $db->quoteName('modified_by') . ' = ' . $db->quote($user->id);
|
||||
$fields[] = $db->quoteName('modified') . ' = ' . $db->quote($todayDate);
|
||||
// Conditions for which records should be updated.
|
||||
$conditions = array(
|
||||
$db->quoteName('id') . ' = ' . $id
|
||||
);
|
||||
|
||||
$query->update($db->quoteName('#__componentbuilder_'.$table))->set($fields)->where($conditions);
|
||||
$db->setQuery($query);
|
||||
$db->execute();
|
||||
}
|
||||
elseif ($canCreate)
|
||||
{
|
||||
// insert item
|
||||
$query = $db->getQuery(true);
|
||||
// reset all buckets
|
||||
$columns = array();
|
||||
$values = array();
|
||||
$version = false;
|
||||
// Insert columns. Insert values.
|
||||
foreach($row as $key => $cell)
|
||||
{
|
||||
// ignore column
|
||||
if ('IGNORE' == $target[$key])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// remove id
|
||||
if ('id' == $target[$key])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// update created
|
||||
if ('created_by' == $target[$key])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// update created
|
||||
if ('created' == $target[$key])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// Make sure the alias is incremented
|
||||
if ('alias' == $target[$key])
|
||||
{
|
||||
$cell = $this->getAlias($cell,$table);
|
||||
}
|
||||
// update version
|
||||
if ('version' == $target[$key])
|
||||
{
|
||||
$cell = 1;
|
||||
$version = true;
|
||||
}
|
||||
// set to insert array
|
||||
if(in_array($key, $data['target_headers']) && is_numeric($cell))
|
||||
{
|
||||
$columns[] = $target[$key];
|
||||
$values[] = $cell;
|
||||
}
|
||||
elseif(in_array($key, $data['target_headers']) && is_string($cell))
|
||||
{
|
||||
$columns[] = $target[$key];
|
||||
$values[] = $db->quote($cell);
|
||||
}
|
||||
elseif(in_array($key, $data['target_headers']) && is_null($cell))
|
||||
{
|
||||
// if import data is null then set empty
|
||||
$columns[] = $target[$key];
|
||||
$values[] = "''";
|
||||
}
|
||||
}
|
||||
// load the defaults
|
||||
$columns[] = 'created_by';
|
||||
$values[] = $db->quote($user->id);
|
||||
$columns[] = 'created';
|
||||
$values[] = $db->quote($todayDate);
|
||||
if (!$version)
|
||||
{
|
||||
$columns[] = 'version';
|
||||
$values[] = 1;
|
||||
}
|
||||
// Prepare the insert query.
|
||||
$query
|
||||
->insert($db->quoteName('#__componentbuilder_'.$table))
|
||||
->columns($db->quoteName($columns))
|
||||
->values(implode(',', $values));
|
||||
// Set the query using our newly populated query object and execute it.
|
||||
$db->setQuery($query);
|
||||
$done = $db->execute();
|
||||
if ($done)
|
||||
{
|
||||
$aId = $db->insertid();
|
||||
// make sure the access of asset is set
|
||||
ComponentbuilderHelper::setAsset($aId,$table);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
protected function getAlias($name,$type = false)
|
||||
{
|
||||
// sanitize the name to an alias
|
||||
|
@ -12,6 +12,8 @@
|
||||
// No direct access to this file
|
||||
defined('_JEXEC') or die('Restricted access');
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\IOFactory;
|
||||
|
||||
/**
|
||||
* Componentbuilder Import_joomla_components Model
|
||||
*/
|
||||
@ -547,8 +549,8 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Clean up temporary uploaded spreadsheet
|
||||
*
|
||||
@ -676,7 +678,7 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy
|
||||
}
|
||||
$this->app->enqueueMessage(JText::_('COM_COMPONENTBUILDER_HTWODATA_IS_CORRUPTHTWOTHIS_COULD_BE_DUE_TO_BROKEN_PACKAGE'), 'error');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the smart components
|
||||
@ -3188,7 +3190,7 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy
|
||||
// add the full path if possible
|
||||
return str_replace('//', '/', $this->setFullPath($path));
|
||||
}
|
||||
|
||||
|
||||
protected function getAlias($name,$type = false)
|
||||
{
|
||||
// sanitize the name to an alias
|
||||
|
@ -12,6 +12,8 @@
|
||||
// No direct access to this file
|
||||
defined('_JEXEC') or die('Restricted access');
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\IOFactory;
|
||||
|
||||
/**
|
||||
* Componentbuilder Import_language_translations Model
|
||||
*/
|
||||
@ -375,8 +377,8 @@ class ComponentbuilderModelImport_language_translations extends JModelLegacy
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Clean up temporary uploaded spreadsheet
|
||||
*
|
||||
@ -437,7 +439,7 @@ class ComponentbuilderModelImport_language_translations extends JModelLegacy
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the data from the file to the database
|
||||
@ -701,7 +703,7 @@ class ComponentbuilderModelImport_language_translations extends JModelLegacy
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
protected function getAlias($name,$type = false)
|
||||
{
|
||||
// sanitize the name to an alias
|
||||
|
Reference in New Issue
Block a user