%PDF- %PDF-
Direktori : /home/lightco1/upgrade.lightco.com.au/administrator/components/com_csvi/models/ |
Current File : /home/lightco1/upgrade.lightco.com.au/administrator/components/com_csvi/models/default.php |
<?php /** * @package CSVI * @subpackage Model * * @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; /** * The default model * * @package CSVI * @subpackage Model * @since 6.0 */ class CsviModelDefault extends FOFModel { /** * Template helper * * @var CsviHelperTemplate * @since 6.0 */ protected $template; /** * Logger helper * * @var CsviHelperLog * @since 6.0 */ protected $log; /** * CSVI helper * * @var CsviHelperCsvi * @since 6.0 */ protected $csvihelper; /** * Fields helper * * @var CsviHelperImportfields * @since 6.0 */ protected $fields; /** * File helper * * @var CsviHelperFile * @since 6.0 */ protected $file; /** * Name of the file to process * * @var string * @since 6.0 */ protected $processfile = ''; /** * Database connector * * @var JDatabase * @since 6.0 */ protected $db; /** * The addon helper * * @var object * @since 6.0 */ protected $helper; /** * The addon config helper * * @var object * @since 6.0 */ protected $helperConfig; /** * The ID of the current run * * @var int * @since 6.0 */ protected $runId = 0; /** * The CSVI Helper Settings * * @var CsviHelperSettings * @since 6.0 */ protected $settings; /** * Public class constructor * * @param array $config The configuration array * * @since 6.0 */ public function __construct($config = array()) { parent::__construct($config); // Load the database class $this->db = JFactory::getDbo(); // Load the global CSVI settings $this->settings = new CsviHelperSettings($this->db); // Load the logger $this->log = new CsviHelperLog($this->settings, $this->db); // Load the CSVI helper $this->csvihelper = new CsviHelperCsvi; $this->csvihelper->initialise($this->log); } /** * Initialise the import. * * @param int $csvi_process_id The unique ID of the import run * * @return bool True if template ID is found. * * @throws CsviException * * @since 6.0 */ public function initialiseImport($csvi_process_id) { // Set the run ID $this->runId = $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('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->csvi_template_id) { // Empty the processed table $this->db->truncateTable('#__csvi_processed'); // Load the template $this->loadTemplate($details->csvi_template_id); // Setup the addon autoloader $component = $this->template->get('component'); // If the addon is not installed show message to install it if (file_exists(JPATH_ADMINISTRATOR . '/components/com_csvi/addon/' . $component)) { JLoader::registerPrefix(ucfirst($component), JPATH_ADMINISTRATOR . '/components/com_csvi/addon/' . $component); } else { throw new CsviException(JText::sprintf('COM_CSVI_NO_ADDON_INSTALLED', $component)); } // Setup the logger $this->log->setLogId($details->csvi_log_id); $this->log->setActive($this->template->get('log', false)); // Set the file being processed if (empty($details->processfile) && empty($details->processfolder)) { // Check the source $source = $this->template->get('source', 'fromupload'); // If fromserver we already have the full path and name, store it if ($source == 'fromserver') { $local_file = JPath::clean($this->template->get('local_csv_file'), '/'); if (is_dir($local_file)) { $details->processfolder = $local_file; $this->storeFolder($details->processfolder); } elseif (is_file($local_file)) { $details->processfile = $local_file; $this->storeFilename($details->processfile); } } } // Check if we already have a file to process if (empty($details->processfile) && !empty($details->processfolder)) { // Load the first file in line $files = JFolder::files( $details->processfolder, '.', false, false, $exclude = array('.svn', 'CVS', '.DS_Store', '__MACOSX'), array('^\..*', '.*~'), true ); if (is_array($files) && !empty($files)) { $details->processfile = $details->processfolder . '/' . $files[0]; } } if ($details->processfile) { // Set the folder to process $this->processfolder = $details->processfolder; // Set the file to process $this->processfile = $details->processfile; // Source is always from server as we already uploaded it to our server $this->loadImportFile(); // 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); } } return true; } else { throw new CsviException(JText::sprintf('COM_CSVI_NO_TEMPLATE_ID_FOUND_RUN', $csvi_process_id), 509); } } /** * Load the import file helper. * * @return bool True on success | False on failure. * * @since 6.0 * * @throws CsviException */ 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 extension of the import file $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; default: throw new CsviException( JText::sprintf('COM_CSVI_EXTENSTION_NOT_RECOGNIZED_ON_IMPORT_FILE', $upload_parts['extension'], $this->processfile), 516 ); 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()) { return true; } else { throw new CsviException(JText::sprintf('COM_CSVI_CANNOT_PROCESS_FILE', $this->processfile), 503); } } /** * Initialise the export. * * @param int $csvi_process_id The unique ID of the import run * * @return bool True if template ID is found. * * @since 6.0 * * @throws CsviException */ public function initialiseExport($csvi_process_id) { // Set the run ID $this->runId = $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('processfile'), ) ) ->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->csvi_template_id) { // Load the template if needed if (is_null($this->template)) { $this->loadTemplate($details->csvi_template_id); } // Setup the logger $this->log->setLogId($details->csvi_log_id); // Set the file being processed if ($details->processfile) { $this->processfile = $details->processfile; // Load the file handler $this->loadExportFile(); // Load the fields $this->loadFields(); } return true; } else { throw new CsviException(JText::sprintf('COM_CSVI_NO_TEMPLATE_ID_FOUND_RUN', $csvi_process_id), 509); } } /** * Store the filename to process. * * @param string $filename The name of the file to store * * @return bool True if filename is stored | False if it cannot be stored. * * @since 6.0 * * @throws CsviException */ protected function storeFilename($filename) { if (!empty($filename)) { $query = $this->db->getQuery(true) ->update($this->db->quoteName('#__csvi_processes')) ->set($this->db->quoteName('processfile') . ' = ' . $this->db->quote($filename)) ->where($this->db->quoteName('csvi_process_id') . ' = ' . (int) $this->runId); $this->db->setQuery($query); return $this->db->execute(); } else { throw new CsviException(JText::_('COM_CSVI_CANNOT_STORE_FILENAME_FOR_IMPORT')); } } /** * Store the folder to process. * * @param string $folder The name of the file to store * * @return bool True if filename is stored | False if it cannot be stored. * * @throws CsviException * * @since 6.0 */ protected function storeFolder($folder) { if (!empty($folder)) { $query = $this->db->getQuery(true) ->update($this->db->quoteName('#__csvi_processes')) ->set($this->db->quoteName('processfolder') . ' = ' . $this->db->quote($folder)) ->where($this->db->quoteName('csvi_process_id') . ' = ' . (int) $this->runId); $this->db->setQuery($query); return $this->db->execute(); } else { throw new CsviException(JText::_('COM_CSVI_CANNOT_STORE_FOLDER_FOR_IMPORT')); } } /** * Check the temporary folder. * * @return void. * * @since 6.0 */ protected function checkTmpFolder() { // Define the tmp folder $config = JFactory::getConfig(); $tmp_path = $config->get('tmp_path'); if (!defined('CSVIPATH_TMP')) { define('CSVIPATH_TMP', JPath::clean($tmp_path . '/com_csvi', '/')); } } /** * Load the necessary language files. * * @return void. * * @since 6.0 */ protected function loadLanguageFiles() { $jlang = JFactory::getLanguage(); // Language files located in the component folder $jlang->load('com_csvi', JPATH_COMPONENT_ADMINISTRATOR, 'en-GB', true); $jlang->load('com_csvi', JPATH_COMPONENT_ADMINISTRATOR, $jlang->getDefault(), true); $jlang->load('com_csvi', JPATH_COMPONENT_ADMINISTRATOR, null, true); } /** * Set the log basics. * * @return bool Always returns true. * * @since 6.0 */ public function initialiseLog() { // Set some log info $this->log->setActive($this->template->getLog()); $this->log->setAddon($this->template->get('component')); $this->log->setActionType($this->template->get('operation')); $this->log->setTemplateName($this->template->getName()); $this->log->initialise(); return true; } /** * Initialise the addons. * * @param string $addon The addon to run the export for * * @return void. * * @since 6.0 */ public function initialiseAddon($addon) { // Load the component helpers JLoader::import('joomla.filesystem.file'); // Load the helper if (JFile::exists(JPATH_ADMINISTRATOR . '/components/com_csvi/addon/' . $addon . '/helper/' . $addon . '.php')) { $helperName = ucfirst($addon) . 'Helper' . ucfirst($addon); $this->helper = new $helperName($this->template, $this->log, $this->fields, $this->db); } // Load the config helper if (JFile::exists(JPATH_ADMINISTRATOR . '/components/com_csvi/addon/' . $addon . '/helper/' . $addon . '_config.php')) { $helperName = ucfirst($addon) . 'Helper' . ucfirst($addon) . '_config'; $this->helperConfig = new $helperName; } } /** * Invoke a running import or export. * * @return int The run ID * * @since 6.0 */ public function initialiseRun() { // Assemble the columns and values $columns = array($this->db->quoteName('csvi_template_id'), $this->db->quoteName('csvi_log_id'), $this->db->quoteName('userId')); $values = $this->db->quote($this->template->getId()) . ', ' . $this->db->quote($this->log->getLogId()) . ', ' . (int) JFactory::getUser()->get('id'); // Check if the processfile exists if ($this->processfile) { $columns[] = $this->db->quoteName('processfile'); $values .= ', ' . $this->db->quote($this->processfile); } $query = $this->db->getQuery(true) ->insert($this->db->quoteName('#__csvi_processes')) ->columns($columns) ->values($values); $this->db->setQuery($query); $this->db->execute(); return $this->db->insertid(); } /** * Load the template helper. * * @param int $template_id The ID of the template to load * * @return mixed True if template is loaded | Throw exception if not loaded. * * @since 6.0 * * @throws Exception * @throws CsviException */ public function loadTemplate($template_id) { if ($template_id) { $this->template = new CsviHelperTemplate($template_id, $this->csvihelper); } else { throw new CsviException(JText::_('COM_CSVI_NO_TEMPLATE_SPECIFIED'), 402); } return true; } /** * Get the template instance. * * @return CsviHelperTemplate An instance of CsviHelperTemplate. * * @since 6.0 */ public function getTemplate() { return $this->template; } /** * Set the template instance. * * @param CsviHelperTemplate $template An instance of CsviHelperTemplate. * * @return void. * * @since 6.0 */ public function setTemplate(CsviHelperTemplate $template) { $this->template = $template; } /** * Get the file instance. * * @return CsviHelperFile An instance of CsviHelperFile. * * @since 6.0 */ public function getFile() { return $this->file; } /** * Get the configuration fields the user wants to use * * The configuration fields can be taken from the uploaded file or from * the database. Depending on the template settings. * * @return bool true|false true when there are config fields|false when there are no or unsupported fields. * * @since 3.0 */ protected function loadFields() { // Get the correct fields helper $className = 'CsviHelper' . ucfirst($this->template->get('action')) . 'fields'; $this->fields = new $className($this->template, $this->log, $this->db); $this->fields->setFile($this->file); return true; } /** * Sets the system limits to user defined values. * * Sets the system limits to user defined values to allow for longer and * bigger uploaded files. * * @return void. * * @since 3.0 */ protected function systemLimits() { // See if we need to use the new limits if ($this->template->get('use_system_limits')) { $this->log->add('Setting system limits:', false); // Apply the new memory limits $execution_time = $this->template->get('max_execution_time'); if (strlen($execution_time) > 0) { $this->log->add('Setting max_execution_time to ' . $execution_time . ' seconds', false); @ini_set('max_execution_time', $execution_time); } $memory_limit = $this->template->get('memory_limit'); if ($memory_limit == '-1') { $this->log->add('Setting memory_limit to ' . $memory_limit, false); @ini_set('memory_limit', $memory_limit); } elseif (strlen($memory_limit) > 0) { $this->log->add('Setting memory_limit to ' . $memory_limit . 'M', false); @ini_set('memory_limit', $memory_limit . 'M'); } $post_size = $this->template->get('post_max_size'); if (strlen($post_size) > 0) { $this->log->add('Setting post_max_size to ' . $post_size . 'M', false); @ini_set('post_max_size', $post_size . 'M'); } $file_size = $this->template->get('upload_max_filesize'); if (strlen($file_size) > 0) { $this->log->add('Setting upload_max_filesize to ' . $file_size . 'M', false); @ini_set('upload_max_filesize', $file_size . 'M'); } } } /** * Return the log ID. * * Used in export * * @return int The ID of the log. * * @since 6.0 */ public function getLogId() { return $this->log->getLogId(); } /** * Return the run ID. * * Used in export * * @return int The ID of the run. * * @since 6.0 */ public function getRunId() { return $this->runId; } /** * Return the process file. * * @return string The name of the process file. * * @since 6.0 */ public function getProcessfile() { return $this->processfile; } }