/lib/importer/tikiimporter_blog.php
PHP | 475 lines | 261 code | 68 blank | 146 comment | 31 complexity | 07ce137a8b0aa52148ba50aa2bc10c73 MD5 | raw file
- <?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$
- /**
- * Class to provide basic functionalities to blog importers. So far
- * used only for the Wordpress importer. For more information
- * see http://dev.tiki.org/Wordpress+importer and http://doc.tiki.org/Wordpress+importer
- *
- * @author Rodrigo Sampaio Primo <rodrigo@utopia.org.br>
- * @package tikiimporter
- */
- require_once('tikiimporter.php');
- /**
- * Class to provide basic functionalities to blog importers. So far
- * used only for the Wordpress importer. For more information
- * see http://dev.tiki.org/Wordpress+importer and http://doc.tiki.org/Wordpress+importer
- *
- * This class has the methods to insert data into Tiki blog. Probably they can
- * be reused by all the importers. Child classes must only implement the functions
- * to extract and prepare the data (validateInput(), parseData())
- *
- * @package tikiimporter
- */
- class TikiImporter_Blog extends TikiImporter
- {
- /**
- * Blog information extracted from the XML file (title, description, created etc)
- * @var array
- */
- public $blogInfo = [];
- /**
- * Instance of TikiImporter_Wiki
- * @var TikiImporter_Wiki
- */
- public $importerWiki = '';
- /**
- * The id of the blog created by the importer
- * @var int
- */
- public $blogId = '';
- /**
- * The data extracted and parsed from the Wordpress
- * XML file.
- * @var array
- */
- public $parsedData = [];
- /**
- * @see lib/importer/TikiImporter#importOptions()
- */
- public static function importOptions()
- {
- $options = [
- ['name' => 'setAsHomePage', 'type' => 'checkbox', 'label' => tra('Set new blog as Tiki homepage')],
- ];
- return $options;
- }
- /**
- * Main function that starts the importing proccess
- *
- * Set the import options based on the options the user selected
- * and start the importing proccess by calling the functions to
- * validate, parse and insert the data.
- *
- * @return null
- */
- public function import($filePath = null)
- {
- $this->setupTiki();
- // child classes must implement this method
- // and it should set $this->parsedData
- $this->parseData();
- $importFeedback = $this->insertData();
- $this->saveAndDisplayLog("\n" . tra('Importation completed!'));
- echo "\n\n<b>" . tra('<a href="tiki-importer.php">Click here</a> to finish the import process') . '</b>';
- flush();
- $_SESSION['tiki_importer_feedback'] = $importFeedback;
- $_SESSION['tiki_importer_log'] = $this->log;
- $_SESSION['tiki_importer_errors'] = $this->errors;
- }
- /**
- * This function change all the necessary Tiki preferences
- * in order to setup the site for the data that will be imported.
- * Also implemented by child classes.
- *
- * @return void
- */
- public function setupTiki()
- {
- $tikilib = TikiLib::lib('tiki');
- $tikilib->set_preference('feature_blogs', 'y');
- }
- /**
- * Insert the imported data into Tiki.
- *
- * @param array $parsedData the return of $this->parseData() (all the data that will be imported)
- *
- * @return array $countData stats about the content that has been imported
- */
- public function insertData($parsedData = null)
- {
- $countData = [];
- $countPosts = count($this->parsedData['posts']);
- $countPages = count($this->parsedData['pages']);
- $countTags = count($this->parsedData['tags']);
- $countCategories = count($this->parsedData['categories']);
- $this->saveAndDisplayLog(
- "\n" . tr(
- 'Found %0 posts, %1 pages, %2 tags and %3 categories. Inserting them into Tiki:',
- $countPosts,
- $countPages,
- $countTags,
- $countCategories
- ) . "\n"
- );
- if (! empty($this->parsedData['posts'])) {
- $this->createBlog();
- }
- if (! empty($this->parsedData)) {
- if (! empty($this->parsedData['tags'])) {
- $this->createTags($this->parsedData['tags']);
- }
- if (! empty($this->parsedData['categories'])) {
- $this->createCategories($this->parsedData['categories']);
- }
- $items = array_merge($this->parsedData['posts'], $this->parsedData['pages']);
- if (! empty($items)) {
- foreach ($items as $key => $item) {
- if ($objId = $this->insertItem($item)) {
- // discover the item key in the $this->parsedData array
- $itemKey = array_search($item, $this->parsedData[$item['type'] . 's']);
- $this->parsedData[$item['type'] . 's'][$itemKey]['objId'] = $objId;
- } else {
- //TODO: improve feedback reporting the difference between the number of items found and items imported
- if ($item['type'] == 'page') {
- $countPages--;
- } else {
- $countPosts--;
- }
- $this->saveAndDisplayLog(tr('Item "%0" NOT imported (there was already a item with the same name)', $item['name']) . "\n");
- }
- }
- }
- }
- $countData['importedPages'] = $countPages;
- $countData['importedPosts'] = $countPosts;
- $countData['importedTags'] = $countTags;
- $countData['importedCategories'] = $countCategories;
- return $countData;
- }
- /**
- * Insert a page or post and its comments and link it with
- * categories and tags.
- *
- * @param array $item a page or post
- * @return int|string page name or post id
- */
- public function insertItem($item)
- {
- $methodName = 'insert' . ucfirst($item['type']);
- if ($objId = $this->$methodName($item)) {
- if ($item['type'] == 'page') {
- $type = 'wiki page';
- $msg = tr('Page "%0" sucessfully imported', $item['name']);
- } elseif ($item['type'] == 'post') {
- $type = 'blog post';
- $msg = tr('Post "%0" sucessfully imported', $item['name']);
- }
- if (! empty($item['comments'])) {
- $this->insertComments($objId, $type, $item['comments']);
- }
- if (! empty($item['tags'])) {
- $this->linkObjectWithTags($objId, $type, $item['tags']);
- }
- if (! empty($item['categories'])) {
- $this->linkObjectWithCategories($objId, $type, $item['categories']);
- }
- $this->saveAndDisplayLog($msg . "\n");
- return $objId;
- }
- }
- /**
- * Create blog based on $this->blogInfo and
- * set new blog as Tiki home page if option selected.
- *
- * @return void
- */
- public function createBlog()
- {
- global $user;
- $bloglib = TikiLib::lib('blog');
- $tikilib = TikiLib::lib('tiki');
- //TODO: refactor replace_blog() to have default values
- //TODO: blog user can be different that the user logged in the system
- if (isset($this->blogInfo['created'])) {
- $created = $this->blogInfo['created'];
- } else {
- $created = $tikilib->now;
- }
- $this->blogId = $bloglib->replace_blog(
- $this->blogInfo['title'],
- $this->blogInfo['desc'],
- $user,
- 'y',
- 10,
- false,
- '',
- 'y',
- 'n',
- 'y',
- 'n',
- 'y',
- 'y',
- 'y',
- 'y',
- 'y',
- 'n',
- '',
- 'y',
- 5,
- 'n',
- $created,
- $this->blogInfo['lastModif']
- );
- if (isset($_REQUEST['setAsHomePage']) && $_REQUEST['setAsHomePage'] == 'on') {
- $tikilib->set_preference('home_blog', $this->blogId);
- $tikilib->set_preference('tikiIndex', 'tiki-view_blog.php?blogId=' . $this->blogId);
- }
- }
- /**
- * Create all existing tags for a blog. Tags here
- * are just created, not related yet with any object (post or page)
- *
- * @param array $tags
- * @return void
- */
- public function createTags($tags)
- {
- $freetaglib = TikiLib::lib('freetag');
- foreach ($tags as $tag) {
- $freetaglib->find_or_create_tag($tag);
- }
- }
- /**
- * Link an object with its tags
- *
- * @param int|string $objId
- * @param string $type
- * @param array $tags
- * @return void
- */
- public function linkObjectWithTags($objId, $type, $tags)
- {
- $freetaglib = TikiLib::lib('freetag');
- global $user;
- $freetaglib->_tag_object_array($user, $objId, $type, $tags);
- }
- /**
- * Create all existing categories for a blog.
- *
- * @param array $categories
- * @return void
- */
- public function createCategories($categories)
- {
- $categlib = TikiLib::lib('categ');
- foreach ($categories as $categ) {
- if (! empty($categ['parent'])) {
- $categ['parentId'] = $categlib->get_category_id($categ['parent']);
- } else {
- $categ['parentId'] = 0;
- }
- $categlib->add_category($categ['parentId'], $categ['name'], $categ['description']);
- }
- }
- /**
- * Link an object with its categories
- *
- * @param int|string $objId
- * @param string $type
- * @param array $categories
- * @return void
- */
- public function linkObjectWithCategories($objId, $type, $categories)
- {
- $categlib = TikiLib::lib('categ');
- foreach ($categories as $categName) {
- $categId = $categlib->get_category_id($categName);
- //$catObjId is the id on tiki_objects table and $objId the id on object own table
- $catObjId = $categlib->get_object_id($type, $objId);
- // apparently this is needed only to create an entry on tiki_categorized_objects
- $categlib->add_categorized_object($type, $objId, '', '', '');
- $categlib->categorize($catObjId, $categId);
- }
- }
- /**
- * Insert page into Tiki using its builtin methods
- *
- * @param array $page
- * @return string|bool page name if was possible to create the new page or false
- */
- public function insertPage($page)
- {
- $objectlib = TikiLib::lib('object');
- $this->instantiateImporterWiki();
- $pageName = $this->importerWiki->insertPage($page);
- // maybe this should go to TikiImporter_Wiki::insertPage()
- if ($pageName) {
- $objectlib->insert_object('wiki page', $pageName, '', $pageName, 'tiki-index.php?page=' . urlencode($pageName));
- }
- return $pageName;
- }
- /**
- * Insert post into Tiki using its builtin methods
- *
- * @param array $post
- * @return int|bool post id if one was created or false
- */
- public function insertPost($post)
- {
- $bloglib = TikiLib::lib('blog');
- $objectlib = TikiLib::lib('object');
- $post = array_merge(['content' => '', 'excerpt' => '', 'author' => '', 'name' => '', 'created' => 0], $post); // set defaults
- $postId = $bloglib->blog_post(
- $this->blogId,
- $post['content'],
- $post['excerpt'],
- $post['author'],
- $post['name'],
- '',
- 'n',
- $post['created']
- );
- if ($postId) {
- $objectlib->insert_object(
- 'blog post',
- $postId,
- '',
- $post['name'],
- 'tiki-view_blog_post.php?postId=' . urlencode($postId)
- );
- }
- return $postId;
- }
- /**
- * Insert comments for a wiki page or post
- *
- * @param int|string $objId int for a post id or string for a wiki page name (used as id)
- * @param string $objType 'blog post' or 'wiki page'
- * @param array $comments
- * @return void
- */
- public function insertComments($objId, $objType, $comments)
- {
- $commentslib = TikiLib::lib('comments');
- $objRef = $objType . ':' . $objId;
- // not used but required by $commentslib->post_new_comment() as is passed by reference
- $message_id = '';
- foreach ($comments as $comment) {
- // set empty values for comments properties if they are not set
- if (! isset($comment['author'])) {
- $comment['author'] = '';
- }
- if (! isset($comment['author_email'])) {
- $comment['author_email'] = '';
- }
- if (! isset($comment['author_url'])) {
- $comment['author_url'] = '';
- }
- $commentId = $commentslib->post_new_comment(
- $objRef,
- 0,
- null,
- '',
- $comment['data'],
- $message_id,
- '',
- 'n',
- '',
- '',
- '',
- $comment['author'],
- $comment['created'],
- $comment['author_email'],
- $comment['author_url']
- );
- if ($comment['approved'] == 0) {
- $commentslib->approve_comment($commentId, 'n');
- }
- }
- }
- /**
- * This function just create an instance of
- * TikiImporter_Wiki and set some default values
- *
- * @return void
- */
- public function instantiateImporterWiki()
- {
- require_once('tikiimporter_wiki.php');
- $this->importerWiki = new TikiImporter_Wiki();
- $this->importerWiki->alreadyExistentPageName = 'appendPrefix';
- $this->importerWiki->softwareName = $this->softwareName;
- }
- }