esedic
11/18/2015 - 11:26 AM

Rebuilt Joomla's ucm_content and ucm_base tables for articles

Rebuilt Joomla's ucm_content and ucm_base tables for articles

<?php
/**
 * @author    Federico Liva <mail@federicoliva.info>
 * @copyright Copyright (C)2015 Federico Liva. All rights reserved.
 * @license   GNU General Public License, version 2 or later
 */

error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('max_execution_time', 0);

define('DB_HOST', '');		// Set the database host
define('DB_USER', '');		// Set the database user
define('DB_PASS', '');		// Set the database password
define('DB_NAME', '');		// Set the database name
define('DB_PREFIX', '');	// Set the tables prefix

$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);

if ($db->connect_errno)
{
	die('Failed to connect to MySQL: (' . $db->connect_errno . ') ' . $db->connect_error);
}

//
// STEP 1
//
// As first thing, drop the rows af ucm tables.

foreach (['ucm_base', 'ucm_content', 'ucm_history'] as $table)
{
	if (!$db->query('TRUNCATE TABLE ' . DB_PREFIX . $table))
	{
		die('Cannot truncate ' . DB_PREFIX . $table . ' table: (' . $db->errno . ') ' . $db->error);
	}
}

//
// STEP 2
//
// Get the list of content types.
//

if ($result = $db->query('SELECT * FROM ' . DB_PREFIX . 'content_types'))
{
	while ($type = $result->fetch_assoc())
	{
		$content_types[$type['type_alias']] = $type['type_id'];
	}
}
else
{
	die('Cannot retrieve content types: (' . $db->errno . ') ' . $db->error);
}

//
// STEP 3
//
// Get the list of languages.
//

if ($result = $db->query('SELECT * FROM ' . DB_PREFIX . 'languages'))
{
	$languages['*'] = $languages[''] = 0; // ucm_base wants zero for star or empty language code

	while ($type = $result->fetch_assoc())
	{
		$languages[$type['lang_code']] = $type['lang_id'];
	}
}
else
{
	die('Cannot retrieve languages: (' . $db->errno . ') ' . $db->error);
}

//
// STEP 4
//
// Build the list of all articles.

if ($result = $db->query('SELECT * FROM ' . DB_PREFIX . 'content'))
{
	$i = 1;

	while ($article = $result->fetch_assoc())
	{
		// Check for content types
		if (empty($content_types['com_content.article']))
		{
			die('Content type id not found for com_content.article');
		}

		// Check for languages
		if (empty($languages))
		{
			die('Languages are not loaded');
		}

		$ucm_content_row = [
			'core_content_id'          => $i,
			'core_type_alias'          => 'com_content.article',
			'core_title'               => $article['title'],
			'core_alias'               => $article['alias'],
			'core_body'                => $article['introtext'],
			'core_state'               => $article['state'],
			'core_checked_out_time'    => $article['checked_out_time'],
			'core_checked_out_user_id' => $article['checked_out'],
			'core_access'              => $article['access'],
			'core_params'              => $article['attribs'],
			'core_featured'            => $article['featured'],
			'core_metadata'            => $article['metadata'],
			'core_created_user_id'     => $article['created_by'],
			'core_created_by_alias'    => $article['created_by_alias'],
			'core_created_time'        => $article['created'],
			'core_modified_user_id'    => $article['modified_by'],
			'core_modified_time'       => $article['modified'],
			'core_language'            => $languages[$article['language']],
			'core_publish_up'          => $article['publish_up'],
			'core_publish_down'        => $article['publish_down'],
			'core_content_item_id'     => $article['id'],
			'asset_id'                 => $article['asset_id'],
			'core_images'              => $article['images'],
			'core_urls'                => $article['urls'],
			'core_hits'                => $article['hits'],
			'core_version'             => $article['version'],
			'core_ordering'            => $article['ordering'],
			'core_metakey'             => $article['metakey'],
			'core_catid'               => $article['catid'],
			'core_xreference'          => $article['xreference'],
			'core_type_id'             => $content_types['com_content.article']
		];

		// Insert into ucm_content
		if (!$db->query(insert_query($ucm_content_row, DB_PREFIX . 'ucm_content')))
		{
			die('Cannot insert into ucm_content table: (' . $db->errno . ') ' . $db->error);
		}

		$ucm_base_row = [
			'ucm_id'          => $ucm_content_row['core_content_id'],
			'ucm_item_id'     => $ucm_content_row['core_content_item_id'],
			'ucm_type_id'     => $ucm_content_row['core_type_id'],
			'ucm_language_id' => $ucm_content_row['core_language']
		];

		// Insert into ucm_base
		if (!$db->query(insert_query($ucm_base_row, DB_PREFIX . 'ucm_base')))
		{
			die('Cannot insert into ucm_base table: (' . $db->errno . ') ' . $db->error);
		}

		$i++;
	}

	$result->close();
}
else
{
	die('Cannot retrieve articles data: (' . $db->errno . ') ' . $db->error);
}

echo 'UCM tables successfully rebuilt!';

/**
 * Build an INSERT query for an associative array.
 *
 * @param array  $array      The array to be processed.
 * @param string $table_name The name of the table where will be do the INSERT.
 *
 * @return string
 */
function insert_query($array, $table_name)
{
	$columns = $values = [];

	foreach ($array as $column => $value)
	{
		$columns[] = '`' . addslashes($column) . '`';
		$values[]  = '\'' . addslashes($value) . '\'';
	}

	$columns_list = implode(', ', $columns);
	$values_list  = implode(', ', $values);

	return 'INSERT INTO ' . $table_name . ' (' . $columns_list . ') VALUES (' . $values_list . ')';
}