Файл: apwa/stk/tools/support/fix_left_right_ids.php
Строк: 55
<?php
/**
*
* @package Support Toolkit - Fix Left/Right ID's
* @version $Id$
* @copyright (c) 2009 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
class fix_left_right_ids
{
/**
* Display Options
*
* Output the options available
*/
function display_options()
{
return 'FIX_LEFT_RIGHT_IDS';
}
/**
* Run Tool
*
* Does the actual stuff we want the tool to do after submission
*/
function run_tool()
{
global $cache, $db;
$changes_made = false;
/**
* Fix Left/Right ID's for the modules table
*/
// We need to do each module class separately, so we need to get a list of each class available.
$result = $db->sql_query('SELECT DISTINCT(module_class) FROM ' . MODULES_TABLE);
while ($row = $db->sql_fetchrow($result))
{
// Now start fixing the modules for this class
$i = 1;
$where = array('module_class = '' . $row['module_class'] .''');
$changes_made = (($this->fixem($i, 'module_id', MODULES_TABLE, 0, $where)) || $changes_made) ? true : false;
}
$db->sql_freeresult($result);
/**
* Fix the Left/Right ID's for the forums table
*/
$i = 1;
$changes_made = (($this->fixem($i, 'forum_id', FORUMS_TABLE)) || $changes_made) ? true : false;
// Purge the cache so the next time a page with modules is viewed it is not getting an old version from the cache
$cache->purge();
if ($changes_made)
{
trigger_error('LEFT_RIGHT_IDS_FIX_SUCCESS');
}
else
{
trigger_error('LEFT_RIGHT_IDS_NO_CHANGE');
}
}
// I <3 recursion.
function fixem(&$i, $pkey, $table, $parent_id = 0, $where = array())
{
global $db;
$changes_made = false;
$sql = 'SELECT * FROM ' . $table . '
WHERE parent_id = ' . (int) $parent_id .
((!empty($where)) ? ' AND ' . implode(' AND ', $where) : '') . '
ORDER BY left_id ASC';
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
// First we update the left_id for this module
if ($row['left_id'] != $i)
{
$db->sql_query('UPDATE ' . $table . ' SET ' . $db->sql_build_array('UPDATE', array('left_id' => $i)) . " WHERE $pkey = {$row[$pkey]}");
$changes_made = true;
}
$i++;
// Then we go through any children and update their left/right id's
$changes_made = (($this->fixem($i, $pkey, $table, $row[$pkey], $where)) || $changes_made) ? true : false;
// Then we come back and update the right_id for this module
if ($row['right_id'] != $i)
{
$db->sql_query('UPDATE ' . $table . ' SET ' . $db->sql_build_array('UPDATE', array('right_id' => $i)) . " WHERE $pkey = {$row[$pkey]}");
$changes_made = true;
}
$i++;
}
$db->sql_freeresult($result);
return $changes_made;
}
}