%PDF- %PDF-
| Direktori : /home/lightco1/upgrade.lightco.com.au/administrator/components/com_csvi/rantai/import/ |
| Current File : /home/lightco1/upgrade.lightco.com.au/administrator/components/com_csvi/rantai/import/model.php |
<?php
/**
* @package CSVI
* @subpackage Imports
*
* @author Roland Dalmulder <contact@csvimproved.com>
* @copyright Copyright (C) 2006 - 2016 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;
/**
* Import model class.
*
* @package CSVI
* @subpackage Imports
* @since 6.0
*/
class RantaiImportModel extends RantaiModel
{
/**
* The fields handler
*
* @var CsviHelperImportFields
* @since 6.0
*/
protected $fields;
/**
* Initialise the import.
*
* @param int $csvi_process_id The ID of the running import
*
* @return bool True on success | false on failure.
*
* @since 6.0
*
* @throws Exception
* @throws CsviException
* @throws RuntimeException
*/
public function initialiseImport($csvi_process_id)
{
// Load the run details
$query = $this->db->getQuery(true)
->select(
array(
$this->db->quoteName('csvi_template_id'),
$this->db->quoteName('csvi_log_id'),
$this->db->quoteName('userId'),
$this->db->quoteName('processfile'),
$this->db->quoteName('processfolder'),
$this->db->quoteName('position')
)
)
->from($this->db->quoteName('#__csvi_processes'))
->where($this->db->quoteName('csvi_process_id') . ' = ' . (int) $csvi_process_id);
$this->db->setQuery($query);
$details = $this->db->loadObject();
if ($details)
{
if ($details->csvi_template_id)
{
// Run ID is correct, set it
$this->runId = $csvi_process_id;
// Set the user ID
$this->userId = $details->userId;
// Load the template
$this->loadTemplate($details->csvi_template_id);
// Setup the addon autoloader
$component = $this->template->get('component');
$override = $this->template->get('override');
$adminTemplate = $this->getAdminTemplate();
if ($override
&& file_exists(JPATH_ADMINISTRATOR . '/templates/' . $adminTemplate . '/html/com_csvi/' . $component . '/model/import/' . $override . '.php'))
{
JLoader::registerPrefix(ucfirst($component), JPATH_ADMINISTRATOR . '/templates/' . $adminTemplate . '/html/com_csvi/' . $component);
}
JLoader::registerPrefix(ucfirst($component), JPATH_ADMINISTRATOR . '/components/com_csvi/addon/' . $component);
// Setup the logger
$this->log->setActive($this->template->getLog());
$this->log->setLogId($details->csvi_log_id);
// Check if we already have a file to process
if (empty($details->processfile))
{
// Load the folder class
jimport('joomla.filesystem.folder');
// Load the first file in line
$files = JFolder::files($details->processfolder);
if (is_array($files) && !empty($files))
{
$details->processfile = $details->processfolder . '/' . $files[0];
}
}
// Set the file being processed
if ($details->processfile)
{
// Set the folder to process
$this->processfolder = $details->processfolder;
// Set the file to process
$this->processfile = $details->processfile;
// Load the file
$this->loadImportFile();
// Tell the logger about the filename
$this->log->setFilename(basename($this->processfile));
// Load the fields
$this->loadFields();
// Both the file and fields have been setup, let's connect them
$this->file->setFields($this->fields);
// Let's setup the fields
$this->fields->setupFields();
// Move the file pointer if needed
if ($details->position > 0)
{
$this->file->setFilePos($details->position);
}
}
else
{
throw new CsviException(JText::_('COM_CSVI_NO_FOLDER_FOUND_TO_PROCESS'), 504);
}
return true;
}
else
{
throw new CsviException(JText::sprintf('COM_CSVI_NO_TEMPLATE_ID_FOUND_RUN', $csvi_process_id), 505);
}
}
else
{
throw new CsviException(JText::_('COM_CSVI_NO_VALID_RUNID_FOUND', $csvi_process_id), 506);
}
}
/**
* Load the import file helper.
*
* @return void.
*
* @throws CsviException
*
* @since 6.0
*/
protected function loadImportFile()
{
// Get the template
$templateId = $this->template->getId();
if (empty($templateId))
{
throw new CsviException(JText::_('COM_CSVI_NO_TEMPLATE_LOADED'), 501);
}
// Get the file parts
$upload_parts = pathinfo($this->processfile);
// Force an extension if needed
$force_ext = $this->template->get('use_file_extension');
if (!empty($force_ext))
{
$upload_parts['extension'] = $force_ext;
}
// Set the file helper
if (!array_key_exists('extension', $upload_parts))
{
throw new CsviException(JText::sprintf('COM_CSVI_NO_EXTENSION_FOUND_ON_IMPORT_FILE', $this->processfile), 502);
}
else
{
$fileclass = 'CsviHelperFileImport';
switch (strtolower($upload_parts['extension']))
{
case 'xml':
case 'xls':
case 'ods':
$fileclass .= ucfirst($upload_parts['extension']);
break;
case 'csv':
case 'txt':
case 'tsv':
$fileclass .= 'Csv';
break;
}
}
// Load the file processor
$this->file = new $fileclass($this->template, $this->log, $this->csvihelper, $this->input);
// Set the filename
$this->file->setFilename($this->processfile);
// Validate the file
if (!$this->file->processFile())
{
throw new CsviException(JText::sprintf('COM_CSVI_CANNOT_PROCESS_FILE', $this->processfile), 503);
}
else
{
$this->processfile = $this->file->getFilename();
}
}
/**
* Pre-process any tasks.
*
* @return void.
*
* @since 6.0
*/
public function onBeforeImport()
{
// Setup the add-on
$this->initialiseAddon();
// Get the file position
$started = $this->log->getLinenumber();
// Write out the import details to the debug log if we haven't started yet
if (!$started)
{
$this->log->add('==========', false);
$this->importDetails();
$this->log->add('==========', false);
}
// Move 1 row forward as we are skipping the first line only at start
if (!$started && $this->template->get('skip_first_line'))
{
$this->file->next();
}
// Processes that only need to be called at the start of the file
if (!$started)
{
// Un-publish any items if needed
if ($this->helper && method_exists($this->helper, 'unpublishBeforeImport'))
{
$this->helper->unpublishBeforeImport($this->template, $this->log, $this->db);
}
}
}
/**
* Post-process any tasks.
*
* @return void.
*
* @since 6.0
*
* @throws UnexpectedValueException
*/
public function onAfterImport()
{
// Check if the import file needs to be deleted
$from = $this->template->get('source', 'fromupload');
if ($this->template->get('delete_file') && in_array($from, array('fromserver', 'fromftp'), true))
{
// Get the template location
$location = $local_file = JPath::clean($this->template->get('local_csv_file'), '/');
switch ($from)
{
case 'fromftp':
$location = JPath::clean($this->template->get('ftpfile'), '/');
// Start the FTP
jimport('joomla.client.ftp');
$ftp = JClientFtp::getInstance(
$this->template->get('ftphost'),
$this->template->get('ftpport'),
array(),
$this->template->get('ftpusername'),
$this->template->get('ftppass')
);
$ftpFile = $this->template->get('ftproot', '') . $location;
$this->log->add('Delete file:' . $ftpFile);
$ftp->delete($ftpFile);
break;
case 'fromserver':
if (is_dir($location))
{
JFile::delete($location . '/' . basename($this->processfile));
}
else
{
$this->log->add('Delete file:' . $this->processfile);
JFile::delete($this->processfile);
}
break;
}
}
}
/**
* Print out import details.
*
* @return void.
*
* @since 3.0
*/
private function importDetails()
{
// Only write out the details if debugging is enabled
if ($this->template->getLog())
{
$this->log->add(JText::_('COM_CSVI_CSVI_VERSION_TEXT') . JText::_('COM_CSVI_CSVI_VERSION'), false);
if (function_exists('phpversion'))
{
$this->log->add(JText::sprintf('COM_CSVI_PHP_VERSION', phpversion()), false);
}
// Push out all settings
$this->processSettings($this->template->getSettings());
}
}
/**
* Add all the settings to the debug log.
*
* @param array $settings The settings to report in debug log.
*
* @return void.
*
* @since 5.3
*/
private function processSettings($settings)
{
foreach ($settings as $name => $value)
{
switch ($name)
{
case 'fields':
break;
default:
if (is_object($value) || is_array($value))
{
$this->processSettings($value);
}
else
{
switch ($name)
{
case 'ftpusername':
case 'ftppass':
break;
case 'source':
$this->log->add(JText::_('COM_CSVI_JFORM_' . $name . '_LABEL') . ': ' . $value, false);
$this->log->add(JText::_('COM_CSVI_IMPORT_UPLOAD_FILE_LABEL') . ': ' . $this->processfile, false);
break;
default:
switch ($value)
{
case '0':
$value = JText::_('JNO');
break;
case '1':
$value = JText::_('JYES');
break;
case ',':
$value = 'comma';
break;
}
$this->log->add(JText::_('COM_CSVI_JFORM_' . $name . '_LABEL') . ': ' . $value, false);
break;
}
}
break;
}
}
}
/**
* Run the import.
*
* @param bool $isCli Set if the import is run from CLI
*
* @todo Routine overrides
*
* @return bool true if we continue importing | false if the import is finished/terminated.
*
* @throws CsviException
*
* @since 6.0
*/
final public function runImport($isCli = false)
{
// Load the template settings
$component = $this->template->get('component');
$operation = $this->template->get('operation');
$override = $this->template->get('override');
// Set the system limits to the user settings if needed
$this->systemLimits();
// Auto detect line-endings to also support Mac line-endings
if ($this->template->get('im_mac', false))
{
ini_set('auto_detect_line_endings', true);
}
// Load the import routine
$classname = ucwords($component) . 'ModelImport' . ucwords($operation);
$adminTemplate = $this->getAdminTemplate();
if ($override
&& file_exists(JPATH_ADMINISTRATOR . '/templates/' . $adminTemplate . '/html/com_csvi/' . $component . '/model/import/' . $override . '.php'))
{
$classname = ucwords($component) . 'ModelImport' . ucwords($override);
}
// Instantiate the import routine
$routine = new $classname(
$this->db,
$this->template,
$this->log,
$this->csvihelper,
$this->fields,
$this->helper,
$this->helperconfig,
$this->userId
);
if ($routine)
{
// Set the last run time for the template
$query = $this->db->getQuery(true)
->update($this->db->quoteName('#__csvi_templates'))
->set($this->db->quoteName('lastrun') . ' = ' . $this->db->quote(JFactory::getDate()->toSql()))
->where($this->db->quoteName('csvi_template_id') . ' = ' . (int) $this->template->getId());
$this->db->setQuery($query);
$this->db->execute();
// Initialize process data so the import starts
$processdata = true;
$return = true;
// Run setup if needed
if (method_exists($routine, 'onBeforeStart'))
{
$routine->onBeforeStart();
}
// Load any tables if needed
if (method_exists($routine, 'loadTables'))
{
$routine->loadTables();
}
// Start processing data
while ($processdata)
{
// If the number of lines is set to 0, do unlimited import
if (($this->template->get('import_nolines', 0) == 0) || $isCli)
{
$nolines = $this->recordsProcessed + 1;
}
else
{
$nolines = $this->template->get('import_nolines');
}
if (($this->recordsProcessed + 1) <= $nolines)
{
// Load the data
$result = $this->file->readNextLine();
// Check the load result
if ($result == false)
{
// Finish processing
$this->finishProcess(true);
$processdata = false;
// Post Processing now the import is done
if (method_exists($routine, 'getPostProcessing'))
{
$routine->getPostProcessing($this->fields->getFieldnames());
}
$return = false;
}
else
{
// Increase the line number as we process
$this->log->incrementLinenumber();
// Load ICEcat data if user wants to
if (method_exists($this->helper, 'getIcecat'))
{
$this->helper->getIcecat();
}
// Set the data to import
$this->fields->prepareData();
// Notify the debug log what line we are one
$this->log->add(JText::sprintf('COM_CSVI_DEBUG_PROCESS_LINE', $this->log->getLinenumber()), false);
// Clear the state
$routine->clearState();
// Clear the tables
if (method_exists($routine, 'clearTables'))
{
$routine->clearTables();
}
// Start processing record
if ($routine->getStart())
{
// Start processing the records
$routine->getProcessRecord();
// Increase the number of records processed
$this->recordsProcessed++;
}
else
{
// The routine reports a problem, usually unmet conditions
// Finish processing
$this->finishProcess(true);
// Stop from processing an error occurred
$processdata = false;
$return = false;
}
}
}
else
{
// Prepare for page reload
$this->finishProcess(false);
// Stop from processing any further, no time left
$processdata = false;
}
// Clean the fields
$this->fields->reset();
}
// Run setup if needed
if (method_exists($routine, 'onAfterStart'))
{
$routine->onAfterStart();
}
}
else
{
$this->log->addStats('incorrect', 'COM_CSVI_NO_VALID_CLASS_FOUND');
// Finish processing
$this->finishProcess(true);
throw new CsviException(JText::sprintf('COM_CSVI_NO_VALID_CLASS_FOUND', $classname));
}
return $return;
}
/**
* Handle the end of the import.
*
* @param bool $finished Set if the import is finished or not.
*
* @return void.
*
* @since 3.0
*/
private function finishProcess($finished=false)
{
// Check if the import is finished or if we are going to reload
if ($finished)
{
// Close the file
$this->file->closeFile(false);
// Remove the file that has just been imported
if (JFile::delete($this->file->getFilename()))
{
// Remove the processfile setting, this is needed for folder processing to continue
$query = $this->db->getQuery(true)
->update($this->db->quoteName('#__csvi_processes'))
->set($this->db->quoteName('processfile') . ' = ""')
->set($this->db->quoteName('position') . ' = 0')
->where($this->db->quoteName('csvi_process_id') . ' = ' . (int) $this->runId);
$this->db->setQuery($query)->execute();
}
// Set the log end timestamp
$query = $this->db->getQuery(true)
->update($this->db->quoteName('#__csvi_logs'))
->set($this->db->quoteName('end') . ' = ' . $this->db->quote(JFactory::getDate(time())->toSql()))
->where($this->db->quoteName('csvi_log_id') . ' = ' . (int) $this->log->getLogId());
$this->db->setQuery($query);
$this->db->execute();
}
else
{
// Store the current file pointer
$filepos = $this->file->getFilePos();
$query = $this->db->getQuery(true)
->update($this->db->quoteName('#__csvi_processes'))
->set($this->db->quoteName('position') . ' = ' . (int) $filepos)
->where($this->db->quoteName('csvi_process_id') . ' = ' . (int) $this->runId);
$this->db->setQuery($query);
$this->db->execute();
// Close the file
$this->file->closeFile(false);
}
}
}