summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/ConfirmEdit/FancyCaptcha/HTMLFancyCaptchaField.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/ConfirmEdit/FancyCaptcha/HTMLFancyCaptchaField.php')
-rw-r--r--www/wiki/extensions/ConfirmEdit/FancyCaptcha/HTMLFancyCaptchaField.php94
1 files changed, 94 insertions, 0 deletions
diff --git a/www/wiki/extensions/ConfirmEdit/FancyCaptcha/HTMLFancyCaptchaField.php b/www/wiki/extensions/ConfirmEdit/FancyCaptcha/HTMLFancyCaptchaField.php
new file mode 100644
index 00000000..52b0da38
--- /dev/null
+++ b/www/wiki/extensions/ConfirmEdit/FancyCaptcha/HTMLFancyCaptchaField.php
@@ -0,0 +1,94 @@
+<?php
+
+/**
+ * Captcha input field for FancyCaptcha that displays a question and returns the answer.
+ * Does not include the captcha ID; that must be included in the form as a separate hidden field.
+ */
+class HTMLFancyCaptchaField extends HTMLFormField {
+ /** @var string */
+ protected $imageUrl;
+
+ /** @var bool */
+ protected $showCreateHelp;
+
+ protected $mClass = 'captcha';
+
+ /**
+ * Apart from normal HTMLFormField parameters, recognizes the following keys:
+ * - 'imageUrl': (string, required) src of the captcha image
+ * - 'showCreateHelp': (bool) show some extra messaging that's only relevant at account creation
+ * @param array $params
+ */
+ public function __construct( array $params ) {
+ parent::__construct( $params );
+ $this->imageUrl = $params['imageUrl'];
+ $this->showCreateHelp = !empty( $params['showCreateHelp'] );
+ }
+
+ public function getInputHTML( $value ) {
+ $out = $this->mParent->getOutput();
+
+ // Uses addModuleStyles so it is loaded even when JS is disabled.
+ $out->addModuleStyles( 'ext.confirmEdit.fancyCaptcha.styles' );
+
+ // Loaded only for clients with JS enabled
+ $out->addModules( 'ext.confirmEdit.fancyCaptcha' );
+
+ $captchaReload = Html::element(
+ 'small',
+ [ 'class' => 'confirmedit-captcha-reload fancycaptcha-reload' ],
+ $this->mParent->msg( 'fancycaptcha-reload-text' )->text()
+ );
+
+ $attribs = [
+ 'type' => 'text',
+ 'id' => $this->mID,
+ 'name' => $this->mName,
+ 'class' => 'mw-ui-input',
+ 'size' => '12', // max_length in captcha.py plus fudge factor
+ 'dir' => $this->mDir,
+ 'autocomplete' => 'off',
+ 'autocorrect' => 'off',
+ 'autocapitalize' => 'off',
+ 'placeholder' => $this->mParent->msg( 'fancycaptcha-imgcaptcha-ph' )->text()
+ ];
+ $attribs += $this->getAttributes( [ 'tabindex', 'required', 'autofocus' ] );
+
+ $html = Html::openElement( 'div', [ 'class' => 'fancycaptcha-captcha-container' ] )
+ . Html::openElement( 'div', [ 'class' => 'fancycaptcha-captcha-and-reload' ] )
+ . Html::openElement( 'div', [ 'class' => 'fancycaptcha-image-container' ] )
+ . Html::element( 'img', [
+ 'class' => 'fancycaptcha-image',
+ 'src' => $this->imageUrl,
+ 'alt' => ''
+ ] ) . $captchaReload . Html::closeElement( 'div' ) . Html::closeElement( 'div' ) . "\n"
+ . Html::element( 'input', $attribs );
+
+ if ( $this->showCreateHelp ) {
+ // use raw element, the message will contain a link
+ $html .= Html::rawElement( 'small', [
+ 'class' => 'mw-createacct-captcha-assisted'
+ ], $this->mParent->msg( 'createacct-imgcaptcha-help' )->parse() );
+ }
+
+ $html .= Html::closeElement( 'div' );
+
+ return $html;
+ }
+
+ public function getLabel() {
+ // slight abuse of what getLabel() should mean; $mLabel is used for the pre-label text
+ // as the actual label is always the same
+ return $this->mParent->msg( 'captcha-label' )->text() . ' '
+ . $this->mParent->msg( 'fancycaptcha-captcha' )->text();
+ }
+
+ public function getLabelHtml( $cellAttributes = [] ) {
+ $labelHtml = parent::getLabelHtml( $cellAttributes );
+ if ( $this->mLabel ) {
+ // use raw element, the message will contain a link
+ $labelHtml = Html::rawElement( 'p', [], $this->mLabel ) . $labelHtml;
+ }
+ return $labelHtml;
+ }
+}