ЧТМ:Расширения/PersonalWhitelist/SpecialWhitelistedPages.php

Материал из ЧТМ
Перейти к навигации Перейти к поиску
<?php

namespace PersonalWhitelist;

use SpecialPage;
use Title;
use Html;
use MediaWiki\MediaWikiServices;

class SpecialWhitelistedPages extends SpecialPage {

    public function __construct() {
        parent::__construct( 'WhitelistedPages' );
    }

    protected function getGroupName() {
        return 'restriction';
    }

    public function execute( $par ) {
        $this->setHeaders();
        $this->outputHeader();
        $out = $this->getOutput();

        $dbr = wfGetDB( DB_REPLICA );
        $res = $dbr->select(
            [ 'page', 'page_props' ],
            [ 'page_namespace', 'page_title', 'pp_value' ],
            [ 'pp_propname' => 'custom_whitelist' ],
            __METHOD__,
            [ 'ORDER BY' => 'page_namespace, page_title' ],
            [ 'page_props' => [ 'JOIN', 'page_id = pp_page' ] ]
        );

        if ( $res->numRows() === 0 ) {
            $out->addWikiMsg( 'specialpage-empty' );
            return;
        }

        $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
        $html = '<ul>';

        foreach ( $res as $row ) {
            $title = Title::makeTitle( $row->page_namespace, $row->page_title );
            $link = $linkRenderer->makeLink( $title );

            $data = json_decode( $row->pp_value, true );
            $isEnabled = !empty( $data['enabled'] );
            $users = $data['users'] ?? [];
            $level = $data['level'] ?? '';

            if ( $isEnabled ) {
                $status = '<span style="color: green; font-weight: bold;">[Включено]</span>';
            } else {
                $status = '<span style="color: gray;">[Выключено]</span>';
            }

            // Красивый вывод уровня доступа
            if ( $level !== '' ) {
                $msg = wfMessage( "protect-level-{$level}" );
                $levelText = $msg->exists() ? $msg->text() : $level;
            } else {
                $levelText = wfMessage( 'personalwhitelist-level-none' )->text();
            }

            $usersList = empty( $users ) ? '<i>нет участников</i>' : implode( ', ', $users );

            $html .= Html::rawElement( 
                'li', 
                [ 'style' => 'margin-bottom: 5px;' ], 
                "$link $status Уровень: <b>$levelText</b> — Исключения: $usersList" 
            );
        }

        $html .= '</ul>';
        $out->addHTML( $html );
    }
}