first commit
This commit is contained in:
498
administrator/components/com_j2xml/models/import.php
Normal file
498
administrator/components/com_j2xml/models/import.php
Normal file
@@ -0,0 +1,498 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_j2xml
|
||||
*
|
||||
* @version 3.9.229-rc1
|
||||
*
|
||||
* @author Helios Ciancio <info (at) eshiol (dot) it>
|
||||
* @link https://www.eshiol.it
|
||||
* @copyright Copyright (C) 2010 - 2023 Helios Ciancio. All Rights Reserved
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL v3
|
||||
* J2XML is free software. This version may have been modified pursuant
|
||||
* to the GNU General Public License, and as distributed it includes or
|
||||
* is derivative of works licensed under the GNU General Public License
|
||||
* or other free or open source software licenses.
|
||||
*/
|
||||
|
||||
// no direct access
|
||||
defined('_JEXEC') or die();
|
||||
|
||||
jimport('eshiol.J2xml.Importer');
|
||||
jimport('eshiol.J2xmlpro.Importer');
|
||||
jimport('eshiol.J2xml.Messages');
|
||||
jimport('eshiol.J2xml.Version');
|
||||
jimport('eshiol.J2xmlpro.Version');
|
||||
|
||||
/**
|
||||
* J2XML Import Model
|
||||
*
|
||||
* @since 3.9
|
||||
*/
|
||||
class J2xmlModelImport extends JModelForm
|
||||
{
|
||||
/**
|
||||
* @var object JTable object
|
||||
*/
|
||||
protected $_table = null;
|
||||
|
||||
/**
|
||||
* @var object JTable object
|
||||
*/
|
||||
protected $_url = null;
|
||||
|
||||
/**
|
||||
* Model context string.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $_context = 'com_j2xml.import';
|
||||
|
||||
/**
|
||||
* Method to auto-populate the model state.
|
||||
*
|
||||
* Note. Calling getState in this method will result in recursion.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 3.9
|
||||
*/
|
||||
protected function populateState ()
|
||||
{
|
||||
JLog::add(new JLogEntry(__METHOD__, JLog::DEBUG, 'com_j2xml'));
|
||||
|
||||
$app = JFactory::getApplication('administrator');
|
||||
|
||||
$this->setState('message', $app->getUserState('com_j2xml.message'));
|
||||
$app->setUserState('com_j2xml.message', '');
|
||||
|
||||
parent::populateState();
|
||||
}
|
||||
|
||||
/**
|
||||
* Import data from either folder, URL or upload.
|
||||
*
|
||||
* @return boolean result of import.
|
||||
*
|
||||
* @since 3.9
|
||||
*/
|
||||
public function import()
|
||||
{
|
||||
JLog::add(new JLogEntry(__METHOD__, JLog::DEBUG, 'com_j2xml'));
|
||||
|
||||
$this->setState('action', 'import');
|
||||
|
||||
// Set FTP credentials, if given.
|
||||
JClientHelper::setCredentialsFromRequest('ftp');
|
||||
$app = JFactory::getApplication();
|
||||
|
||||
// Load j2xml plugins for assistance if required:
|
||||
JPluginHelper::importPlugin('j2xml');
|
||||
|
||||
$package = null;
|
||||
|
||||
$installType = $app->input->getWord('installtype');
|
||||
|
||||
if ($package === null)
|
||||
{
|
||||
switch ($installType)
|
||||
{
|
||||
case 'folder':
|
||||
// Remember the 'Import from Directory' path.
|
||||
$app->getUserStateFromRequest($this->_context . '.install_directory', 'install_directory');
|
||||
$package = $this->_getDataFromFolder();
|
||||
break;
|
||||
|
||||
case 'upload':
|
||||
$package = $this->_getDataFromUpload();
|
||||
break;
|
||||
|
||||
case 'url':
|
||||
$package = $this->_getDataFromUrl();
|
||||
break;
|
||||
|
||||
default:
|
||||
$app->setUserState('com_j2xml.message', JText::_('COM_J2XML_NO_IMPORT_TYPE_FOUND'));
|
||||
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
JLog::add(new JLogEntry('package: ' . print_r($package, true), JLog::DEBUG, 'com_j2xml'));
|
||||
|
||||
if (!($data = implode(gzfile($package['packagefile'])))) {
|
||||
$data = file_get_contents($package['packagefile']);
|
||||
}
|
||||
JLog::add(new JLogEntry('data: ' . $data, JLog::DEBUG, 'com_j2xml'));
|
||||
|
||||
$jform = JFactory::getApplication()->input->post->get('jform', array(), 'array');
|
||||
|
||||
$fparams = new JRegistry($jform);
|
||||
JLog::add(new JLogEntry('jform: ' . print_r($fparams->toArray(), true), JLog::DEBUG, 'com_j2xml'));
|
||||
|
||||
$cparams = JComponentHelper::getParams('com_j2xml');
|
||||
JLog::add(new JLogEntry('cparams: ' . print_r($cparams->toArray(), true), JLog::DEBUG, 'com_j2xml'));
|
||||
|
||||
$params = new JRegistry();
|
||||
$params->set('categories', $fparams->get('import_categories', $cparams->get('import_categories', 1)));
|
||||
$params->set('contacts', $fparams->get('import_contacts', $cparams->get('import_contacts', 0)));
|
||||
$params->set('content', $fparams->get('import_content', $cparams->get('import_content', 1)));
|
||||
$params->set('fields', $fparams->get('import_fields', $cparams->get('import_fields', 0)));
|
||||
$params->set('images', $fparams->get('import_images', $cparams->get('import_images', 0)));
|
||||
$params->set('keep_category', $fparams->get('import_keep_category', $cparams->get('import_keep_category', 1)));
|
||||
if ($params->get('keep_category') == 2)
|
||||
{
|
||||
$params->set('content_category_forceto', $fparams->get('import_content_category_forceto', $cparams->get('com_content_category_default')));
|
||||
}
|
||||
$params->set('keep_id', $fparams->get('import_keep_id', $cparams->get('import_keep_id', 0)));
|
||||
$params->set('keep_user_id', $fparams->get('import_keep_user_id', $cparams->get('import_keep_user_id', 0)));
|
||||
$params->set('tags', $fparams->get('import_tags', $cparams->get('import_tags', 1)));
|
||||
$params->set('superusers', $fparams->get('import_superusers', $cparams->get('import_superusers', 0)));
|
||||
$params->set('usernotes', $fparams->get('import_usernotes', $cparams->get('import_usernotes', 0)));
|
||||
$params->set('users', $fparams->get('import_users', $cparams->get('import_users', 1)));
|
||||
$params->set('viewlevels', $fparams->get('import_viewlevels', $cparams->get('import_viewlevels', 1)));
|
||||
$params->set('weblinks', $fparams->get('import_weblinks', $cparams->get('import_weblinks', 0)));
|
||||
$params->set('keep_data', $fparams->get('import_keep_data', $cparams->get('import_keep_data', 0)));
|
||||
|
||||
JLog::add(new JLogEntry('params: ' . print_r($params->toArray(), true), JLog::DEBUG, 'com_j2xml'));
|
||||
|
||||
// This event allows a custom import of the data or a customization of the data:
|
||||
JPluginHelper::importPlugin('j2xml');
|
||||
|
||||
$results = JFactory::getApplication()->triggerEvent('onContentPrepareData', array('com_j2xml.import', &$data, $params));
|
||||
|
||||
if (in_array(false, $results, true))
|
||||
{
|
||||
JLog::add(new JLogEntry(JText::_('LIB_J2XML_MSG_PLUGIN_ERROR'), JLog::ERROR, 'com_j2xml'));
|
||||
|
||||
if (in_array($installType, array('upload', 'url')))
|
||||
{
|
||||
JInstallerHelper::cleanupInstall($package['packagefile'], $package['extractdir']);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
$data = strstr($data, '<?xml version="1.0" ');
|
||||
if (!defined('LIBXML_PARSEHUGE'))
|
||||
{
|
||||
define(LIBXML_PARSEHUGE, 524288);
|
||||
}
|
||||
|
||||
$xml = simplexml_load_string($data, 'SimpleXMLElement', LIBXML_PARSEHUGE);
|
||||
if (!$xml)
|
||||
{
|
||||
return;
|
||||
}
|
||||
elseif (strtoupper($xml->getName()) != 'J2XML')
|
||||
{
|
||||
JLog::add(new JLogEntry(JText::_('LIB_J2XML_MSG_FILE_FORMAT_UNKNOWN'), JLog::ERROR, 'com_j2xml'));
|
||||
return false;
|
||||
}
|
||||
elseif (!isset($xml['version']))
|
||||
{
|
||||
JLog::add(new JLogEntry(JText::_('LIB_J2XML_MSG_FILE_FORMAT_UNKNOWN'), JLog::ERROR, 'com_j2xml'));
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
JLog::add(new JLogEntry('Importing...', JLog::DEBUG, 'com_j2xml'));
|
||||
|
||||
$xmlVersion = $xml['version'];
|
||||
$version = explode(".", $xmlVersion);
|
||||
$xmlVersionNumber = $version[0] . substr('0' . $version[1], strlen($version[1]) - 1) . substr('0' . $version[2], strlen($version[2]) - 1);
|
||||
|
||||
$results = JFactory::getApplication()->triggerEvent('onValidateData', array(&$xml, $params));
|
||||
|
||||
$importer = class_exists('eshiol\J2xmlpro\Importer') ? new eshiol\J2xmlpro\Importer() : new eshiol\J2xml\Importer();
|
||||
if ($importer->isSupported($xmlVersionNumber) || in_array(true, $results, true))
|
||||
{
|
||||
$params->set('version', (string) $xml['version']);
|
||||
|
||||
$results = JFactory::getApplication()->triggerEvent('onContentBeforeImport', array('com_j2xml.import', &$xml, $params));
|
||||
|
||||
$importer->import($xml, $params);
|
||||
|
||||
JInstallerHelper::cleanupInstall($package['packagefile'], $package['extractdir']);
|
||||
}
|
||||
else
|
||||
{
|
||||
JLog::add(new JLogEntry(JText::sprintf('LIB_J2XML_MSG_FILE_FORMAT_NOT_SUPPORTED', $xmlVersion), JLog::ERROR, 'com_j2xml'));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Cleanup the install files.
|
||||
if (!is_file($package['packagefile']))
|
||||
{
|
||||
$config = JFactory::getConfig();
|
||||
$package['packagefile'] = $config->get('tmp_path') . '/' . $package['packagefile'];
|
||||
}
|
||||
|
||||
JInstallerHelper::cleanupInstall($package['packagefile'], $package['extractdir']);
|
||||
|
||||
// Clear the cached extension data and menu cache
|
||||
//$this->cleanCache('com_content', 0);
|
||||
//$this->cleanCache('com_content', 1);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Works out an import data package from a HTTP upload.
|
||||
*
|
||||
* @return Package definition or false on failure.
|
||||
*/
|
||||
protected function _getDataFromUpload()
|
||||
{
|
||||
JLog::add(new JLogEntry(__METHOD__, JLog::DEBUG, 'com_j2xml'));
|
||||
|
||||
// Get the uploaded file information.
|
||||
$input = JFactory::getApplication()->input;
|
||||
|
||||
// Do not change the filter type 'raw'. We need this to let files containing PHP code to upload. See JInputFiles::get.
|
||||
$userfile = $input->files->get('install_package', null, 'raw');
|
||||
|
||||
// Make sure that file uploads are enabled in php.
|
||||
if (!(bool) ini_get('file_uploads'))
|
||||
{
|
||||
JError::raiseWarning('', JText::_('COM_J2XML_MSG_IMPORT_WARNXMLFILE'));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Make sure that zlib is loaded so that the package can be unpacked.
|
||||
if (!extension_loaded('zlib'))
|
||||
{
|
||||
JError::raiseWarning('', JText::_('COM_J2XML_MSG_IMPORT_WARNXMLZLIB'));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// If there is no uploaded file, we have a problem...
|
||||
if (!is_array($userfile))
|
||||
{
|
||||
JError::raiseWarning('', JText::_('COM_J2XML_MSG_INSTALL_NO_FILE_SELECTED'));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Is the PHP tmp directory missing?
|
||||
if ($userfile['error'] && ($userfile['error'] == UPLOAD_ERR_NO_TMP_DIR))
|
||||
{
|
||||
JError::raiseWarning(
|
||||
'',
|
||||
JText::_('COM_J2XML_MSG_IMPORT_WARNXMLUPLOADERROR') . '<br />' . JText::_('COM_J2XML_MSG_WARNINGS_PHPUPLOADNOTSET')
|
||||
);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Is the max upload size too small in php.ini?
|
||||
if ($userfile['error'] && ($userfile['error'] == UPLOAD_ERR_INI_SIZE))
|
||||
{
|
||||
JError::raiseWarning(
|
||||
'',
|
||||
JText::_('COM_J2XML_MSG_IMPORT_WARNXMLUPLOADERROR') . '<br />' . JText::_('COM_J2XML_MSG_WARNINGS_SMALLUPLOADSIZE')
|
||||
);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if there was a different problem uploading the file.
|
||||
if ($userfile['error'] || $userfile['size'] < 1)
|
||||
{
|
||||
JError::raiseWarning('', JText::_('COM_J2XML_MSG_IMPORT_WARNXMLUPLOADERROR'));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Build the appropriate paths.
|
||||
$config = JFactory::getConfig();
|
||||
$tmp_dest = $config->get('tmp_path') . '/' . $userfile['name'];
|
||||
$tmp_src = $userfile['tmp_name'];
|
||||
|
||||
// Move uploaded file.
|
||||
jimport('joomla.filesystem.file');
|
||||
JFile::upload($tmp_src, $tmp_dest, false, true);
|
||||
|
||||
// Unpack the downloaded package file.
|
||||
$package = JInstallerHelper::unpack($tmp_dest, true);
|
||||
|
||||
return $package;
|
||||
}
|
||||
|
||||
/**
|
||||
* Import data from a directory
|
||||
*
|
||||
* @return array Package details or false on failure
|
||||
*
|
||||
* @since 3.9
|
||||
*/
|
||||
protected function _getDataFromFolder()
|
||||
{
|
||||
JLog::add(new JLogEntry(__METHOD__, JLog::DEBUG, 'com_j2xml'));
|
||||
|
||||
$input = JFactory::getApplication()->input;
|
||||
|
||||
// Get the path to the package to install.
|
||||
$p_dir = $input->getString('install_directory');
|
||||
$p_dir = JPath::clean($p_dir);
|
||||
|
||||
// Did you give us a valid directory?
|
||||
if (!is_dir($p_dir))
|
||||
{
|
||||
JError::raiseWarning('', JText::_('COM_J2XML_MSG_INSTALL_PLEASE_ENTER_A_PACKAGE_DIRECTORY'));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
$package['packagefile'] = null;
|
||||
$package['extractdir'] = null;
|
||||
$package['dir'] = $p_dir;
|
||||
|
||||
return $package;
|
||||
}
|
||||
|
||||
/**
|
||||
* Import data from a URL.
|
||||
*
|
||||
* @return Package details or false on failure.
|
||||
*
|
||||
* @since 3.9
|
||||
*/
|
||||
protected function _getDataFromUrl()
|
||||
{
|
||||
JLog::add(new JLogEntry(__METHOD__, JLog::DEBUG, 'com_j2xml'));
|
||||
|
||||
$input = JFactory::getApplication()->input;
|
||||
|
||||
// Get the URL of the data to install.
|
||||
$url = $input->getString('install_url');
|
||||
|
||||
// Did you give us a URL?
|
||||
if (!$url)
|
||||
{
|
||||
JError::raiseWarning('', JText::_('COM_J2XML_MSG_INSTALL_ENTER_A_URL'));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Handle updater XML file case:
|
||||
/*
|
||||
if (preg_match('/\.xml\s*$/', $url))
|
||||
{
|
||||
jimport('joomla.updater.update');
|
||||
$update = new JUpdate;
|
||||
$update->loadFromXml($url);
|
||||
$package_url = trim($update->get('downloadurl', false)->_data);
|
||||
|
||||
if ($package_url)
|
||||
{
|
||||
$url = $package_url;
|
||||
}
|
||||
|
||||
unset($update);
|
||||
}
|
||||
*/
|
||||
|
||||
// Download the package at the URL given.
|
||||
$p_file = JInstallerHelper::downloadPackage($url);
|
||||
|
||||
// Was the package downloaded?
|
||||
if (!$p_file)
|
||||
{
|
||||
JError::raiseWarning('', JText::_('COM_J2XML_MSG_INSTALL_INVALID_URL'));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
$config = JFactory::getConfig();
|
||||
$tmp_dest = $config->get('tmp_path');
|
||||
|
||||
// Unpack the downloaded package file.
|
||||
$package = JInstallerHelper::unpack($tmp_dest . '/' . $p_file, true);
|
||||
|
||||
return $package;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the record form.
|
||||
*
|
||||
* @param array $data
|
||||
* Data for the form.
|
||||
* @param boolean $loadData
|
||||
* True if the form is to load its own data (default case), false if not.
|
||||
*
|
||||
* @return JForm|boolean A JForm object on success, false on failure
|
||||
*
|
||||
* @since 3.9.0
|
||||
*/
|
||||
public function getForm($data = array(), $loadData = true)
|
||||
{
|
||||
JLog::add(new JLogEntry(__METHOD__, JLog::DEBUG, 'com_j2xml'));
|
||||
|
||||
try
|
||||
{
|
||||
$form = $this->loadForm($this->_context, 'import', array(
|
||||
'control' => 'jform',
|
||||
'load_data' => false
|
||||
));
|
||||
|
||||
if ($loadData)
|
||||
{
|
||||
// Get the data for the form.
|
||||
$data = $this->loadFormData();
|
||||
}
|
||||
else
|
||||
{
|
||||
$data = array();
|
||||
}
|
||||
|
||||
// Allow for additional modification of the form, and events to be triggered.
|
||||
// We pass the data because plugins may require it.
|
||||
$this->preprocessForm($form, $data);
|
||||
|
||||
// Load the data into the form after the plugins have operated.
|
||||
$form->bind($data);
|
||||
}
|
||||
catch (\Exception $e)
|
||||
{
|
||||
$this->setError($e->getMessage());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return $form;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the data that should be injected in the form.
|
||||
*
|
||||
* @return mixed The data for the form.
|
||||
*
|
||||
* @since 3.9.0
|
||||
*/
|
||||
protected function loadFormData()
|
||||
{
|
||||
JLog::add(new JLogEntry(__METHOD__, JLog::DEBUG, 'com_j2xml'));
|
||||
|
||||
// Check the session for previously entered form data.
|
||||
$data = JFactory::getApplication()->getUserState('com_j2xml.import.data', array());
|
||||
JLog::add(new JLogEntry('getUserState(\'com_j2xml.import.data\'): ' . print_r($data, true), JLog::DEBUG, 'com_j2xml'));
|
||||
$jform = array();
|
||||
foreach($data as $k => $v)
|
||||
{
|
||||
$jform['import_' . $k] = $v;
|
||||
}
|
||||
|
||||
$params = JComponentHelper::getParams('com_j2xml');
|
||||
$data = array_merge($params->toArray(), $jform);
|
||||
JLog::add(new JLogEntry('data: ' . print_r($data, true), JLog::DEBUG, 'com_j2xml'));
|
||||
|
||||
$this->preprocessData($this->_context, $data);
|
||||
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user