File Manager

Current Directory: /home/astoriaah/www/old15/administrator/components/com_sh404sef/classes
Viewing File: /home/astoriaah/www/old15/administrator/components/com_sh404sef/classes/importgeneric.php
<?php /** * sh404SEF - SEO extension for Joomla! * * @author Yannick Gaultier * @copyright (c) Yannick Gaultier 2014 * @package sh404SEF * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL * @version 4.4.4.1791 * @date 2014-07-01 */ // Security check to ensure this file is being included by a parent file. if (!defined('_JEXEC')) die('Direct Access to this location is not allowed.'); /** * Implement wizard based exportation of generic data * * @author shumisha * */ class Sh404sefClassImportgeneric extends JObject { /** * An array holding each step details * A step is defined as a task, a view and a layout * By default, task can be 'display', but still need * to be defined in array * @var array */ public $_stepsMap = array( -2 => array( 'task' => 'doTerminate', 'view' => 'wizard', 'layout' => 'default') ,-1 => array( 'task' => 'doCancel', 'view' => 'wizard', 'layout' => 'default') , 0 => array( 'task' => 'doStart', 'view' => 'wizard', 'layout' => 'default') , 1 => array( 'task' => 'doUpload', 'view' => 'wizard', 'layout' => 'default') , 2 => array( 'task' => 'doValidate', 'view' => 'wizard', 'layout' => 'default') , 3 => array( 'task' => 'doImport', 'view' => 'wizard', 'layout' => 'default') ); public $_stepsCount = 0; public $_steps = array( 'next' => 0, 'previous' => 0, 'cancel' => -1, 'terminate' => -2); public $_button = ''; public $_buttonsList = array ('next', 'previous', 'terminate', 'cancel'); // visible buttons are displayed as toolbar pressbutton // buttons not on that list are passed as 'hidden' post data public $_visibleButtonsList = array ( 'previous', 'next', 'terminate', 'cancel'); protected $_context = ''; protected $_total = 0; protected $_parentController = null; protected $_filename = ''; protected $_result = array(); const MAX_PAGEIDS_PER_STEP = 20; /** * Constructor, keep reference to controller * which called the adapter * @param unknown_type $parentController */ public function __construct( $parentController) { $this->_parentController = $parentController; } /** * Parameters for current adapter, to be used by parent controller * */ public function setup() { $this->_stepsCount = count( $this->_stepsMap); // prepare data for controller $properties = array(); $properties['_defaultController'] = 'wizard'; $properties['_defaultTask'] = ''; $properties['_defaultModel'] = ''; $properties['_defaultView'] = 'wizard'; $properties['_defaultLayout'] = 'default'; $properties['_returnController'] = 'default'; $properties['_returnTask'] = ''; $properties['_returnView'] = 'default'; $properties['_returnLayout'] = 'default'; $properties['_pageTitle'] = JText::_('COM_SH404SEF_IMPORTING_TITLE'); return $properties; } /** * First step, by default a message * and a Terminate button * */ public function doStart() { // which button should be displayed ? $this->_visibleButtonsList = array ('next', 'cancel'); // next steps definition $this->_steps = array( 'next' => 1, 'previous' => 0, 'cancel' => -1, 'terminate' => -2); // return results $this->_result['mainText'] = JText::_('COM_SH404SEF_IMPORT_' . strtoupper( $this->_context). '_START'); return $this->_result; } /** * Second step, let user upload file * */ public function doUpload() { // which button should be displayed ? $this->_visibleButtonsList = array ( 'next', 'cancel'); // next steps definition $this->_steps = array( 'next' => 2, 'previous' => 0, 'cancel' => -1, 'terminate' => -2); // return results // make sure we can upload, ie set the correct encoding type for the form $this->_result['setFormEncType'] = 'multipart/form-data'; // prepare display $this->_result['mainText'] = JText::sprintf('COM_SH404SEF_IMPORT_UPLOAD_FILE', Sh404sefHelperFiles::getMaxUploadSize()); // add a file browse button $this->_result['mainText'] .= '<div style="text-align:center;width:100%;" ><input type="file" name="wizardfile" size="70" /></div>'; return $this->_result; } /** * Second step, read file content, validate and display for user go ahead * */ public function doValidate() { // get file name $fileRecord = JRequest::getVar( 'wizardfile', null, 'files'); // move uploaded file, to get access to it $this->_filename = Sh404sefHelperFiles::createFileName( $this->_filename, 'sh404sef_import_' . $this->_context); try { if (!move_uploaded_file($fileRecord['tmp_name'], $this->_filename)) { // could not write to web space temp dir throw new Sh404sefExceptionDefault( JText::_('COM_SH404SEF_WRITE_FAILED')); } // which button should be displayed ? $this->_visibleButtonsList = array ( 'previous', 'next', 'cancel'); // next steps definition $this->_steps = array( 'next' => 3, 'previous' => 1, 'cancel' => -1, 'terminate' => -2); // analyse file content, returning itemsCount $importType = $this->_analyzeImportFileContent( $this->_filename); // we may have to change the opSubject and related data. If user asked for instance to import // aliases, from the aliases page, but actually loaded an import file // containing urls or pageids if ($this->_context != $importType) { $this->_result['opSubject'] = $importType; // update filename $oldFileName = $this->_filename; $this->_filename = str_replace( $this->_context, $importType, $this->_filename); // and rename the temp file JFile::move( $oldFileName, $this->_filename); // tell parent controller that we should go to new target afer this import $this->_parentController->set( '_returnController', $importType); $this->_parentController->set( '_returnView', $importType); } // save current file for next steps $this->_result['mainText'] = JText::sprintf( 'COM_SH404SEF_IMPORT_VALIDATE_IMPORT', $importType, $this->_total); $this->_result['hiddenText'] = '<input type="hidden" name="filename" value="' . $this->_filename . '" />'; } catch (Exception $e) { $this->_handleException( $e); } return $this->_result; } /** * Last step, actually perform importation * */ public function doImport() { // collect file and import type information $this->_filename = JRequest::getString( 'filename'); try { // read file content in an array $lines = file( $this->_filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); // start analysing if (empty( $lines)) { throw new Sh404sefExceptionDefault( 'COM_SH404SEF_ERROR_IMPORT'); } // extract header line $header = array_shift( $lines); if (empty( $header)) { throw new Sh404sefExceptionDefault( 'COM_SH404SEF_ERROR_IMPORT'); } // turn header into an array $header = $this->_lineToArray( $header); // count items $this->_total = count( $lines); // iterate through file content and create each record foreach( $lines as $line) { $this->_createRecord( $header, $line); } // get back memory unset( $lines); // delete temporary uploaded file JFile::delete( $this->_filename); // which button should be displayed ? $this->_visibleButtonsList = array ( 'terminate'); // next steps definition $this->_steps = array( 'next' => 3, 'previous' => 0, 'cancel' => -1, 'terminate' => -2); // setup display of wizard last page $this->_result['hiddenText'] = ''; $this->_result['mainText'] = JText::sprintf('COM_SH404SEF_IMPORT_DONE', $this->_total, $this->_context); $this->_result['mainText'] .= $this->_getTerminateOptions(); } catch (Exception $e) { $this->_handleException( $e); } return $this->_result; } /** * Close the wizard window and redirect to default page * */ public function doTerminate() { // now go back to main page $this->_result = array( 'redirectTo' => true); return $this->_result; } /** * Close the wizard window and redirect to default page * */ public function doCancel() { $this->_result['redirectTo'] = true; $this->_result['redirectOptions'] = array(); return $this->_result; } /** * Analyze the content of a potential import file * to try recognize its content. Also find the * number of records in the file * @param string $filename fully pathed file name */ protected function _analyzeImportFileContent( $filename) { // read file content in an array $lines = file( $filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); // start analysing if (empty( $lines)) { throw new Sh404sefExceptionDefault( JText::_('COM_SH404SEF_IMPORT_UNRECOGNIZED_CONTENT')); } // extract header line jimport( 'joomla.utilities.string'); $header = JString::trim(array_shift( $lines)); if (empty( $header)) { throw new Sh404sefExceptionDefault( JText::_('COM_SH404SEF_IMPORT_UNRECOGNIZED_CONTENT')); } // check against known headers $headers = Sh404sefHelperGeneral::getExportHeaders(); foreach( $headers as $key => $value) { if( $header == $value) { $importType = $key; break; } } // have we found something ? if (empty( $importType)) { throw new Sh404sefExceptionDefault( JText::_('COM_SH404SEF_IMPORT_UNRECOGNIZED_CONTENT')); } // count items $this->_total = count( $lines); // clear memory unset( $lines); // return record return $importType; } /** * Return html for any option that could * be presented to the user on the last * page of the wizard (like clean temp files) * for instance. This will be displayed just after * the mainText text, as prepared by the main * part of this controller */ protected function _getTerminateOptions() { $options = ''; return $options; } /** * Handle an exception by returning to step 2, where * user can select a file * * @param Sh404sefExceptionDefault $e */ protected function _handleException( Exception $e) { // unable to get the file, display error and go back to step 2, "doUpload" $this->_parentController->setError( $e->getMessage()); // try delete the uploaded file if (JFile::exists( $this->_filename)) { JFile::delete( $this->_filename); } // go back to previous step $this->doUpload(); } /** * Creates a record in the database, based * on data read from import file * * @param array $header an array of fields, as built from the header line * @param string $line raw record obtained from import file */ protected function _createRecord( $header, $line) { return true; } protected function _lineToArray( $line, $glue = null) { $glue = is_null( $glue) ? Sh404sefHelperFiles::$stringDelimiter . Sh404sefHelperFiles::$fieldDelimiter . Sh404sefHelperFiles::$stringDelimiter : $glue; // remove opening and closing quotes - can't use trim or ltrim, as this would remove several occurences if (substr( $line, 0, 1) == Sh404sefHelperFiles::$stringDelimiter) { $line = substr( $line, 1); } if (substr( $line, -1, 1) == Sh404sefHelperFiles::$stringDelimiter) { $line = substr( $line, 0, -1); } // break up the line $records = explode( $glue, $line); if (empty( $records)) { return $records; } // now clean up a bit foreach( $records as $i => $value) { // remove double quotes, and store back in array $records[$i] = Sh404sefHelperFiles::csvUnquote( $value); } return $records; } }