Extension talk:DeletePagePermanently


 * Hi, it works fine on Mediawiki 1.15.0 Thanks for this extension! Enzo

Using with Vector Skin
In order for the action to show properly on the vector skin, you must add a new hook. The hook definition is as follows:

$wgHooks['SkinTemplateNavigation'][] = array ( &$this,  'AddVectorHook' );

function AddVectorHook(&$sktemplate, &$links) { global $wgRequest, $wgRequest, $wgTitle, $wgUser, $wgDeletePagePermanentlyNamespaces;

if (!$wgUser->isAllowed('deleteperm')) return false;

$action = $wgRequest->getText('action');

#Special pages can not be deleted (special pages have no article id anyway). if ($wgTitle->getArticleID != 0 && $wgDeletePagePermanentlyNamespaces[$wgTitle->getNamespace] == true && $wgTitle->getNamespace != NS_SPECIAL) { wfLoadExtensionMessages('DeletePagePermanently');

$links['actions']['ask_delete_permanently'] = array (           'class' => $action == 'ask_delete_permanently' ? 'selected' : false,            'text' => wfMsg('delete_permanently'),            'href' => $wgTitle->getLocalUrl('action=ask_delete_permanently')        ); }

return true; }

&action=delete_permanently
I had to replace the $action for "delete_permanently" in my environment to make it work if ($action == 'ask_delete_permanently' ) { // Before : // $action = $wgArticle->getTitle->escapeLocalUrl."&action=delete_permanently"; // Now : $action = $wgArticle->getTitle->getLocalUrl('action=delete_permanently'); // index.php/TestPage&action=delete_permanently // become index.php?title=TestPage&action=delete_permanently $wgOut->addHTML(" ...

Undefined offset:
If you try to open a page with namespace not defined in $wgDeletePagePermanentlyNamespaces (like Special:SpecialPages) I've got the following error: Undefined offset: -1 in /xxx/xxx/extensions/DeletePagePermanently/DeletePagePermanently.php on line ~ 86 You have: if ( $wgTitle->getArticleID != 0 & $wgDeletePagePermanentlyNamespaces[$wgTitle->getNamespace] == true & $wgTitle->getNamespace != NS_SPECIAL ) { Obviously the $wgDeletePagePermanentlyNamespaces[$wgTitle->getNamespace won't return boolen if the namespace is not defined in $wgDeletePagePermanentlyNamespaces. It will return -1. Probably you have to check if is in array first and then the value. One way of doing it is to just add @ before the expression like @$wgDeletePagePermanentlyNamespaces[$wgTitle->getNamespace] == true But I guess this could be done in a more elegant way. Rocco08

Caveat for copying/pasting code
This isn't specific to this extension, but I spent a bit figuring it out. After I "installed" this extension, my wiki's browser search ($IP/opensearch_desc.php) was broken. Turns out I'd pasted an extra line or two at the end of the file; it was breaking the XML that's supposed to get sent. So, watch out you don't add any empty lines to the end of the file! Miken32 21:52, 2 April 2009 (UTC)

Translation string errors
I got an error in the .i18n.php messages file, after installation. It appears the French translation contains extra ' in two strings. After quoting these strings with double quotes i.s.o, single quotes the problem is gone.
 * You need only to escape the extra quote with a backslash (\). The source code is updated. --LeLorrain 00:13, 29 December 2009 (UTC)

manque onglet ?
j'ai installer l'extension sur la version 1.15.1

je n'ai pas de message d'erreur mais je n'ai pas l'onglet "DeletePagePermanently" qui permet la suppression de la page.

que faire? merci :) --Voice 15:40, 27 September 2009 (UTC)


 * I hope you understand english because i can't speak french and translated you post with google ^^


 * There are 2 reasons why you can't see the tab: either you don't have the rights or the namespace you are in, is not configured for the extensions.


 * Check the configuration of  (for the userrights) and look, if the namespace is in   (to enable deleting of articles in the namespace) array. (For non-standard namespaces use the numbers you chosen in the   array)
 * --W.stoettinger 12:51, 28 September 2009 (UTC)

I grieve also translated with google;) I just add lines of code in the LocalSettings.php. as indicated:

it is this right?

