Location: PHPKode > projects > WikyBlog > include/tool/Rename.php
<?php

defined('WikyBlog') or die("Not an entry point...");
wbLang::getFile('toolRename');

class copyRename{
	

	////////////////////////////////////////////////////////////////////////////////////////////////
	//
	//			Copy
	//
	
	function copy(){
		global $dbObject,$page;
	
		$fromUrl = $dbObject->uniqLink;
		
		//	Signed in?
			if( !isset($_SESSION['username']) ){
				message('LOGIN_REQUIRED');
				return false;
			}
			
		//	Set New Values and test
			$toName = copyRename::newValues(false);
			if( $toName === false ){
				return;
			}
			
			$page->displayTitle = 'Copy to '.$toName;
			$dbObject->modified = '';
			
			message('COPY_TO',$fromUrl,$dbObject->uniqLink);
			includeFile('tool/EditPage.php');
			initEdit::init();
	}
	
	////////////////////////////////////////////////////////////////////////////////////////////////
	//
	//			Rename
	//
	
	
	function rename(){
		global $langA,$wbTables,$dbObject,$wbNow, $page;
		$files = false;
		
		
		
		
		//Must be able to edit the file
			if( !$dbObject->editable ){
				message('PROTECTED_FILE');
				return false;
			}
			
		//	Going to need information for later insertion/creation of redirect
			$closeTab = $dbObject->uniqLink;
			$redirRow = $dbObject->keyArray();
			if( method_exists($dbObject,'setFileLocations')){
				$files = array();
				foreach($dbObject->files as $file => $nothing){
					$files[$file] = $dbObject->$file;
				}
			}
			
			$toName = copyRename::newValues();
			if( $toName === false ){
				return;
			}
		
		//	Rename the existing rows/files 
			if( is_array($files) ){
				$dbObject->setFileLocations();
				wbData::loadFileFunctions();
				foreach($files as $file => $oldName){
					if( !file_exists($oldName) ){
						continue;
					}
					if( !renameFile($oldName,$dbObject->$file) ){
						message('COULDNT_RENAMED');
						return false;
					}
				}
			}
		
		//
		//	Update the existing row
		//
		//		if the file was recently deleted.. this won't work..
		
			$query1 = 'UPDATE IGNORE /* rename() */ '.$wbTables['all_files'].', '.$dbObject->dbInfo['dbTable'];
			$query1 .= ' SET ';
			$query1 .= wbDB::toSet($dbObject->keyArray(),false,$dbObject->dbInfo['dbTable']);
			$query1 .= ' , '.$wbTables['all_files'].'.`info` = "'.wbDB::escape($dbObject->uniqLink).'" ';
			$query1 .= 'WHERE '.$wbTables['all_files'].'.`file_id`="'.$dbObject->file_id.'"';
			$query1 .= ' AND '.$dbObject->dbInfo['dbTable'].'.`file_id` = '.$wbTables['all_files'].'.`file_id` ';
		
			$num = wbDB::runQuery($query1,true);
			
			if( $num < 1 ){
				message('NOT_RENAMED',$toName);
				return false;
			}
			
			message('RENAMED');
			$field = $dbObject->outputObj();
			$dbObject->addFooter($field);
			
		//
		//	Changed to/from Template:
		//
			copyRename::templateChange($toName);
			
			
		//
		//	Insert Redirect Page
		//
			//if the name change is only a case change then we don't want to do this
			$check2 = $dbObject->keyArray();
			$check2 = implode('\\',$check2);
			$check1 = implode('\\',$redirRow);
			if( wbStrcasecmp($check2,$check1) ){
				return;
			}
			
			
		
			$allFilesRow = array();
			$allFilesRow['username'] = $_SESSION['username'];
			$allFilesRow['created'] = $wbNow;
			$allFilesRow['modified'] = $wbNow;
			$allFilesRow['posted'] = $wbNow;
			$allFilesRow['flags'] = 'safe,redirect,locked'; //only the owner can remove the redirect, since only the owner can rename
			$allFilesRow['info'] = $dbObject->uniqLink;
			$allFilesRow['keywords'] = '';
			$allFilesRow['owner_id'] = $dbObject->owner_id;
			wbDB::dbInsert2($wbTables['all_files'],$allFilesRow);
			
			
			$newId = mysql_insert_id();
			$redirRow['file_id'] = $newId;
			$redirRow['summary'] = $langA['redirected_to'].' '.$dbObject->uniqLink;
			
			//try to avoid MySQL Warnings for columns without default values
			foreach($dbObject->dbValues as $key => $null ){
				if( !isset($redirRow[$key]) ){
					$redirRow[$key] = $dbObject->$key;
				}
			}
			wbDB::dbInsert2($dbObject->dbInfo['dbTable'],$redirRow);
			
			
		//
		//	Affected Comments
		//
			if( $dbObject->comments > 0 ){
				copyRename::renameComments($dbObject);
			}
			
			
		//
		//	all_links
		//		1) Change the to_id for the old title
		//		2) Update to_id rows with new title
		
			$query = 'UPDATE '.$wbTables['all_links'];
			$query .= ' SET `to_id` = "'.$newId.'" ';
			$query .= ' WHERE `to_id` = "'.$dbObject->file_id.'" ';
			wbDB::runQuery($query);
			
			$query = 'UPDATE '.$wbTables['all_links'];
			$query .= ' SET `to_id` = "'.$dbObject->file_id.'" ';
			$query .= ' WHERE `to_link` = "'.wbDB::escape($dbObject->uniqStorage).'" ';
			wbDB::runQuery($query);
			
			
		//
		//	Try to close the old tab
		//	
		//	
		if( $page->ajaxRequest ){
			
			//place the renamed page directly after the old title
			$page->prevTab = toStorageUrl($closeTab);
			
			
			$addContent = new content();
			$addContent->aa = 'eval';
			//$addContent->bb = 'var ids = Array();ids[0] = "'.$_GET['wb']['u'].'";wbCA.close2(ids);';
			$addContent->bb = 'wbCA.close2(Array("'.toStorageUrl($closeTab).'"));';
			
			//close the options tab as well
			//$optionsTab = '/Edit'.$closeTab.'?cmd=options';
			//$addContent->bb = 'wbCA.close2(Array("'.toStorageUrl($closeTab).'","'.toStorageUrl($optionsTab).'"));';
			
			$addContent->bb .= 'WBt.go("'.toStorageUrl($dbObject->uniqLink).'");';  //show the new tab.. since the close2() call will change which tab is shown
			$page->contentClasses[] = $addContent;
		}
	}
	
