Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
82.76% |
48 / 58 |
|
66.67% |
2 / 3 |
CRAP | |
0.00% |
0 / 1 |
SpecialNewsletters | |
82.76% |
48 / 58 |
|
66.67% |
2 / 3 |
9.42 | |
0.00% |
0 / 1 |
__construct | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
execute | |
76.74% |
33 / 43 |
|
0.00% |
0 / 1 |
7.62 | |||
getFormFields | |
100.00% |
14 / 14 |
|
100.00% |
1 / 1 |
1 |
1 | <?php |
2 | |
3 | namespace MediaWiki\Extension\Newsletter\Specials; |
4 | |
5 | use HTMLForm; |
6 | use MediaWiki\Extension\Newsletter\Specials\Pagers\NewsletterTablePager; |
7 | use MediaWiki\SpecialPage\SpecialPage; |
8 | |
9 | /** |
10 | * Implements Special:Newsletter which lists all the newsletters on the wiki. |
11 | * Logged-in users can also filter by subscribed/unsubscribed newsletters and |
12 | * also subscribe and unsubscribe from individual newsletters. |
13 | * |
14 | * @license GPL-2.0-or-later |
15 | * @author Tina Johnson |
16 | */ |
17 | class SpecialNewsletters extends SpecialPage { |
18 | |
19 | /** |
20 | * @var string Filter option for the table - doesn't affect anons |
21 | */ |
22 | private $option; |
23 | |
24 | public function __construct() { |
25 | parent::__construct( 'Newsletters' ); |
26 | } |
27 | |
28 | public function execute( $par ) { |
29 | $this->setHeaders(); |
30 | |
31 | $out = $this->getOutput(); |
32 | $out->addModuleStyles( 'ext.newsletter.newsletters.styles' ); |
33 | $user = $this->getUser(); |
34 | |
35 | $this->addHelpLink( 'Help:Extension:Newsletter' ); |
36 | |
37 | if ( $user->isAllowed( 'newsletter-create' ) ) { |
38 | $createLink = $this->getLinkRenderer()->makeKnownLink( |
39 | SpecialPage::getTitleFor( 'NewsletterCreate' ), |
40 | $this->msg( 'newsletter-subtitlelinks-create' )->text() |
41 | ); |
42 | $out->setSubtitle( $createLink ); |
43 | } |
44 | |
45 | $this->option = $this->getRequest()->getVal( 'filter', 'all' ); |
46 | $filtered = $this->option === 'subscribed' || $this->option === 'unsubscribed'; |
47 | if ( !$filtered ) { |
48 | // Defaults to 'all' if unexpected input was received |
49 | $this->option = 'all'; |
50 | } |
51 | |
52 | $formHtml = ''; |
53 | $introMessage = 'newsletter-list-intro-not-logged-in'; |
54 | if ( $user->isRegistered() ) { |
55 | // Filter form and resource modules needed for logged-in users only |
56 | $out->addModuleStyles( 'ext.newsletter.newsletters.styles' ); |
57 | $out->addModules( 'ext.newsletter.newsletters' ); |
58 | |
59 | $filterForm = HTMLForm::factory( |
60 | 'ooui', |
61 | $this->getFormFields(), |
62 | $this->getContext() |
63 | ); |
64 | $filterForm->setId( 'mw-newsletter-filter-form' ); |
65 | $filterForm->setSubmitID( 'mw-newsletter-filter-submit' ); |
66 | $filterForm->setMethod( 'get' ); |
67 | // Note that submit button is hidden for users with JS enabled in |
68 | // as changing the dropdown menu's option updates the page for them |
69 | $filterForm->setSubmitTextMsg( 'newsletter-list-go-button' ); |
70 | $filterForm->prepareForm(); |
71 | $formHtml = $filterForm->getHTML( false ); |
72 | |
73 | $introMessage = 'newsletter-list-intro'; |
74 | } |
75 | |
76 | $pager = new NewsletterTablePager(); |
77 | $pager->setUserOption( $this->option ); |
78 | if ( $pager->getNumRows() ) { |
79 | $out->addWikiMsg( $introMessage ); |
80 | $out->addHTML( $formHtml ); |
81 | $out->addParserOutput( $pager->getFullOutput() ); |
82 | } elseif ( $filtered ) { |
83 | $out->addWikiMsg( $introMessage ); |
84 | $out->addHTML( $formHtml ); |
85 | $out->addWikiMsg( 'newsletter-list-search-none-found' ); |
86 | } else { |
87 | // No newsletters exist on this wiki so just show an error page without the form |
88 | $out->showErrorPage( 'newsletters', 'newsletter-none-found' ); |
89 | } |
90 | } |
91 | |
92 | private function getFormFields(): array { |
93 | return [ |
94 | 'filter' => [ |
95 | 'id' => 'mw-newsletter-filter-options', |
96 | 'type' => 'select', |
97 | 'name' => 'filter', |
98 | 'label-message' => 'newsletter-list-table', |
99 | 'options' => [ |
100 | $this->msg( 'newsletter-list-option-all' )->escaped() => 'all', |
101 | $this->msg( 'newsletter-list-option-subscribed' )->escaped() => 'subscribed', |
102 | $this->msg( 'newsletter-list-option-unsubscribed' )->escaped() => 'unsubscribed' |
103 | ], |
104 | 'default' => $this->option, |
105 | ], |
106 | ]; |
107 | } |
108 | |
109 | } |