* Make Special:Listusers caseinsensitive for first letter
* Default tidy.conf has been moved from extensions module into includes.
* Ignore lonely '''''
+* (bug 3984) Searching in logs by title%
== Languages updated ==
$this->limitType( $request->getVal( 'type' ) );
$this->limitUser( $request->getText( 'user' ) );
- $this->limitTitle( $request->getText( 'page' ) );
+ $this->limitTitle( $request->getText( 'page' ) , $request->getBool( 'pattern' ) );
$this->limitTime( $request->getVal( 'from' ), '>=' );
$this->limitTime( $request->getVal( 'until' ), '<=' );
* @param string $page Title name as text
* @private
*/
- function limitTitle( $page ) {
+ function limitTitle( $page , $pattern ) {
$title = Title::newFromText( $page );
if( empty( $page ) || is_null( $title ) ) {
return false;
}
$this->title =& $title;
- $safetitle = $this->db->strencode( $title->getDBkey() );
+ $this->pattern = $pattern;
$ns = $title->getNamespace();
- $this->whereClauses[] = "log_namespace=$ns AND log_title='$safetitle'";
+ if ( $pattern ) {
+ $safetitle = $this->db->escapeLike( $title->getDBkey() ); // use escapeLike to avoid expensive search patterns like 't%st%'
+ $this->whereClauses[] = "log_namespace=$ns AND log_title LIKE '$safetitle%'";
+ } else {
+ $safetitle = $this->db->strencode( $title->getDBkey() );
+ $this->whereClauses[] = "log_namespace=$ns AND log_title = '$safetitle'";
+ }
}
/**
return $this->user;
}
+ /**
+ * @return boolean The checkbox, if titles should be searched by a pattern too
+ */
+ function queryPattern() {
+ return $this->pattern;
+ }
+
/**
* @return string The text of the title that this LogReader has been limited to.
*/
$this->showHeader( $wgOut );
$this->showOptions( $wgOut );
$result = $this->getLogRows();
- $this->showPrevNext( $wgOut );
- $this->doShowList( $wgOut, $result );
- $this->showPrevNext( $wgOut );
+ if ( $this->numResults > 0 ) {
+ $this->showPrevNext( $wgOut );
+ $this->doShowList( $wgOut, $result );
+ $this->showPrevNext( $wgOut );
+ } else {
+ $this->showError( $wgOut );
+ }
}
/**
function doShowList( &$out, $result ) {
// Rewind result pointer and go through it again, making the HTML
- if ($this->numResults > 0) {
- $html = "\n<ul>\n";
- $result->seek( 0 );
- while( $s = $result->fetchObject() ) {
- $html .= $this->logLine( $s );
- }
- $html .= "\n</ul>\n";
- $out->addHTML( $html );
- } else {
- $out->addWikiText( wfMsg( 'logempty' ) );
+ $html = "\n<ul>\n";
+ $result->seek( 0 );
+ while( $s = $result->fetchObject() ) {
+ $html .= $this->logLine( $s );
}
+ $html .= "\n</ul>\n";
+ $out->addHTML( $html );
$result->free();
}
+ function showError( &$out ) {
+ $out->addWikiText( wfMsg( 'logempty' ) );
+ }
+
/**
* @param Object $s a single row from the result set
* @return string Formatted HTML list item
$title = SpecialPage::getTitleFor( 'Log' );
$special = htmlspecialchars( $title->getPrefixedDBkey() );
$out->addHTML( "<form action=\"$action\" method=\"get\">\n" .
+ '<fieldset>' .
+ Xml::element( 'legend', array(), wfMsg( 'log' ) ) .
Xml::hidden( 'title', $special ) . "\n" .
$this->getTypeMenu() . "\n" .
$this->getUserInput() . "\n" .
$this->getTitleInput() . "\n" .
+ $this->getTitlePattern() . "\n" .
Xml::submitButton( wfMsg( 'allpagessubmit' ) ) . "\n" .
- "</form>" );
+ "</fieldset></form>" );
}
/**
return Xml::inputLabel( wfMsg( 'speciallogtitlelabel' ), 'page', 'page', 20, $title );
}
+ /**
+ * @return boolean Checkbox
+ * @private
+ */
+ function getTitlePattern() {
+ $pattern = $this->reader->queryPattern();
+ return Xml::checkLabel( wfMsg( 'title-pattern' ), 'pattern', 'pattern', $pattern );
+ }
+
/**
* @param OutputPage &$out where to send output
* @private
$pieces[] = 'type=' . urlencode( $this->reader->queryType() );
$pieces[] = 'user=' . urlencode( $this->reader->queryUser() );
$pieces[] = 'page=' . urlencode( $this->reader->queryTitle() );
+ $pieces[] = 'pattern=' . urlencode( $this->reader->queryPattern() );
$bits = implode( '&', $pieces );
list( $limit, $offset ) = $wgRequest->getLimitOffset();
'grouppage-bureaucrat' => '{{ns:project}}:Bürokraten',
# User rights log
-'rightslog' => 'Benutzerrechte-Logbuch',
+'rightslog' => 'Rechte-Logbuch',
'rightslogtext' => 'Dies ist das Logbuch der Änderungen der Benutzerrechte.',
'rightslogentry' => 'änderte die Gruppenzugehörigkeit für „[[$1]]“ von „$2“ auf „$3“.',
'rightsnone' => '(-)',
'isbn' => 'ISBN',
'alphaindexline' => '$1 bis $2',
'version' => 'Version',
-'log' => 'Logbücher',
-'alllogstext' => 'Kombinierte Anzeige der Datei-, Lösch-, Seitenschutz-, Benutzersperr- und Rechte-Logbücher.<br />Sie können die Anzeige durch die Auswahl des Logbuchtyps, des Benutzers oder des Seitentitels einschränken.',
-'logempty' => 'Keine passenden Einträge.',
+
+# Special:Logs
+'specialloguserlabel' => 'Benutzer:',
+'speciallogtitlelabel' => 'Titel:',
+'log' => 'Logbücher',
+'alllogstext' => "Dies ist die kombinierte Anzeige aller in {{SITENAME}} geführten Logbücher.
+Die Ausgabe kann durch die Auswahl des Logbuchtyps, des Benutzers oder des Seitentitels eingeschränkt werden.
+
+Durch Markieren von „{{int:title-pattern}}“ wird nach Titeln gesucht, die mit diesem Begriff anfangen und beliebig enden. Es können keine Platzhalter ''(Wildcards)'' benutzt werden",
+'logempty' => 'Keine passenden Einträge.',
+'title-pattern' => 'Titel beginnt mit …',
# Special:Allpages
'nextpage' => 'Nächste Seite ($1)',
'variantname-kk-cn' => 'kk-cn',
'variantname-kk' => 'kk',
-# Labels for User: and Title: on Special:Log pages
-'specialloguserlabel' => 'Benutzer:',
-'speciallogtitlelabel' => 'Titel:',
-
'passwordtooshort' => 'Das Passwort ist zu kurz. Es muss mindestens $1 Zeichen lang sein.',
# Metadata
'pubmedurl' => 'http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&db=pubmed&dopt=Abstract&list_uids=$1',
'alphaindexline' => "$1 to $2",
'version' => 'Version',
-'log' => 'Logs',
-'alllogstext' => 'Combined display of upload, deletion, protection, blocking, and sysop logs.
-You can narrow down the view by selecting a log type, the user name, or the affected page.',
-'logempty' => 'No matching items in log.',
+# Special:Logs
+'specialloguserlabel' => 'Benutzer:',
+'speciallogtitlelabel' => 'Titel:',
+'log' => 'Logs',
+'alllogstext' => 'Combined display of all available logs of {{SITENAME}}.
+You can narrow down the view by selecting a log type, the user name, or the affected page.',
+'logempty' => 'No matching items in log.',
+'title-pattern' => 'Title starts with \85',
# Special:Allpages
'nextpage' => 'Next page ($1)',
'variantname-kk-cn' => 'kk-cn',
'variantname-kk' => 'kk',
-# labels for User: and Title: on Special:Log pages
-'specialloguserlabel' => 'User:',
-'speciallogtitlelabel' => 'Title:',
-
'passwordtooshort' => 'Your password is too short. It must have at least $1 characters.',
# Metadata
'pubmedurl',
'alphaindexline',
'version',
+ ),
+ 'logpages' => array(
'log',
'alllogstext',
'logempty',
+ 'specialloguserlabel',
+ 'speciallogtitlelabel',
+ 'title-pattern',
),
'allpages' => array(
'nextpage',
'variantname-kk-cn',
'variantname-kk',
),
- 'specialloglabels' => array(
- 'specialloguserlabel',
- 'speciallogtitlelabel',
- ),
'passwordtooshort' => array(
'passwordtooshort',
),
'specialpages' => 'Miscellaneous special pages',
'booksources' => 'Book sources',
'specialpages2' => '',
+ 'logpages' => 'Special:Logs',
'allpages' => 'Special:Allpages',
'listusers' => 'Special:Listusers',
'emailuser' => 'E-mail user',
Variants for Chinese language",
'variantname-sr' => 'Variants for Serbian language',
'variantname-kk' => 'Variants for Kazakh language',
- 'specialloglabels' => 'Labels for User: and Title: on Special:Log pages',
'passwordtooshort' => '',
'media-info' => 'Media information',
'metadata' => 'Metadata',