	function renameComments(&$object){
		devMessage('update comments!');
		
		//	Which title
			end($object->dbInfo['keys']);
			$key = key($object->dbInfo['keys']);
			reset($object->dbInfo['keys']);
			$title = $object->$key;
			
			$query = 'UPDATE '.wbData::dbInfo('comment','dbTable');
			$query .= ' SET ';
			$query .= ' `title` = "'.wbDB::escape($title).'" ';
			$query .= ' WHERE ';
			$query .= ' `parent_id` = "'.wbDB::escape($object->file_id).'" ';
			message($query);
			wbDB::runQuery($query);
			
	}
	
	
	//
	//	Changed to/from Template:
	//
	function templateChange($toName){
		global $page,$dbObject,$wbTables;
		$nowTemplate = $wasTemplate = false;
		
		if( $dbObject->objectType !== 'page'){
			return;
		}
		
		$temp = strtolower($toName);
		if( strpos($temp,'template:') === 0){
			$nowTemplate = true;
		}
		if( strpos($dbObject->flags,'template') !== false ){
			$wasTemplate = true;
		}
		if( $nowTemplate === $wasTemplate ){
			return;
		}
		
		$query = 'UPDATE IGNORE '.$wbTables['all_files'].' SET ';
		$query .= ' `modified` = `modified` ';
		
		if( $nowTemplate ){
			$query .= ' , `flags` = '. wbDB::add_to_set('template','`flags`');
		}else{
			$query .= ' , `flags` = '. wbDB::remove_from_set('template','`flags`');
		}
		
		//$query .= ', `flags` = "'.wbDB::escape($dbObject->flags).'" ';
		$query .= 'WHERE `file_id`="'.$dbObject->file_id.'" ';
		$query .= ' LIMIT 1';
		wbDB::runQuery($query);
		
	}

	
	
