Category Update Action

This is the development page for the category update action.
 


<?php
/**
 * Converts from original category system to the system used in PageAndCategoryDivisionInACategory.
 *
 * @version     0.1
 * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
 *
 * @author      {@link http://wikkawiki.org/MasinAlDujaili Masin Al-Dujaili} (original code)
 *
 * @uses Wakka::IsAdmin()
 * @uses Wakka::FormClose()
 * @uses Wakka::FormOpen()
 * @uses Wakka::LoadAllPages()
 * @uses Wakka::SavePage()
 *
 * @todo        cleaning up code;
 * @todo        use central regex library for validation;
 */


// constants
if (!defined('UPDATE_LABEL')) define('UPDATE_LABEL', 'Update');
if (!defined('NO_ADMIN_MESSAGE')) define('NO_ADMIN_MESSAGE', '<p>Only administrators are allowed to use this function.</p>');
if (!defined('PAGE_LOAD_ERROR_MESSAGE')) define('PAGE_LOAD_ERROR_MESSAGE', "<p>An error occured while loading Wikka's pages.</p>");
if (!defined('UPDATE_ACTION_TEXT')) define('UPDATE_ACTION_TEXT', '<p>Update the old category system using <strong>Category</strong>Name to the new category system using [[(cat)Name]].</p>'
    .'<p>This action uses some constants to determine what to replace. So it might easily be adapted to other uses.</p>'
    .'<p><strong>Warning</strong>: This action touches <strong>any</strong> page that contains categories in the '
    .'original Wikka way of categorizing. It might create heavy server load. It might even happen, that the script '
    .'times out -- as far as I know, this might be safe. But: Whenever manipulating the database it\'s a good idea to '
    .'make a backup of it before doing anything.</p>');
if (!defined('OLD_CATEGORY_PATTERN')) define('OLD_CATEGORY_PATTERN', '%s');
if (!defined('NEW_CATEGORY_REPLACE_PATTERN')) define('NEW_CATEGORY_REPLACE_PATTERN', '[[(cat)%s]]');
if (!defined('NEW_CATEGORY_SEARCH_PATTERN')) define('NEW_CATEGORY_SEARCH_PATTERN', '\[\[\(cat\)%s\]\]');
if (!defined('CATEGORY_UPDATE_NOTE')) define('CATEGORY_UPDATE_NOTE', 'category update');

function isNewCategory($body, $categories)
{
    $cats = array();
    foreach($categories as $cat) $cats[] = sprintf(NEW_CATEGORY_SEARCH_PATTERN,$cat);
    $cats = '/'.implode('|', $cats).'/';
   
    if(preg_match_all($cats, $body, $body_cats) > 0) return TRUE;
   
    return FALSE; // if we come here, the tested body is still using the old category system
}

function updateCategory($body, $categories)
{
    $old_cats = array();
    $new_cats = array();
    foreach($categories as $cat)
    {
        $old_cats[] = sprintf('/'.OLD_CATEGORY_PATTERN.'/',$cat);
        $new_cats[] = sprintf(NEW_CATEGORY_REPLACE_PATTERN,$cat);
    }

    return preg_replace($old_cats, $new_cats, $body);
}

if(isset($_POST['submit']) && $_POST['submit'] == UPDATE_LABEL)
{
    if($this->isAdmin()) // begin, check for access to all our pages
    {
        if ($pages = $this->LoadAllPages()) // load all pages
        {
            // get all categories and make one big regular expression out of them
            $categories = $this->LoadAll("select tag from ".$this->config["table_prefix"]."pages where latest='Y' AND body LIKE '".mysql_real_escape_string('%{{category%')."' order by time desc");
            foreach($categories as $category)
            {
                $cat_array[] = $category['tag'];
            }
            $cat_regex = '('.implode('|', $cat_array).')';


            // gather categories the pages belong to
            $page_cats = array();
            foreach($pages as $page)
            {
                $tag = $page['tag'];
                preg_match_all($cat_regex, $page['body'], $page_cats[$tag]);
                if(sizeof($page_cats[$tag][0])) // only process those pages which have categories
                {
                    $page_cats[$tag]['isNew'] = isNewCategory($page['body'], $page_cats[$tag][0]);
                    if(!$page_cats[$tag]['isNew'])
                    {
                        $page['body'] = updateCategory($page['body'], $page_cats[$tag][0]);
                        $this->SavePage($page['tag'], $page['body'], CATEGORY_UPDATE_NOTE);
                    }
                }
            }
        }
        else
        {
            echo PAGE_LOAD_ERROR_MESSAGE;
        }
    }
    else
    {
        echo NO_ADMIN_MESSAGE;
    }
}

else
{
    echo UPDATE_ACTION_TEXT;
    echo $this->FormOpen('', '', 'post').
            '<input name="submit" type="submit" value="'.
            UPDATE_LABEL.'" />'.
            $this->FormClose();
}
?>

 

CategoryDevelopmentActions
There are no comments on this page.
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki