mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Echo
synced 2024-11-14 11:16:16 +00:00
972e14672f
See https://www.mediawiki.org/wiki/Echo/Feature_requirements#Flyout and https://www.mediawiki.org/wiki/Echo/Feature_requirements#HTML_single_email_notifications Also includes some related style changes per Vibha Also removing feedback link from overlay since it's no longer needed Change-Id: I94aed697e87126ed8ad6d1d416c99bafaa53ac53
177 lines
4.7 KiB
PHP
177 lines
4.7 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Custom formatter for 'page-link' notifications
|
|
*/
|
|
class EchoPageLinkFormatter extends EchoBasicFormatter {
|
|
|
|
/**
|
|
* This is a workaround for backwards compatibility.
|
|
* In https://gerrit.wikimedia.org/r/#/c/63076 we changed
|
|
* the schema to save link-from-page-id instead of
|
|
* link-from-namespace & link-from-title
|
|
*/
|
|
protected function extractExtra( $extra ) {
|
|
if ( isset( $extra['link-from-namespace'], $extra['link-from-title'] )
|
|
&& !isset( $extra['link-from-page-id'] )
|
|
) {
|
|
$title = Title::makeTitleSafe(
|
|
$extra['link-from-namespace'],
|
|
$extra['link-from-title']
|
|
);
|
|
if ( $title ) {
|
|
$extra['link-from-page-id'] = $title->getArticleId();
|
|
unset(
|
|
$extra['link-from-namespace'],
|
|
$extra['link-from-title']
|
|
);
|
|
}
|
|
}
|
|
|
|
return $extra;
|
|
}
|
|
|
|
/**
|
|
* This method overwrite parent method and construct the bundle iterator
|
|
* based on link from, it will be used in a message like this: Page A was
|
|
* link from Page B and X other pages
|
|
* @param $event EchoEvent
|
|
* @param $user User
|
|
* @param $type string Notification disytribution type
|
|
*/
|
|
protected function generateBundleData( $event, $user, $type ) {
|
|
global $wgEchoMaxNotificationCount;
|
|
|
|
$data = $this->getRawBundleData( $event, $user, $type );
|
|
|
|
if ( !$data ) {
|
|
return;
|
|
}
|
|
$extra = self::extractExtra( $event->getExtra() );
|
|
|
|
if ( !$this->isTitleSet( $extra ) ) {
|
|
// Link from title is required for bundling notification
|
|
return;
|
|
}
|
|
|
|
$count = 1;
|
|
$linkFrom = array(
|
|
$extra['link-from-page-id'] => true
|
|
);
|
|
foreach ( $data as $row ) {
|
|
$extra = $row->event_extra ? unserialize( $row->event_extra ) : null;
|
|
if ( !$extra ) {
|
|
continue;
|
|
}
|
|
|
|
if ( $this->isTitleSet( $extra ) ) {
|
|
$pageId = $extra['link-from-page-id'];
|
|
|
|
if ( !isset( $linkFrom[$pageId] ) ) {
|
|
$linkFrom[$pageId] = true;
|
|
$count++;
|
|
}
|
|
}
|
|
if ( $count > $wgEchoMaxNotificationCount + 1 ) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
$this->bundleData['link-from-page-other-count'] = $count - 1;
|
|
if ( $count > 1 ) {
|
|
$this->bundleData['use-bundle'] = true;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Internal function to check if link from page id key is set
|
|
* @param $extra array
|
|
* @return bool
|
|
*/
|
|
private function isTitleSet( $extra ) {
|
|
return isset( $extra['link-from-page-id'] ) && $extra['link-from-page-id'];
|
|
}
|
|
|
|
/**
|
|
* @param $event EchoEvent
|
|
* @param $param string
|
|
* @param $message Message
|
|
* @param $user User
|
|
*/
|
|
protected function processParam( $event, $param, $message, $user ) {
|
|
$extra = self::extractExtra( $event->getExtra() );
|
|
switch ( $param ) {
|
|
// 'A' part in this message: link from page A and X others
|
|
case 'link-from-page':
|
|
$content = null;
|
|
if ( $this->isTitleSet( $extra ) ) {
|
|
$title = Title::newFromId( $extra['link-from-page-id'] );
|
|
if ( $title !== null ) {
|
|
$content = $this->formatTitle( $title );
|
|
}
|
|
}
|
|
if ( $content === null ) {
|
|
$content = wfMessage( 'echo-no-title' );
|
|
}
|
|
$message->params( $content );
|
|
break;
|
|
|
|
// example: {7} other page, {99+} other pages
|
|
case 'link-from-page-other-display':
|
|
global $wgEchoMaxNotificationCount;
|
|
|
|
if ( $this->bundleData['link-from-page-other-count'] > $wgEchoMaxNotificationCount ) {
|
|
$message->params(
|
|
wfMessage( 'echo-notification-count' )
|
|
->inLanguage( $user->getOption( 'language' ) )
|
|
->params( $wgEchoMaxNotificationCount )
|
|
->text()
|
|
);
|
|
} else {
|
|
$message->params( $this->bundleData['link-from-page-other-count'] );
|
|
}
|
|
break;
|
|
|
|
// the number used for plural support
|
|
case 'link-from-page-other-count':
|
|
$message->params( $this->bundleData['link-from-page-other-count'] );
|
|
break;
|
|
|
|
default:
|
|
parent::processParam( $event, $param, $message, $user );
|
|
break;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Helper function for getLink()
|
|
*
|
|
* @param EchoEvent $event
|
|
* @param User $user The user receiving the notification
|
|
* @param String $destination The destination type for the link
|
|
* @return Array including target and query parameters
|
|
*/
|
|
protected function getLinkParams( $event, $user, $destination ) {
|
|
$target = null;
|
|
$query = array();
|
|
// Set up link parameters based on the destination (or pass to parent)
|
|
switch ( $destination ) {
|
|
case 'link-from-page':
|
|
if ( $this->bundleData['use-bundle'] ) {
|
|
if ( $event->getTitle() ) {
|
|
$target = SpecialPage::getTitleFor( 'WhatLinksHere', $event->getTitle()->getPrefixedText() );
|
|
}
|
|
} else {
|
|
$extra = self::extractExtra( $event->getExtra() );
|
|
if ( $this->isTitleSet( $extra ) ) {
|
|
$target = Title::newFromId( $extra['link-from-page-id'] );
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
return parent::getLinkParams( $event, $user, $destination );
|
|
}
|
|
return array( $target, $query );
|
|
}
|
|
}
|