Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
82.76% covered (warning)
82.76%
48 / 58
66.67% covered (warning)
66.67%
2 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
SpecialNewsletters
82.76% covered (warning)
82.76%
48 / 58
66.67% covered (warning)
66.67%
2 / 3
9.42
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 execute
76.74% covered (warning)
76.74%
33 / 43
0.00% covered (danger)
0.00%
0 / 1
7.62
 getFormFields
100.00% covered (success)
100.00%
14 / 14
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3namespace MediaWiki\Extension\Newsletter\Specials;
4
5use HTMLForm;
6use MediaWiki\Extension\Newsletter\Specials\Pagers\NewsletterTablePager;
7use 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 */
17class 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}