I have not included for: (For non-standard namespaces use the numbers you chosen in the $wgExtraNamespaces array) ?

thank you --Voice 20:02, 28 September 2009 (UTC)

This isn't working in 1.15, just takes me to a page saying that the page 'insertpagenamehere?action=delete permanently' is empty and to create it.


 * Hi there, we fixed this behaviour by changing line 115 from:
 * to
 * Though we are no PHP-Programmers, this is only a temporary workarround.
 * The source code is updated. Thanks! --LeLorrain 00:19, 29 December 2009 (UTC)
 * Though we are no PHP-Programmers, this is only a temporary workarround.
 * The source code is updated. Thanks! --LeLorrain 00:19, 29 December 2009 (UTC)

j'ai trouver la solution pour le manque d'onglet utile à savoir si vous utilisez d'autres extensions qui jouent sur les droit d'utilisateur. pour ma part j'avais installer l'extension ipbwiki du coups mon compte est passé de sysop à Admin il suffis donc d'ajouter cette ligne dans le fichier LocalSettings.php:

voila :) --Voice 20:23, 11 October 2009 (UTC)

Category count update
Hi, I noticed that the DeletePagePermanently extension does not update category count. Here is a patch generated by git, I started from version 2.1.1 found on the extension page.

$ cat 0001--fix-category-count-on-deletion.patch [...] DeletePagePermanently.php |   9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/DeletePagePermanently.php b/DeletePagePermanently.php index 884e719..d161cf7 100644 --- a/DeletePagePermanently.php +++ b/DeletePagePermanently.php @@ -177,6 +177,15 @@ class DeletePagePermanently # Delete page Links $dbw->delete( 'pagelinks', array ( 'pl_from' => $id ), __METHOD__ ); +       # update categories count before removing category links +       $cat = array; +       $res = $dbw->select( 'categorylinks', 'cl_to', array( 'cl_from' => $id ), __METHOD__ ); +       foreach( $res as $row ) { +           $cat[]= $row->cl_to; +       } +        $article = new Article( $title ); +       $article->updateCategoryCounts(array, $cat); +        # delete category links $dbw->delete( 'categorylinks', array( 'cl_from' => $id ), __METHOD__);

Now the count should be correct after a page deletion. You can mail me at sberder@gmail.com for informations.
 * The problem is corrected and the source code updated. Thanks! --LeLorrain 00:06, 29 December 2009 (UTC)

&lt;delete_permanently&gt;
In other langages than english, the tab shows « &lt;delete_permanently&gt; ». Marc 15:39, 3 March 2010 (UTC)

Fixes for MW 1.16
I rewrote parts of the code to make the extension compatible with MW 1.16. The main reason for this is that the code given in the "Mediawiki 1.16.x" section does not work with MW 1.16: the "delete permanently" tab is displayed without any label. The method "$wgMessageCache->addMessage" is deprecated in MW 1.16, and no longer supported. I removed it and changed some little things to make the extension work properly. Please feel free to put this code on the main page if you wish to. Alvinos 12:00, 9 March 2010 (UTC)

");				return false;			}			# Perform actual deletion			elseif ($action == 'delete_permanently') {				$ns = $wgArticle->mTitle->getNamespace;				$t = $wgArticle->mTitle->getDBkey;				$id = $wgArticle->mTitle->getArticleID;				if ($t == '' || $id == 0 || $wgDeletePagePermanentlyNamespaces[$ns] != true || $ns == NS_SPECIAL) {					$wgOut->addHTML(wfMsgHtml('del_impossible'));					return false;				}				$this->deletePermanently($wgArticle->mTitle);				$wgOut->addHTML(wfMsgHtml('del_done'));				return false;			}			//$wgOut->addHTML(wfMsgHtml('del_not_done'));			return true;		}		function deletePermanently($title) {			global $wgOut;			$ns = $title->getNamespace;			$t = $title->getDBkey;			$id = $title->getArticleID;			$cats = $title->getParentCategories;			$dbw = wfGetDB(DB_MASTER);			$dbw->immediateBegin;			####			## First delete entries, which are in direct relation with the page: ####

