%PDF- %PDF-
| Direktori : /www/varak.net/wiki.varak.net/extensions/MobileFrontend/includes/specials/ |
| Current File : /www/varak.net/wiki.varak.net/extensions/MobileFrontend/includes/specials/SpecialMobileOptions.php |
<?php
use MobileFrontend\Features\IFeature;
/**
* Adds a special page with mobile specific preferences
*/
class SpecialMobileOptions extends MobileSpecialPage {
/** @var Title The title of page to return to after save */
private $returnToTitle;
/** @var boolean $hasDesktopVersion Whether this special page has a desktop version or not */
protected $hasDesktopVersion = true;
/**
* Construct function
*/
public function __construct() {
parent::__construct( 'MobileOptions' );
}
/**
* @return bool
*/
public function doesWrites() {
return true;
}
/**
* Render the special page
* @param string|null $par Parameter submitted as subpage
*/
public function execute( $par = '' ) {
parent::execute( $par );
$context = MobileContext::singleton();
$this->returnToTitle = Title::newFromText( $this->getRequest()->getText( 'returnto' ) );
if ( !$this->returnToTitle ) {
$this->returnToTitle = Title::newMainPage();
}
$this->setHeaders();
$context->setForceMobileView( true );
$context->setContentTransformations( false );
if ( $this->getRequest()->wasPosted() ) {
$this->submitSettingsForm();
} else {
$this->addSettingsForm();
}
}
/**
* Render the settings form (with actual set settings) and add it to the
* output as well as any supporting modules.
*/
private function addSettingsForm() {
$out = $this->getOutput();
$context = MobileContext::singleton();
$user = $this->getUser();
$out->setPageTitle( $this->msg( 'mobile-frontend-main-menu-settings-heading' ) );
$out->enableOOUI();
if ( $this->getRequest()->getCheck( 'success' ) ) {
$out->wrapWikiMsg(
MobileUI::contentElement(
Html::successBox( $this->msg( 'savedprefs' ) )
)
);
}
$fields = [];
$form = new OOUI\FormLayout( [
'method' => 'POST',
'id' => 'mobile-options',
'action' => $this->getPageTitle()->getLocalURL(),
] );
$form->addClasses( [ 'mw-mf-settings' ] );
// beta settings
$isInBeta = $context->isBetaGroupMember();
if ( $this->getMFConfig()->get( 'MFEnableBeta' ) ) {
$input = new OOUI\CheckboxInputWidget( [
'name' => 'enableBeta',
'infusable' => true,
'selected' => $isInBeta,
'id' => 'enable-beta-toggle',
'value' => '1',
] );
$fields[] = new OOUI\FieldLayout(
$input,
[
'label' => new OOUI\LabelWidget( [
'input' => $input,
'label' => new OOUI\HtmlSnippet(
Html::openElement( 'div' ) .
Html::rawElement( 'strong', [],
$this->msg( 'mobile-frontend-settings-beta' )->parse() ) .
Html::rawElement( 'div', [ 'class' => 'option-description' ],
$this->msg( 'mobile-frontend-opt-in-explain' )->parse()
) .
Html::closeElement( 'div' )
)
] ),
'id' => 'beta-field',
]
);
$manager = \MediaWiki\MediaWikiServices::getInstance()
->getService( 'MobileFrontend.FeaturesManager' );
$features = array_diff(
$manager->getAvailable( IFeature::CONFIG_BETA ),
$manager->getAvailable( IFeature::CONFIG_STABLE )
);
$classNames = [ 'mobile-options-beta-feature' ];
if ( $isInBeta ) {
$classNames[] = 'is-enabled';
$icon = 'check';
} else {
$icon = 'lock';
}
/** @var \MobileFrontend\Features\IFeature $feature */
foreach ( $features as $feature ) {
$fields[] = new OOUI\FieldLayout(
new OOUI\IconWidget( [
'icon' => $icon,
'title' => wfMessage( 'mobile-frontend-beta-only' )->text(),
] ),
[
'classes' => $classNames,
'label' => new OOUI\LabelWidget( [
'label' => new OOUI\HtmlSnippet(
Html::rawElement( 'div', [],
Html::element( 'strong', [],
wfMessage( $feature->getNameKey() )->text() ) .
Html::element( 'div', [ 'class' => 'option-description' ],
wfMessage( $feature->getDescriptionKey() )->text() )
)
),
] )
]
);
}
}
$fields[] = new OOUI\ButtonInputWidget( [
'id' => 'mw-mf-settings-save',
'infusable' => true,
'value' => $this->msg( 'mobile-frontend-save-settings' )->text(),
'label' => $this->msg( 'mobile-frontend-save-settings' )->text(),
'flags' => [ 'primary', 'progressive' ],
'type' => 'submit',
] );
if ( $user->isLoggedIn() ) {
$fields[] = new OOUI\HiddenInputWidget( [ 'name' => 'token',
'value' => $user->getEditToken() ] );
}
$feedbackLink = $this->getConfig()->get( 'MFBetaFeedbackLink' );
if ( $feedbackLink && $isInBeta ) {
$fields[] = new OOUI\ButtonWidget( [
'framed' => false,
'href' => $feedbackLink,
'icon' => 'feedback',
'flags' => [
'progressive',
],
'classes' => [ 'mobile-options-feedback' ],
'label' => $this->msg( 'mobile-frontend-send-feedback' )->text(),
] );
}
$form->appendContent(
$fields
);
$out->addHTML( $form );
}
/**
* Saves the settings submitted by the settings form
*/
private function submitSettingsForm() {
$context = MobileContext::singleton();
$request = $this->getRequest();
$user = $this->getUser();
if ( $user->isLoggedIn() && !$user->matchEditToken( $request->getVal( 'token' ) ) ) {
$errorText = __METHOD__ . '(): token mismatch';
wfDebugLog( 'mobile', $errorText );
$this->getOutput()->addHTML( '<div class="error">'
. $this->msg( "mobile-frontend-save-error" )->parse()
. '</div>'
);
$this->addSettingsForm();
return;
}
$group = $request->getBool( 'enableBeta' ) ? 'beta' : '';
$context->setMobileMode( $group );
$url = $this->getPageTitle()->getFullURL( 'success' );
$context->getOutput()->redirect( MobileContext::singleton()->getMobileUrl( $url ) );
}
}