* @git Joomla Component Builder * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE.txt */ // No direct access to this JCB template file (EVER) defined('_JCB_TEMPLATE') or die; ?> ###BOM### namespace ###NAMESPACEPREFIX###\Component\###ComponentNameSpace###\Administrator\Model; ###IMPORT_CUSTOM_MODEL_HEADER### // No direct access to this file \defined('_JEXEC') or die; /** * ###Component### ###View### Base Database Model * * @since 1.6 */ class ###View###importModel extends BaseDatabaseModel { // set uploading values protected $use_streams = false; protected $allow_unsafe = false; protected $safeFileOptions = []; /** * @var object JTable object */ protected $_table = null; /** * @var object JTable object */ protected $_url = null; /** * Model context string. * * @var string */ protected $_context = 'com_###component###.###view###'; /** * Import Settings */ protected $getType = NULL; protected $dataType = NULL; /** * Method to auto-populate the model state. * * Note. Calling getState in this method will result in recursion. * * @return void * */ protected function populateState() { $app = Factory::getApplication('administrator'); $this->setState('message', $app->getUserState('com_###component###.message')); $app->setUserState('com_###component###.message', ''); // Recall the 'Import from Directory' path. $path = $app->getUserStateFromRequest($this->_context . '.import_directory', 'import_directory', $app->get('tmp_path')); $this->setState('import.directory', $path); parent::populateState(); } ###IMPORT_METHOD_CUSTOM### /** * Works out an importation spreadsheet from a HTTP upload * * @return spreadsheet definition or false on failure */ protected function _getPackageFromUpload() { // Get the uploaded file information $app = Factory::getApplication(); $input = $app->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('import_package', null, 'raw'); // Make sure that file uploads are enabled in php if (!(bool) ini_get('file_uploads')) { $app->enqueueMessage(Text::_('COM_###COMPONENT###_IMPORT_MSG_WARNIMPORTFILE'), 'warning'); return false; } // If there is no uploaded file, we have a problem... if (!is_array($userfile)) { $app->enqueueMessage(Text::_('COM_###COMPONENT###_IMPORT_MSG_NO_FILE_SELECTED'), 'warning'); return false; } // Check if there was a problem uploading the file. if ($userfile['error'] || $userfile['size'] < 1) { $app->enqueueMessage(Text::_('COM_###COMPONENT###_IMPORT_MSG_WARNIMPORTUPLOADERROR'), 'warning'); return false; } // Build the appropriate paths $config = Factory::getConfig(); $tmp_dest = $config->get('tmp_path') . '/' . $userfile['name']; $tmp_src = $userfile['tmp_name']; // Move uploaded file $p_file = File::upload($tmp_src, $tmp_dest, $this->use_streams, $this->allow_unsafe, $this->safeFileOptions); // Was the package downloaded? if (!$p_file) { $session = Factory::getSession(); $session->clear('package'); $session->clear('dataType'); $session->clear('hasPackage'); // was not uploaded return false; } // check that this is a valid spreadsheet $package = $this->check($userfile['name']); return $package; } /** * Import an spreadsheet from a directory * * @return array Spreadsheet details or false on failure * */ protected function _getPackageFromFolder() { $app = Factory::getApplication(); $input = $app->input; // Get the path to the package to import $p_dir = $input->getString('import_directory'); $p_dir = Path::clean($p_dir); // Did you give us a valid path? if (!file_exists($p_dir)) { $app->enqueueMessage(Text::_('COM_###COMPONENT###_IMPORT_MSG_PLEASE_ENTER_A_PACKAGE_DIRECTORY'), 'warning'); return false; } // Detect the package type $type = $this->getType; // Did you give us a valid package? if (!$type) { $app->enqueueMessage(Text::_('COM_###COMPONENT###_IMPORT_MSG_PATH_DOES_NOT_HAVE_A_VALID_PACKAGE'), 'warning'); } // check the extention if(!$this->checkExtension($p_dir)) { // set error message $app->enqueueMessage(Text::_('COM_###COMPONENT###_IMPORT_MSG_DOES_NOT_HAVE_A_VALID_FILE_TYPE'), 'warning'); return false; } $package['packagename'] = null; $package['dir'] = $p_dir; $package['type'] = $type; return $package; } /** * Import an spreadsheet from a URL * * @return Package details or false on failure * */ protected function _getPackageFromUrl() { $app = Factory::getApplication(); $input = $app->input; // Get the URL of the package to import $url = $input->getString('import_url'); // Did you give us a URL? if (!$url) { $app->enqueueMessage(Text::_('COM_###COMPONENT###_IMPORT_MSG_ENTER_A_URL'), 'warning'); return false; } // Download the package at the URL given $p_file = InstallerHelper::downloadPackage($url); // Was the package downloaded? if (!$p_file) { $app->enqueueMessage(Text::_('COM_###COMPONENT###_IMPORT_MSG_INVALID_URL'), 'warning'); return false; } // check that this is a valid spreadsheet $package = $this->check($p_file); return $package; } /** * Check a file and verifies it as a spreadsheet file * Supports .csv .xlsx .xls and .ods * * @param string $p_filename The uploaded package filename or import directory * * @return array of elements * */ protected function check($archivename) { $app = Factory::getApplication(); // Clean the name $archivename = Path::clean($archivename); // check the extention if(!$this->checkExtension($archivename)) { // Cleanup the import files $this->remove($archivename); $app->enqueueMessage(Text::_('COM_###COMPONENT###_IMPORT_MSG_DOES_NOT_HAVE_A_VALID_FILE_TYPE'), 'warning'); return false; } $config = Factory::getConfig(); // set Package Name $check['packagename'] = $archivename; // set directory $check['dir'] = $config->get('tmp_path'). '/' .$archivename; // set type $check['type'] = $this->getType; return $check; } ###IMPORT_EXT_METHOD### /** * Clean up temporary uploaded spreadsheet * * @param string $package Name of the uploaded spreadsheet file * * @return boolean True on success * */ protected function remove($package) { $config = Factory::getConfig(); $package = $config->get('tmp_path'). '/' .$package; // Is the package file a valid file? if (is_file($package)) { File::delete($package); } elseif (is_file(Path::clean($package))) { // It might also be just a base filename File::delete(Path::clean($package)); } } ###IMPORT_SETDATA_METHOD### ###IMPORT_SAVE_METHOD### protected function getAlias($name,$type = false) { // sanitize the name to an alias if (Factory::getConfig()->get('unicodeslugs') == 1) { $alias = OutputFilter::stringURLUnicodeSlug($name); } else { $alias = OutputFilter::stringURLSafe($name); } // must be a uniqe alias if ($type) { return $this->getUniqe($alias,'alias',$type); } return $alias; } /** * Method to generate a uniqe value. * * @param string $field name. * @param string $value data. * @param string $type table. * * @return string New value. */ protected function getUniqe($value,$field,$type) { // insure the filed is always uniqe while (isset($this->uniqeValueArray[$type][$field][$value])) { $value = StringHelper::increment($value, 'dash'); } $this->uniqeValueArray[$type][$field][$value] = $value; return $value; } protected function getAliasesUsed($table) { // Get a db connection. $db = $this->getDatabase(); // first we check if there is a alias column $columns = $db->getTableColumns('#__###component###_'.$table); if(isset($columns['alias'])){ // Create a new query object. $query = $db->getQuery(true); $query->select($db->quoteName(array('alias'))); $query->from($db->quoteName('#__###component###_'.$table)); $db->setQuery($query); $db->execute(); if ($db->getNumRows()) { $aliases = $db->loadColumn(); foreach($aliases as $alias) { $this->uniqeValueArray[$table]['alias'][$alias] = $alias; } } return true; } return false; } }