You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

241 lines
6.7 KiB

<?php
// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
//
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
// $Id$
/**
* TikiImporter
*
* This file has the main class for the TikiImporter.
* The TikiImporter was started as a Google Summer of Code project and
* aim to provide a generic structure for importing content from other
* softwares to TikiWiki
* See http://dev.tiki.org/gsoc2009rodrigo for more information
*
* @author Rodrigo Sampaio Primo <rodrigo@utopia.org.br>
* @package tikiimporter
*/
/**
* TikiImporter is a generic class that should be extended
* by any importer class. Each importer class must implement
* the methods validateInput(), parseData() and import()
*
*/
class TikiImporter
{
/**
* The name of the software to import from.
* Should be defined in child class
* @var string
*/
public $softwareName = '';
/**
* During the importing process all the log
* strings will be appended to this object property
* using the method saveAndDisplayLog()
*
* @var string
*/
public $log = '';
/**
* During the importing process all the error
* messagens will be appended to this property
* using the method saveAndDisplayLog()
*
* @var string
*/
public $errors = '';
/**
* Options to the importer (i.e. the number of page
* revisions to import in the case of a wiki software)
*
* The function when implemented by child classes should return
* an array of options that is used in tiki-importer.tpl to display to the user
* the options related with the data import. Currently we support the following
* types: checkbox, select, text
*
* Example of array:
*
* $options = array(
* array('name' => 'importAttachments', 'type' => 'checkbox', 'label' => tra('Import images and other attachments')),
* );
*
* @return array
*/
public static function importOptions()
{
return [];
}
/**
* Abstract method to start the import process and
* call all other functions for each step of the importation
* (validateInput(), parseData(), insertData())
*
* @return array $importFeedback array with the number of pages imported etc
*/
public function import($filePath = null)
{
}
/**
* Abstract method to validate the input import data
*
* Must be implemented by classes
* that extends this one.
*/
public function validateInput()
{
}
/**
* Abstract method to parse the input import data
*
* Must be implemented by classes
* that extends this one and should return
* the data to be used by insertData.
*/
public function parseData()
{
}
/**
* Abstract method to insert the imported content
* into Tiki
*
* Must be implemented by classes
* that extends this one.
*
* @param array $parsedData data ready to be inserted into Tiki
*/
public function insertData($parsedData = null)
{
}
/**
* Abstract method to check the requirements for a
* specific importer.
*
* This method is optional and can be implemented by classes
* that extends this one.
*
* If an error is found the methods should raise an exception.
*/
public function checkRequirements()
{
}
/**
* Return a $importOptions array with the result of the concatenation of the $importOptions
* property of all classes in the hierarchy. Should be called by the classes that
* extend from this one, it doesn't make sense to call this method directly from this
* class.
*
* This method should be static but apparently only with PHP >= 5.3.0 is possible to get
* the name of the class the static method was called. For more information see
* http://us2.php.net/manual/en/function.get-called-class.php
*
* @return array $importOptions
*/
public function getOptions()
{
$class = get_class($this);
$importOptions = [];
do {
$importOptions = array_merge($importOptions, call_user_func([$class, 'importOptions']));
} while ($class = get_parent_class($class));
return $importOptions;
}
/**
* Try to change some PHP settings to avoid problens while running the script:
* - error_reporting
* - display_errors
* - max_execution_time
*
* @return void
*/
public static function changePhpSettings()
{
if (ini_get('error_reporting') != (E_ALL & ~E_DEPRECATED)) {
error_reporting(E_ALL & ~E_DEPRECATED);
}
if (ini_get('display_errors') != true) {
ini_set('display_errors', true);
}
// change max_execution_time
if (ini_get('max_execution_time') != 0) {
set_time_limit(0);
}
}
/**
* Handle the PHP $_FILES errors
*
* @param int $code error code
* @return string $message error message
*/
public static function displayPhpUploadError($code)
{
require_once(__DIR__ . '/../init/tra.php');
$errors = [1 => tra('The uploaded file exceeds the upload_max_filesize directive in php.ini.') . ' ' . ini_get('upload_max_filesize') . 'B',
2 => tra('The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.'),
3 => tra('The uploaded file was only partially uploaded. Please try again.'),
4 => tra('No file was uploaded.'),
6 => tra('Missing a temporary folder.'),
7 => tra('Failed to write file to disk.'),
8 => tra('File upload stopped by extension.'),
];
if (isset($errors[$code])) {
return $errors[$code];
}
}
/**
* Append $msg to $this->log and output the $msg to the browser
* during the execution of the script using the flush() method
*
* @param string $msg the log message
* @param bool $error if the message is a error or not (default false)
* @return void
*/
public function saveAndDisplayLog($msg, $error = false)
{
$this->log .= $msg;
if ($error) {
$this->errors .= $msg;
}
// convert \n to <br> if running script in web browser
if (php_sapi_name() != 'cli') {
$msg = nl2br($msg);
if (ob_get_level() > 0) {
ob_flush();
}
}
echo $msg;
flush();
}
}
/**
*
*/
class ImporterParserException extends Exception
{
}