	////////////////////////////////////////////////////////////////////////////////////////////////
	//
	//			Set New Values for object
	//
	function newValues($caseSensitive=true){
		global $dbObject,$wbTables,$page;
		
		//	Which key
			end($dbObject->dbInfo['keys']);
			$key = key($dbObject->dbInfo['keys']);
			reset($dbObject->dbInfo['keys']);
			
			$toName = $_POST['to'];
			$toName = toStorage($toName);
			if( wbStrpos($toName,'../') !== false){
				message('INVALID_PATH',$toName);
				return false;
			}
			
			//	compare case sensitive (space-insensitive)
			// 	copy should use a case insensitive test
			
			if( $caseSensitive ){
				$checkAgainst = toStorage($dbObject->$key);
				
				//just different case?
				//	rename to different cases aren't working because the sql queries won't change anything (the varchar fields are not case sensitive, so MySQL determines nothing is changing)
				if( wbStrcasecmp($checkAgainst,$toName) ){
					return false;
					return $toName;
				}
				
				if( $checkAgainst == $toName){ 
					message('NAME_UNCHANGED');
					return false;
				}
			}else{
				if( toStorage($dbObject->$key,true) ==  wbStrtolower($toName)){
					message('NAME_UNCHANGED');
					return false;
				}
			}
			
		//
		//	Reset the key information 
		//
			$dbObject->$key = $toName;
			$page->cLinks = array();
			//$dbObject->links = array();//need to reset it, should probably be in the $dbObject setLinks function
			$dbObject->setUniqLink();
			$dbObject->checkKeys();
			$dbObject->setLinks();
		
			if( !$dbObject->validData ){
				message('COULDNT_RENAMED');
				return false;
			}
			
		//	Check for existence
			$query = 'SELECT `modified`, '.$dbObject->dbInfo['dbTable'].'.`file_id` FROM '.$dbObject->dbInfo['dbTable'];
			$query .= ' LEFT JOIN '.$wbTables['all_files'];
			$query .= ' USING(`file_id`) ';
			$query .= ' WHERE ';
			$query .= $dbObject->where($dbObject->dbInfo['dbTable'],false);
			$query .= ' LIMIT 1 OFFSET 0';
			$result = wbDB::runQuery($query);
			$num = mysql_num_rows($result);
			if($num == 1){
				$row = mysql_fetch_assoc($result);
				if(empty($row['modified']) && !empty($row['file_id']) ){
					
					//the file doesn't really exists, so we just purge the content table similar to what we do in scheduledTasks.php
					$query = 'DELETE ';
					$query .= $dbObject->dbInfo['dbTable'];
					$query .= ' FROM ';
					$query .= $dbObject->dbInfo['dbTable'].' LEFT JOIN '.$wbTables['all_files'];
					$query .= ' USING(`file_id`) ';
					$query .= ' WHERE '.$wbTables['all_files'].'.`file_id` IS NULL ';
					wbDB::runQuery($query);
				}else{
					message('TITLE_EXISTS');
					return false;
				}
			}
			
			
		return $toName;
	}
	
	
		
}


global $dbObject,$langA;
if( !cookies() ){
	message('COOKIES_REQUIRED');
	return;
}


switch( $page->userCmd ){
	case 'rename':
		copyRename::rename();
	break;
	case 'copy':
		copyRename::copy();
	break;
}
Return current item: WikyBlog