Implement $wgFooterIcons to replace copyrightico and poweredbyico with a flexible list of icons that can be customized by extensions, hosting, farms, wikimedia, etc...

Implementations for MonoBook, Vector, and Modern. Modern implementation uses text instead of icons as desired.
This commit is contained in:
Daniel Friesen 2010-12-04 20:55:23 +00:00
parent 1098d92d42
commit 3e7309606d
6 changed files with 167 additions and 29 deletions

View file

@ -2262,6 +2262,25 @@ $wgDisableOutputCompression = false;
*/
$wgExperimentalHtmlIds = true;
/**
* Abstract list of footer icons for skins in place of old copyrightico and poweredbyico code
* You can add new icons to the built in copyright or poweredby, or you can create
* a new block. Though note that you may need to add some custom css to get good styling
* of new blocks in monobook. vector and modern should work without any special css.
*/
$wgFooterIcons = array(
"copyright" => array(
"copyright" => array(), // placeholder for the built in copyright icon
),
"poweredby" => array(
"mediawiki" => array(
"src" => null, // Defaults to "$wgStylePath/common/images/poweredby_mediawiki_88x31.png"
"url" => "http://www.mediawiki.org/",
"alt" => "Powered by MediaWiki",
)
),
);
/**
* Search form behavior for Vector skin only
* true = use an icon search button

View file

@ -63,6 +63,28 @@ if( isset( $wgFileStore['deleted']['directory'] ) ) {
$wgDeletedDirectory = $wgFileStore['deleted']['directory'];
}
if( isset($wgFooterIcons["copyright"]) &&
isset($wgFooterIcons["copyright"]["copyright"]) &&
$wgFooterIcons["copyright"]["copyright"] === array() ) {
if ( isset( $wgCopyrightIcon ) && $wgCopyrightIcon ) {
$wgFooterIcons["copyright"]["copyright"] = $wgCopyrightIcon;
} elseif ( $wgRightsIcon || $wgRightsText ) {
$wgFooterIcons["copyright"]["copyright"] = array(
"url" => $wgRightsUrl,
"src" => $wgRightsIcon,
"alt" => $wgRightsText,
);
} else {
unset($wgFooterIcons["copyright"]["copyright"]);
}
}
if( isset($wgFooterIcons["poweredby"]) &&
isset($wgFooterIcons["poweredby"]["mediawiki"]) &&
$wgFooterIcons["poweredby"]["mediawiki"]["src"] === null ) {
$wgFooterIcons["poweredby"]["mediawiki"]["src"] = "$wgStylePath/common/images/poweredby_mediawiki_88x31.png";
}
/**
* Unconditional protection for NS_MEDIAWIKI since otherwise it's too easy for a
* sysadmin to set $wgNamespaceProtection incorrectly and leave the wiki insecure.

View file

@ -425,6 +425,21 @@ class SkinTemplate extends Skin {
'disclaimer',
),
) );
global $wgFooterIcons;
$tpl->set( 'footericons', $wgFooterIcons );
foreach ( $tpl->data["footericons"] as $footerIconsKey => &$footerIconsBlock ) {
if ( count($footerIconsBlock) > 0 ) {
foreach ( $footerIconsBlock as &$footerIcon ) {
if ( isset($footerIcon["src"]) ) {
if ( !isset($footerIcon["width"]) ) $footerIcon["width"] = 88;
if ( !isset($footerIcon["height"]) ) $footerIcon["height"] = 31;
}
}
} else {
unset($tpl->data["footericons"][$footerIconsKey]);
}
}
if ( $wgDebugComments ) {
$tpl->setRef( 'debug', $out->mDebugtext );

View file

@ -21,17 +21,6 @@ class SkinModern extends SkinTemplate {
var $skinname = 'modern', $stylename = 'modern',
$template = 'ModernTemplate', $useHeadElement = true;
/*
* We don't like the default getPoweredBy, the icon clashes with the
* skin L&F.
*/
function getPoweredBy() {
global $wgVersion;
$text = "<div class='mw_poweredby'>Powered by MediaWiki $wgVersion</div>";
wfRunHooks( 'SkinGetPoweredBy', array( &$text, $this ) );
return $text;
}
function setupSkinUserCss( OutputPage $out ){
// Do not call parent::setupSkinUserCss(), we have our own print style
$out->addStyle( 'common/shared.css', 'screen' );
@ -63,6 +52,18 @@ class ModernTemplate extends MonoBookTemplate {
// Suppress warnings to prevent notices about missing indexes in $this->data
wfSuppressWarnings();
// Generate additional footer links
$footerlinks = $this->data["footerlinks"];
// fold footerlinks into a single array using a bit of trickery
$footerlinks = call_user_func_array('array_merge', array_values($footerlinks));
// Generate additional footer icons
$footericons = $this->data["footericons"];
// Unset copyright.copyright since we don't need the icon and already output a copyright from footerlinks
unset($footericons["copyright"]["copyright"]);
if ( count($footericons["copyright"]) <= 0 ) {
unset($footericons["copyright"]);
}
$this->html( 'headelement' );
?>
@ -182,10 +183,6 @@ class ModernTemplate extends MonoBookTemplate {
<div id="footer"<?php $this->html('userlangattributes') ?>>
<ul id="f-list">
<?php
$footerlinks = array(
'lastmod', 'viewcount', 'numberofwatchingusers', 'credits', 'copyright',
'privacy', 'about', 'disclaimer', 'tagline',
);
foreach( $footerlinks as $aLink ) {
if( isset( $this->data[$aLink] ) && $this->data[$aLink] ) {
?> <li id="<?php echo$aLink?>"><?php $this->html($aLink) ?></li>
@ -193,7 +190,25 @@ class ModernTemplate extends MonoBookTemplate {
}
?>
</ul>
<?php echo $this->html("poweredbyico"); ?>
<?php
foreach ( $footericons as $blockName => $footerIcons ) { ?>
<div id="mw_<?php echo htmlspecialchars($blockName); ?>">
<?php
foreach ( $footerIcons as $icon ) {
if ( is_string($icon) ) {
$html = $icon;
} else {
$html = htmlspecialchars($icon["alt"]);
if ( $icon["url"] ) {
$html = Html::element( 'a', array( "href" => $icon["url"] ), $html );
}
}
echo " $html\n";
} ?>
</div>
<?php
}
?>
</div>
<?php $this->html('bottomscripts'); /* JS call to runBodyOnloadHook */ ?>

View file

@ -74,6 +74,22 @@ class MonoBookTemplate extends QuickTemplate {
$footerlinks = $this->data["footerlinks"];
// fold footerlinks into a single array using a bit of trickery
$footerlinks = call_user_func_array('array_merge', array_values($footerlinks));
// Generate additional footer icons
$footericons = $this->data["footericons"];
// Unset any icons which don't have an image
foreach ( $footericons as $footerIconsKey => &$footerIconsBlock ) {
foreach ( $footerIconsBlock as $footerIconKey => $footerIcon ) {
if ( !is_string($footerIcon) && !isset($footerIcon["src"]) ) {
unset($footerIconsBlock[$footerIconKey]);
}
}
}
// Redo removal of any empty blocks
foreach ( $footericons as $footerIconsKey => &$footerIconsBlock ) {
if ( count($footerIconsBlock) <= 0 ) {
unset($footericons[$footerIconsKey]);
}
}
$this->html( 'headelement' );
?><div id="globalWrapper">
@ -171,12 +187,26 @@ class MonoBookTemplate extends QuickTemplate {
</div><!-- end of the left (by default at least) column -->
<div class="visualClear"></div>
<div id="footer"<?php $this->html('userlangattributes') ?>>
<?php
if($this->data['poweredbyico']) { ?>
<div id="f-poweredbyico"><?php $this->html('poweredbyico') ?></div>
<?php }
if($this->data['copyrightico']) { ?>
<div id="f-copyrightico"><?php $this->html('copyrightico') ?></div>
<?php foreach ( $footericons as $blockName => $footerIcons ) { ?>
<div id="f-<?php echo htmlspecialchars($blockName); ?>ico">
<?php foreach ( $footerIcons as $icon ) {
if ( is_string($icon) ) {
$html = $icon;
} else {
$url = $icon["url"];
unset($icon["url"]);
if ( isset($icon["src"]) ) {
$html = Html::element( 'img', $icon ); // do this the lazy way, just pass icon data as an attribute array
} else {
$html = htmlspecialchars($icon["alt"]);
}
if ( $url ) {
$html = Html::rawElement( 'a', array( "href" => $url ), $html );
}
}
echo " $html\n";
} ?>
</div>
<?php }
// Generate additional footer links

View file

@ -413,13 +413,7 @@ class VectorTemplate extends QuickTemplate {
// Generate additional footer links
$footerlinks = $this->data["footerlinks"];
// footerlinks doesn't include icons for now, so we'll just append the default
$footerlinks["icons"] = array( 'poweredbyico', 'copyrightico', );
$footerlinksClasses = array(
'icons' => array( 'noprint' )
);
// Reduce footer links down to only those which are being used
$validFooterLinks = array();
foreach( $footerlinks as $category => $links ) {
@ -430,6 +424,24 @@ class VectorTemplate extends QuickTemplate {
}
}
}
// Generate additional footer icons
$footericons = $this->data["footericons"];
// Unset any icons which don't have an image
foreach ( $footericons as $footerIconsKey => &$footerIconsBlock ) {
foreach ( $footerIconsBlock as $footerIconKey => $footerIcon ) {
if ( !is_string($footerIcon) && !isset($footerIcon["src"]) ) {
unset($footerIconsBlock[$footerIconKey]);
}
}
}
// Redo removal of any empty blocks
foreach ( $footericons as $footerIconsKey => &$footerIconsBlock ) {
if ( count($footerIconsBlock) <= 0 ) {
unset($footericons[$footerIconsKey]);
}
}
// Reverse horizontally rendered navigation elements
if ( $wgLang->isRTL() ) {
$this->data['view_urls'] =
@ -523,7 +535,7 @@ class VectorTemplate extends QuickTemplate {
<div id="footer"<?php $this->html('userlangattributes') ?>>
<?php foreach( $validFooterLinks as $category => $links ): ?>
<?php if ( count( $links ) > 0 ): ?>
<ul id="footer-<?php echo $category ?>"<?php if (isset($footerlinksClasses[$category])) echo ' class="' . implode(" ", $footerlinksClasses[$category]) . '"'; ?>>
<ul id="footer-<?php echo $category ?>">
<?php foreach( $links as $link ): ?>
<?php if( isset( $this->data[$link] ) && $this->data[$link] ): ?>
<li id="footer-<?php echo $category ?>-<?php echo $link ?>"><?php $this->html( $link ) ?></li>
@ -532,6 +544,31 @@ class VectorTemplate extends QuickTemplate {
</ul>
<?php endif; ?>
<?php endforeach; ?>
<?php if ( count( $footericons ) > 0 ): ?>
<ul id="footer-icons">
<?php foreach ( $footericons as $blockName => $footerIcons ): ?>
<li id="footer-<?php echo htmlspecialchars($blockName); ?>ico" class="noprint">
<?php foreach ( $footerIcons as $icon ):
if ( is_string($icon) ) {
$html = $icon;
} else {
$url = $icon["url"];
unset($icon["url"]);
if ( isset($icon["src"]) ) {
$html = Html::element( 'img', $icon ); // do this the lazy way, just pass icon data as an attribute array
} else {
$html = htmlspecialchars($icon["alt"]);
}
if ( $url ) {
$html = Html::rawElement( 'a', array( "href" => $url ), $html );
}
}
echo " $html\n";
endforeach; ?>
</li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<div style="clear:both"></div>
</div>
<!-- /footer -->