# delete redirect... $dbw->delete('redirect', array ('rd_from' => $id), __METHOD__); # delete external link... $dbw->delete('externallinks', array ('el_from' => $id), __METHOD__); # delete language link... $dbw->delete('langlinks', array ('ll_from' => $id), __METHOD__); # delete search index... $dbw->delete('searchindex', array ('si_page' => $id), __METHOD__); # Delete restrictions for the page $dbw->delete('page_restrictions', array ('pr_page' => $id), __METHOD__); # Delete page Links $dbw->delete('pagelinks', array ('pl_from' => $id), __METHOD__); # delete category links $dbw->delete('categorylinks', array ('cl_from' => $id), __METHOD__); # delete template links $dbw->delete('templatelinks', array ('tl_from' => $id), __METHOD__); # read text entries for all revisions and delete them. $res = $dbw->select('revision', 'rev_text_id', "rev_page=$id"); while ($row = $dbw->fetchObject($res)) { $value = $row->rev_text_id; $dbw->delete('text', array ('old_id' => $value), __METHOD__); }			# In the table 'revision' : Delete all the revision of the page where 'rev_page' = $id $dbw->delete('revision', array ('rev_page' => $id), __METHOD__); # delete image links $dbw->delete('imagelinks', array ('il_from' => $id), __METHOD__); ####			## then delete entries which are not in direct relation with the page: ####

# Clean up recentchanges entries... $dbw->delete('recentchanges', array ( 'rc_namespace' => $ns, 'rc_title' => $t ), __METHOD__); # read text entries for all archived pages and delete them. $res = $dbw->select('archive', 'ar_text_id', array ( 'ar_namespace' => $ns, 'ar_title' => $t ));			while ($row = $dbw->fetchObject($res)) { $value = $row->ar_text_id; $dbw->delete('text', array ('old_id' => $value), __METHOD__); }			# Clean archive entries... $dbw->delete('archive', array ( 'ar_namespace' => $ns, 'ar_title' => $t ), __METHOD__); # Clean up log entries... $dbw->delete('logging', array ( 'log_namespace' => $ns, 'log_title' => $t ), __METHOD__); # Clean up watchlist... $dbw->delete('watchlist', array ( 'wl_namespace' => $ns, 'wl_title' => $t ), __METHOD__); # In the table 'page' : Delete the page entry $dbw->delete('page', array ('page_id' => $id), __METHOD__); ####			## If the article belongs to a category, update category counts ####			if (!empty($cats)) { foreach ($cats as $parentcat => $currentarticle) { $catname = split(':', $parentcat, 2); $cat = Category::newFromName($catname[1]); $cat->refreshCounts; }			}			####			## If an image is beeing deleted, some extra work needs to be done ####			if ($ns == NS_IMAGE) { $file = wfFindFile($t); if ($file) { # Get all filenames of old versions: $fields = OldLocalFile::selectFields; $res = $dbw->select('oldimage', $fields, array ('oi_name' => $t)); while ($row = $dbw->fetchObject($res)) { $oldLocalFile = OldLocalFile::newFromRow($row, $file->repo); $path = $oldLocalFile->getArchivePath. '/' . $oldLocalFile->getArchiveName; try { @unlink($path); } catch (Exception $e) { $wgOut->addHTML($e->getMessage); } }					$path = $file->getPath; try { $file->purgeThumbnails; @unlink($path); } catch (Exception $e) { $wgOut->addHTML($e->getMessage); } }				# clean the filearchive for the given filename: $dbw->delete('filearchive', array ('fa_name' => $t), __METHOD__); # Delete old db entries of the image: $dbw->delete('oldimage', array ('oi_name' => $t), __METHOD__); # Delete archive entries of the image: $dbw->delete('filearchive', array ('fa_name' => $t), __METHOD__); # Delete image entry: $dbw->delete('image', array ('img_name' => $t), __METHOD__); $dbw->immediateCommit; $linkCache = LinkCache::singleton; $linkCache->clear; }		}	}

new DeletePagePermanently; return true; } ?>

Not a TRUE delete
I noticed that this extension leaves data behind in the database after permanently deleting a page.

For example, if I create a page called TestPage I can look at the entry in the text table:

Next if I use the permanent delete tab to delete the page, I can run the same query and get the same result.

The pages that are deleted seem to disappear from the front end, but some of their content is still lingering behind in the db.